He recibido una muy buena consulta. Mi lector usa una notebook, la cual (y como la gran mayoría de estos dispositivos) no tiene un teclado numérico aparte, si no que se encuentra sobre los caracteres alfabéticos. Ya sabemos lo incómodo que es tipear números en una notebook, pero si hablamos de fechas se torna aún peor, ya que deberemos también presionar Shift y / para separar los días, meses y años.
La pregunta es: ¿puedo ingresar la los números y que Excel lo convierta automaticamente en una fecha?
Una de las formas mas sencillas de resolver esto sería mediante la anidación de un par de funciones: Fecha(), Izquierda(), Extrae() e Izquierda(), como se muestra en la siguiente imagen:
[+/-] Ver el resto / Ocultar
En la primer columna tengo un número entero: 120174 que sería el 12 de enero de 1974, pero sin los caracteres que dividen los dias, meses y años (generalmente la " / " o el " - "). En la columna B "armé" la fecha con la función que describo en la columna C: como verán, no ofrece mayores misterios: dentro de =Fecha(año, mes, dia) anido las funciones que "cortan" los datos de la columna A, convirtiéndolas en números válidos para formar una fecha.
Si bien a priori logramos una solución, no creo que sea la ideal. Si esta base de datos tuviese, por ejemplo, 57843 registros, seguramente Excel se pondría demasiado lento al recalcular. Y otro punto en contra: la utilización de una columna auxiliar. Pero en proyectos pequeños o que manejen cantidades reducidas de datos, lo considero una salida viable.
Vamos ahora con las macros, ya que nos permitirán ingresar el valor y convertirlo a fecha en la misma celda, teniendo a nuestro alcance niveles mas profundos de control. Al ejemplo anterior se le podría aplicar la validación de datos, pero no es suficiente.
Y tema acá pasa, a la vez, por lograr que si escribo en A1 la cifra 19082011 la macro se encargue de convertir ese valor en 19/08/2011, en la misma celda y sin la necesidad de recurrir a celdas auxiliares.
En un principio parece muy fácil (y no es "difícil"), pero hay que tener en cuenta varios factores, para evitar que se produzcan errores, los cuales se irán analizando de a uno.
No es mucho código y el mismo se encuentra correctamente comentado:
Private Sub Worksheet_Change(ByVal Target As Range)
'variables de uso local
Dim Año, Mes, Dia As String
Dim Fecha As Date
'primero evalúo si la celda modificada se encuentra
'dentro del rango "fechas". esto se logra con
'Intersect, pasando como argumentos los rangos invo
'lucrados:
If Intersect(Target, Range("fechas")) Is Nothing Then
Exit Sub
End If
'quito el recalculo automático de Excel
Application.Calculation = xlCalculationManual
'a la celda le doy formato General, para evitar
'el error de "desbordamiento"
Target.NumberFormat = "General"
'si colocaron una fecha, vacío la celda:
If IsDate(Target.Value) Then Target.Value = ""
'solo dejo que se seleccione de a una celda. esto lo logro
'controlando la cantidad de filas y columnas de la selección:
'si es mayor a 1 (cualquiera de las dos) abandono el
'procedimiento:
If Target.Rows.Count > 1 Or Target.Columns.Count > 1 Then Exit Sub
'seguimos controlando:
'si la celda posee algún valor:
If Target.Value <> "" Then
'si ese valor es numérico:
If IsNumeric(Target.Value) Then
'si ese número tiene una longitud de 8 digitos
'(ddmmyyyy)
If Len(Target.Value) = 8 Then
'particiono el dato:
Año = Right(Target.Value, 4)
Mes = Mid(Target.Value, 3, 2)
Dia = Left(Target.Value, 2)
'armo la fecha
Fecha = DateSerial(Año, Mes, Dia)
'quito los eventos de la aplicación:
Application.EnableEvents = False
'asigno la fecha a la celda
Target.Value = Fecha
'habilito los eventos
Application.EnableEvents = True
End If
End If
End If
'y vuelvo al cálculo automático
Application.Calculation = xlCalculationAutomatic
End Sub
Debería agregar a este blog vídeos, para que así puedan apreciar mejor como los números se convierten automáticamente en fechas.... pero bueno, lo dejamos para mas adelante. Por ahora: aquí tienen una imagen:
Y
el link al archivo.
Mucha suerte y cualquier duda la tratamos.
Comentarios
Publicar un comentario