Creo que el título es bastante descriptivo, y aparte, una de las consultas mas frecuentes que recibo.
En muchos casos, mediante formularios o tablas, le pedimos a nuestros usuarios que ingresen una fecha.... y este, como todo humano, puede equivocarse e introducir incorrectamente el dato. Si posteriormente utilizamos esos registros para realizar busquedas o calculos, nuestras funciones y procedimientos arrojarán error al encontrar un dato no válido. Entonces, veamos de que formas podemos evitar equivocaciones.
[+/-] Ver el resto / Ocultar1) La mas sencilla y sin macros:
Utilizando la Validación de Datos: Seleccionemos el rango C1:C5 y nos vamos al menú datos / validación, seleccionando la opcion "Fecha". Se nos presentará el siguiente panorama:
le estamos diciendo a Excel que el rango seleccionado solo soportará fechas. Podemos observar las muchas opciones de configuración que posee desde la lista desplegable.
Para este ejemplo utilizaré los siguientes parámetros:
nuestros usuarios no podrán introducir fechas menores al 01/01/2010 ni mayores al resultado de la funcion HOY(), que es la fecha que posea nuestro sistema.
Al marge de delimitar fechas, la Validación de Datos controla que el formato introducido sea el correcto... si por ejemplo nuestro usuario ingresa: 12//01-2010, le arrojará error y no lo dejará continuar.
Aquí una imagen con el ejemplo en funcionamiento:
noten como al ingresar el 25/04/2010 (fecha superior a HOY() ), Excel no le permite continuar. Recordemos que es factible personalizar el mensaje desde Validación de Datos / Pestaña "Mensaje de Error"
El ejemplo mostrado es muy útil para utilizar en tablas, que ocupan un rango de gran amplitud.
2) Con Macros (controles ActiveX):
Supongamos que poseemos el siguiente formulario, realizado en una planilla:
se los vengo avisando desde el principio... soy muy malo con el diseño.
En la celda correspondiente al ingreso de la fecha, colocaremos un control ActiveX, para que el usuario seleccione una fecha ya preestablecida por Excel, haciendose imposible un error de ingreso. Vamos a un lugar en blanco de la barra de herramientas, click derecho del mouse, y elegimos "cuadro de controles":
Como generalmente por defecto el control no está incluido, lo buscaremos, haciendo click sobre el boton a la derecha del cuadro de controles:
Buscamos hasta encontrar el ítem "Control de Calendario", el cual luego colocaremos en nuestro formulario, de la siguiente forma:
listo.
Ahora hacemos doble click sobre el control calendario y en la ventana de código escribimos lo siguiente:
Private Sub Calendar1_Click() 'le ordeno que en D5 coloque el valor seleccionado en el control: Range("d5").Value = Calendar1.Value End Sub
Si necesitamos validar entre cierto rango de fechas (como en el ejemplo de Validacion de Datos), debemos agregar estas líneas de código. Con la función de VBA DateSerial(año, mes, dia) me aseguro que Excel tome a la fecha como tal:
Private Sub Calendar1_Click() Dim Fecha As Date Fecha = Calendar1.Value If Fecha < DateSerial(2010, 1, 1) Or Fecha > DateSerial(Year(Now), Month(Now), Day(Now)) Then MsgBox "La fecha introducida no es válida", vbCritical Range("d5").ClearContents Else Range("d5").Value = Calendar1.Value End If End Sub
Este control, como practicamente cualquier otro, puede cambiar su posición en la hoja, mediante código. Supongamos ahora que tenemos una tabla, cuya primer columna requiere un dato del tipo fecha. Por esas cosas de la vida (y caprichos varios) decidimos que utilizaremos un control calendario para ingresar el dato a la respectiva celda.
la tabla en cuestión.
Cuando el usuario en cuestión haga click sobre la columna D y por debajo de la segunda fila, deberá aparecer el control calendario. De lo contrario, nada.
Como primer medida, coloco el control calendario en la hoja y luego, desde la ventana de propiedades del objeto, en VBA, pongo a Visible = False:
esto hará que el control no se visualice al abrir la hoja.
Ahora dentro de VBA, nos dirigimos al Explorador de proyectos y hacemos doble click sobre la hoja en donde tenemos la tabla:
Lo realizado en el paso anterior nos abrirá la ventana de código de la hoja, en donde insertaremos las siguientes líneas:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'si la columna del rango seleccionado es igual a 4 y la fila 'mayor a 2, mostramos el calendario. Noten que utilizo las 'propiedades Top y Left de la celda para definir que posición 'tendrá el control en la hoja. Le sumo 20 a cada valor, para 'que se muestre un poco mas abajo y a la derecha de la celda 'seleccionada: If Target.Column = 4 And Target.Row > 2 Then Calendar1.Visible = True Calendar1.Top = Target.Top + 20 Calendar1.Left = Target.Left + 20 Else 'si selecciona cualquier otra celda, oculto el calendario: Calendar1.Visible = False End If End Sub
Y ahora veamos un par de imágenes del ejemplo:
seleccioné D3 (columna 4, fila mayor a 2) y el control calendario se muestra un poco mas abajo y a la derecha de la celda seleccionada
Otra:
Otra:
al posicionarme sobre B5 (columna 2), el control desaparece, tal como lo ordenamos en nuestro código
Luego nos restaría colocar la sentencia para que al hacer click sobre el calendario se complete la fecha... de la siguiente forma:
Private Sub Calendar1_Click() ActiveCell.Value = Calendar1.Value End Sub
Y funciona:
cambié el valor de la celda por el 07/07/2010
Les recomiendo un buen estudio de todas las propiedades de este control, desde su respectiva ventana, en VBA:
desde aqui podremos definir: primer día de la semana, el valor por defecto, si se muestran meses, dias, lineas verticales, estilos y colores de fuente, color de fondo, celda vinculada, etc, etc, etc, logrando una personalización muy específica del control, la cual podremos adaptar a cualquier proyecto.
Bueno estimados, si surgen dudas al respecto, quedo al aguardo de las mismas.
Tengo que validar algunas celdas en la que solo se puedan ingresar fechas con el año en el que esta el sistema. por favor es urgente.. vidoh@hotmail.com
ResponderEliminarestimado: te dejo el link a la entrada que te armé con la solución al planteamiento:
ResponderEliminarhttp://damianexcel.blogspot.com/2010/12/validar-una-celda-que-solo-acepte-el.html
sabes si existe un control activex que además de la fecha tenga la hora y minutos. Gracias caballerol@telefonica.net
ResponderEliminarNo lo conozco, pero sería fácil programar algún código que llene un TextBox con esa data, por ejemplo:
ResponderEliminarTextBox1 = TextBox1.Text = Date & " " & Time
Y listo. Podrías bloquear el control (TextBox1.Locked = True) para que ese dato no sea modificable por el usuario.
Espero que te sirva. Un abrazo y gracias x el mensaje