domingo, 11 de diciembre de 2011

Fechador: Establece la fecha automaticamente al cambiar un dato

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

9 comentarios:

Yo Merititito dijo...

Mi estimado, gracias por la informacion, como podria yo usar esta funcion, con diferentes columnas y diferentes valores?

saludos

Ángel dijo...

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 :-)

Adolfo Aparicio dijo...

Hola Ángel.

Gracias por la información. Así, si alguien busca mediante un buscador lo de record auditing es posible que llegue a esta entrada.

Ángel dijo...

Hola!

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

Adolfo Aparicio dijo...

Hola Ángel.

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

Cursos de Informática dijo...

Muy buen articulo.
Es 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?

Ángel dijo...

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"

Ángel dijo...

He includido esta línea en la Hoja 2 dentro del segundo bloque "If" y añade el nombre:

Cells(Target.Row, "F") = Application.UserName

Es realmente útil para Hojas Excel compartidas.

mauricio dijo...

wuooo muy buena la explicación se entiende muy bien gracias por el aporte