Descargar el fichero: fechador.xlsm
Fechador contiene una macro que establece la fecha y la hora junto a cierta celda cuando ésta experimenta cambios. Esto se logra manejando los eventos, concretamente el evento Change que detecta cuando se produce un cambio en alguna celda de una hoja. Podemos ejecutar la macro cuando el cambio se produzca en todas las celdas, o bien únicamente en una de ellas, o en un rango, y esto lo conseguimos manejando el target. Veamos cómo se hace.
Hoja 1
Al escribir en cualquier celda de la columna D, y en particular en las celdas verdes, y bajo ellas, al pulsar INTRO, automáticamente se anotará en la celda de la derecha la fecha y hora actuales, siempre que su ordenador esté correctamente puesto en fecha y hora.
Esto se consigue con una pequeña macro que se ha de escribir, no en un Módulo como es habitual al programar macros, sino en la Hoja1. Vea la siguiente imagen. Por cierto, para pasar de un elemento a otro de los de la imagen, o de un módulo a otro, no basta con hacer click con el ratón, se ha de hacer doble click.
Al situarnos dentro del Editor de Visual Basic en la Hoja1, a la derecha aparecerá la posibilidad de manejar dos desplegables. Hemos de elegir "Worksheet" en el de la izquierda y "Change" en le de la derecha.
Código:
Private Sub Worksheet_Change(ByVal Target As Range) Application.MoveAfterReturn = False If Target.Count = 1 Then If (Target.Column = 4 And Target <> 0) Then Target.Offset(0, 1) = Now End If End If End Sub
Hoja 2
Nos situamos ahora en la Hoja 2. En este caso pretendemos que se indique la fecha y la hora de forma automática en la columna E, siempre que se efectúen anotaciones o cambios en cualquier celda del rango B7:D20.
Vamos al Editor de Visual Basic, y en el Explorador de Proyectos nos situamos en la Hoja2. Para ello debemos pulsar doble click sobre la Hoja2, tal y como se muestra en la siguiente imagen.
En este caso la macro cambia ligeramente.
Código:
Private Sub Worksheet_Change(ByVal Target As Range) Application.MoveAfterReturn = False If Target.Count = 1 Then If Not Intersect(Target, Range("B5:D39")) Is Nothing Then Cells(Target.Row, "E") = Now End If End If End Sub
Mi estimado, gracias por la informacion, como podria yo usar esta funcion, con diferentes columnas y diferentes valores?
ResponderEliminarsaludos
Interesante. En inglés lo llaman "record auditing". No se si en Español se podría traducir literalmente como auditoria de registros. Te lo digo porque al leer la entrada lo de fechador me sonaba raro :-)
ResponderEliminarHola Ángel.
ResponderEliminarGracias por la información. Así, si alguien busca mediante un buscador lo de record auditing es posible que llegue a esta entrada.
Hola!
ResponderEliminarTe recomiendo que incluyas esta librería javascript en la plantilla de tu blog para poder formatear códifo fuente en tus post: http://alexgorbatchev.com/SyntaxHighlighter/ Es muy fácil de usar, pero si no tienes tiempo te echo una mano.
Hola Ángel.
ResponderEliminarGracias por el ofrecimiento.
En su día estuve viendo esa página que tiene una pinta estupenda. El código queda genial. La descarté porque pensé que sólo valía para Wordpress y este blog esta en Blogger.
Lo volveré a mirar, y si requiero de tus amables servicios te lo comento.
Da gusto contar con lectores del blog tan animados.
Mil gracias.
Muy buen articulo.
ResponderEliminarEs una instrucción muy interesante sobretodo cuando se utilizan documentos compartidos en red. Se podría añadir también una columna con los datos del usuario que ha realizado la modificación?
Sí, sería interesante una celda "readonly" que automaticamente registra el "username" de las credenciales de la cuenta de Windows que ha iniciado sesión. Creo que en VB se usa esta variable "System.Enviroment.Username"
ResponderEliminarHe includido esta línea en la Hoja 2 dentro del segundo bloque "If" y añade el nombre:
ResponderEliminarCells(Target.Row, "F") = Application.UserName
Es realmente útil para Hojas Excel compartidas.
wuooo muy buena la explicación se entiende muy bien gracias por el aporte
ResponderEliminarSaludos. Como podría que en una celda poner una fecha y que cambie automaticamente el día cada que imprima. Pero que no lo haga si es sábado o domingo hasta el fin de un mes. Gracias.
ResponderEliminarHola el Cells(Target.Row, "F") = Application.UserName no me sirve queda en un loop :S
ResponderEliminarHola, como puedo hacer para que me indique cual celda o por lo menos el numero de columna.
ResponderEliminarGracias
Que tal, quisiera saber si existe la posibilidad de aplicar esta fórmula para que coloque la hora en cada linea cuando se copian varias celdas de información. Para hacer una carga masiva de datos. Saludos!
ResponderEliminarMuchas gracias, por la información a mi lo que me interesaría es un código similar pero que en vez de introducir yo directamente el dato en la celda sea por medio de una fórmula y que se actualice la información de manera automática.
ResponderEliminarexcelente, de tanto buscar encontre la solucion a mi problema. saludos
ResponderEliminarmuy buena, quien me puede decir como usar este codigo para que se autocomeplete con fecha y hora cuando modifiquen 3 diferentes columnas dentro de una misma hoja de excel
ResponderEliminarCOMO SE HACE PARA QUE CUANDO LA CELDA ESTE VACIA LA CELDA EN REFERENCIA NO DEVUELVA DATO DE HORA O NO QUEDE GRABADO EL ANTERIOR
ResponderEliminarCOMO SE HACE PARA QUE CUANDO LA CELDA ESTE VACIA LA CELDA EN REFERENCIA NO DEVUELVA DATO DE HORA O NO QUEDE GRABADO EL ANTERIOR
ResponderEliminarMuy buena y útil, la macro. Gracias. ¿Cómo he de hacer para que me funcione si tengo la hoja protegida?. Sale el error 1004.
ResponderEliminarSaludos.
COMO SE HACE PARA QUE CUANDO LA CELDA ESTE VACÍA LA CELDA EN REFERENCIA NO DEVUELVA EL ANTERIOR...
ResponderEliminarComo puedo utilizar esta función si la celda se modifica conforme a formula
ResponderEliminarhola como puedo hacer para colocar la fecha de en la entradas automático y las salidas automático, en diferente eldas.
ResponderEliminarhola como puedo hacer para colocar la fecha de en la entradas automático y las salidas automático, en diferente eldas.
ResponderEliminar¿ Mi pregunta como puedo modificar esta macro, t.Count = 1 Then
ResponderEliminarIf Not Intersect(Target, Range("B5:D39")) Is Nothing Then
Cells(Target.Row, "E") = Now
End If
End If
End Sub
para colocar la fecha de entrada y de salas automático.
Por compartir tus conocimientos de forma desinteresada; Dios te bendiga y aumente tu conocimiento.
ResponderEliminarHola Adolfo, una macro genial y muy útil para documentos compartidos y de actualización pediodica. Veo que no funciona al modificar varias celdas al mismo tiempo, no funcionaría en una entrada masiva de datos con un copy/paste y sería una mejora extraordinaria ¿Algún consejo?
ResponderEliminarMuchas gracias y te transmito que tienes en mi a un "fosforo incondicional" desde hace mucho tiempo.
P.D.: Fosforo=Forofo.