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
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
- Compartir respuesta