Permitir solo determinado formato en celdas

Solicitando nuevamente te ayuda.

Como podría hacer para que en una hoja de Excel llamada Datos, la columna A (Consecutivo) acepte solo números; la columna B (Descripción) acepte solo texto y por ultimo la columna C (Fecha) solo fechas.

Ademas si al cambiar de fila o columna, está vacía alguna columna de ese registro A, B o C, muestre un mensaje indicando el faltante.

1 Respuesta

Respuesta
1

Antes de copiar la macro revisa que la información en las columnas A, B, C esté completa, y deja por lo menos, 3 ó 4 datos en blanco para que hagas tus pruebas.

Sigue las Instrucciones para poner la macro en worksheet
1. Abre tu hoja de excel
2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
4. Del lado derecho copia la macro

Private Sub Worksheet_Change(ByVal Target As Range)
'valida datos
'por.dam
If Not Intersect(Target, Columns("A:A")) Is Nothing Then
    If Not IsNumeric(Target.Value) Then
        Application.EnableEvents = False
        MsgBox "Columna A, sólo acepta números", vbCritical, "VALIDACIÓN"
        Range(Target.Address).Select
        Target.Value = ""
        Application.EnableEvents = True
    End If
End If
If Not Intersect(Target, Columns("B")) Is Nothing Then
    If IsNumeric(Target.Value) Then
        Application.EnableEvents = False
        MsgBox "Columna B, sólo acepta Texto", vbCritical, "VALIDACIÓN"
        Range(Target.Address).Select
        Target.Value = ""
        Application.EnableEvents = True
    End If
End If
If Not Intersect(Target, Columns("C")) Is Nothing Then
    If Not IsDate(Target.Value) Then
        Application.EnableEvents = False
        MsgBox "Columna C, sólo acepta Fechas", vbCritical, "VALIDACIÓN"
        Range(Target.Address).Select
        Target.Value = ""
        Application.EnableEvents = True
    End If
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'valida datos
'por.dam
Application.EnableEvents = False
falta = 0
ua = Range("A" & Rows.Count).End(xlUp).Row
ub = Range("B" & Rows.Count).End(xlUp).Row
uc = Range("C" & Rows.Count).End(xlUp).Row
If ua >= ub Then
    uf = ua
Else
    If ub >= uc Then
        uf = ub
    Else
        uf = uc
    End If
End If
For i = 1 To uf
    If Range("A" & i) = "" Then
        Range("A" & i).Select
        MsgBox "Falta dato en la celda A" & i, vbCritical, "VALIDACIÓN"
        falta = 1
    End If
    If Range("B" & i) = "" Then
        Range("B" & i).Select
        MsgBox "Falta dato en la celda B" & i, vbCritical, "VALIDACIÓN"
        falta = 1
    End If
    If Range("C" & i) = "" Then
        Range("C" & i).Select
        MsgBox "Falta dato en la celda C" & i, vbCritical, "VALIDACIÓN"
        falta = 1
    End If
Next
If falta = 0 Then
    If Target.Row > uf Then
        Range("A" & i).Select
        MsgBox "Falta dato en la celda A" & i, vbCritical, "VALIDACIÓN"
     End If
End If
Application.EnableEvents = True
End Sub

Saludos.Dam
Si es lo que necesitas.

Buenas
noches Dam, antes que nada gracias por tan rápida respuesta.
Probé como dijiste el código que me enviaste.

Esta excelente, pero arroja demasiados mensajes y no permite ingresar datos hasta que se ingresan los de la columna C.

Si ingreso el consecutivo en la columna A, se cambia a la columna B y sale el
mensaje “falta dato en la columna B”, le doy aceptar pero se cambia a la
columna C y no me permite agregar el dato en la columna B, al entrar a la
columna C y vuelve a mostrar el mensaje “falta dato en la columna C”. Ingreso
la fecha y me muestra nuevamente el mensaje “falta dato en la columna B”. Ingreso
la descripción me muestra el mensaje “falta dato en la columna A11”, siendo el
ultimo dato la fila 10.

Ignoro si es posible hacer lo siguiente: si después de ingresar el consecutivo
(columna A), el cursor se cambie a la columna B y me permita ingresar datos, y
posteriormente se cambie a la columna C e ingresar datos. Y si llegara a faltar
un dato muestre el mensaje con el faltante de la columna/fila.
Saludos cordiales,
Raul

Te cambio la macro. Prueba y me comentas

Private Sub Worksheet_Change(ByVal Target As Range)
'valida datos
'por.dam
If Not Intersect(Target, Columns("A:A")) Is Nothing Then
    Application.EnableEvents = False
    If Not IsNumeric(Target.Value) Then
        MsgBox "Columna A, sólo acepta números", vbCritical, "VALIDACIÓN"
        Range(Target.Address).Select
        Target.Value = ""
    Else
        Cells(Target.Row, "B").Select
    End If
    Application.EnableEvents = True
