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 SubSaludos.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