End If
If Not Intersect(Target, Columns("B")) Is Nothing Then
    Application.EnableEvents = False
    If IsNumeric(Target.Value) Then
        MsgBox "Columna B, sólo acepta Texto", vbCritical, "VALIDACIÓN"
        Range(Target.Address).Select
        Target.Value = ""
    Else
        Cells(Target.Row, "C").Select
    End If
    Application.EnableEvents = True
End If
If Not Intersect(Target, Columns("C")) Is Nothing Then
    Application.EnableEvents = False
    If Not IsDate(Target.Value) Then
        MsgBox "Columna C, sólo acepta Fechas", vbCritical, "VALIDACIÓN"
        Range(Target.Address).Select
        Target.Value = ""
    Else
        Cells(Target.Row + 1, "A").Select
    End If
    Application.EnableEvents = True
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'valida datos
'por.dam
Application.EnableEvents = False
falta = 0
ua = Range("A" & Rows.Count).End(xlUp).Row
ub = Range("B" & Rows.Count).End(xlUp).Row
uc = Range("C" & Rows.Count).End(xlUp).Row
If ua >= ub Then
    uf = ua
Else
    If ub >= uc Then
        uf = ub
    Else
        uf = uc
    End If
End If
For i = 1 To uf
    If Range("A" & i) = "" Then
        If ActiveCell.Address <> Range("A" & i).Address Then
            Range("A" & i).Select
            MsgBox "Falta dato en la celda A" & i, vbCritical, "VALIDACIÓN"
            falta = 1
        Else
            falta = 1
        End If
    Else
        If Range("B" & i) = "" Then
            If ActiveCell.Address <> Range("B" & i).Address Then
                If ActiveCell.Address <> Range("A" & i).Address Then
                    Range("B" & i).Select
                    MsgBox "Falta dato en la celda B" & i, vbCritical, "VALIDACIÓN"
                    falta = 1
                End If
            End If
        Else
            If Range("C" & i) = "" Then
                If ActiveCell.Address <> Range("C" & i).Address Then
                    If ActiveCell.Address <> Range("B" & i).Address Then
                        If ActiveCell.Address <> Range("A" & i).Address Then
                            Range("C" & i).Select
                            MsgBox "Falta dato en la celda C" & i, vbCritical, "VALIDACIÓN"
                            falta = 1
                        End If
                    End If
                Else
                    falta = 1
                End If
            End If
        End If
    End If
Next
If falta = 0 Then
    If Target.Row > uf + 1 Then
        If ActiveCell.Address <> Range("A" & i).Address Then
            Range("A" & i).Select
            MsgBox "Falta dato en la celda A " & i, vbCritical, "VALIDACIÓN"
        End If
    Else
        If Cells(ActiveCell.Row, "A") = "" Then
            Cells(ActiveCell.Row, "A").Select
        End If
    End If
End If
Application.EnableEvents = True
End Sub

Saludos.Dam
Si es lo que necesitas.

Buenos días Dam, molestándote nuevamente, probé el nuevo código que me enviaste, tiene
unos inconvenientes y son los siguientes:


Si ingreso una fecha en la columna A (Consecutivo), muestra el mensaje “Columna A,
sólo acepta números", al tratar de corregir, ingreso un numero, pero este número
sale con formato de fecha, y muestra nuevamente el mensaje “Columna A, sólo acepta números”. Tengo que cambiar manualmente el formato de la celda, para que acepte
el ingreso de número.


Si ingreso un número en la columna B (Descripción), muestra el mensaje “Columa B,
sólo acepta texto”, esto esta Ok, pero si ingreso una fecha si la acepta, y con esto se pierde la validación.


Si ingreso un número en la columna C (Fecha), no muestra ningún mensaje, es decir
acepta el número, por ejemplo si ingreso el número 1, pone la fecha 01/01/1900, con lo que se pierde la validación.


Dam, dándote nuevamente las gracias anticipadas por tu atención
Raul.

Te voy a pedir un gran favor, la macro para validar y verificar dónde faltan números funciona correctamente, y eso es la petición original a esta pregunta.

Los formatos de fecha no los establece la macro, eso los pone la hoja de cálculo, para cambiarlos, podrías finalizar esta pegunta y crear una nueva para cada petición que necesitas

Dam, Muchas gracias por tu ayuda, tus conocimientos son de gran ayuda para los inexpertos. Continuare siempre y cuando tu lo aceptes solicitando tus conocimientos informáticos son de gran ayuda para los inexpertos. Se agradece tu ayuda.

Raul

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas