Hojas de cálculo en Excel - página principal

Fecha de creación, modificación, último acceso de un fichero, y peso en Kbytes

Hace poco, un usuario dejaba un comentario en el blog, preguntando si era posible obtener la fecha de creación de un fichero excel, para implementarla dentro del propio fichero. Algo así como la función =HOY(), pero sin que variase a la hora de abrir el fichero, pues al abrir el libro en cuestión, automáticamente se actualizaría la fecha, poniendo la fecha del día en curso.

Como esta utilidad puede servirle a más de uno, y como me he acordado del preciado objeto FileSystemObject (ahora veréis que es, si es que no lo habéis visto ya en algún que otro artículo de este blog), vamos a dar respuesta a las inquietudes de ese lector.

El objeto FileSystemObject (en adelante lo llamaremos FSO), nos permite operar con ficheros. No es algo que debamos añadir (ningún complemento, ningún ActiveX, ...nada de esas cosas). El objeto FSO lo tenemos todos :-)

El objeto FSO nos permite leer, escribir, borrar, copiar, etc., determinados ficheros y carpetas (directorios). Tiene sus ventajas, pero también sus riesgos, si este objeto es utilizado por gente irresponsable. ¿Qué riesgos?. Vamos a dejarlo ahí, ...si no te has dado cuenta de lo que quiero decir, es que no has leído bien este párrafo :-)

Vamos al grano. ¿Podemos saber la fecha de creación de un fichero excel?. Por supuestísimo. Pero no solo eso, además, podemos saber la fecha de la última modificación de un fichero excel, y la fecha del último acceso a un fichero excel (si ejecutamos esto en el fichero abierto, aparentemente, la fecha de último acceso será la de hoy y ahora, pero Excel devuelve la fecha inmediatamente anterior a la de hoy, es decir, el último acceso sin contar el de hoy, a no ser que grabes los cambios, cierres y abras una segunda vez el fichero en el mismo día), aunque no lo hayamos modificado (si lo hemos abierto para chafardear su contenido). ¿Qué te parece?. ¿Mola saber todo eso, eh?. Pues hala, como postre, también averiguaremos cuanto pesa el fichero en Kbytes.

Copiaremos este macro dentro de ThisWorkbook (no dentro de un Módulo, sino dentro de ThisWorkbook), tal y como se muestra en la siguiente imagen:


El macro en cuestión es este (debe mantenerse ese nombre, pues se ejecuta en el momento de abrirse el fichero, a través del evento open):


Private Sub Workbook_Open()
'Si hay errores, que continúe
On Error Resume Next
'pasamos la ruta y el nombre del
'fichero activo, a una variable

fichero_y_ruta = ActiveWorkbook.Path & "\" & ActiveWorkbook.Name
'Creamos el objeto FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
'seleccionamos el libro activo
Set archivo = fso.GetFile(fichero_y_ruta)
'vamos a ver los datos que necesitamos
fecha_creacion = archivo.DateCreated
fecha_modificacion = archivo.DateLastModified
fecha_ultimo_acceso = archivo.DateLastAccessed
'pasaremos su tamaño de bytes a Kbytes,
'para lo cual, lo dividimos entre 1024

tamano_fichero = archivo.Size / 1024
'Si no hemos guardado previamente el fichero,
'nos dará error nº 424, por lo que tendremos
'esto en cuenta

If Err.Number <> 424 Then
Range("A1") = "Fecha de creación del fichero: " & fecha_creacion
Range("A2") = "Fecha de la última modificación del fichero: " & fecha_modificacion
Range("A3") = "Fecha del último acceso al fichero: " & FormatDateTime(fecha_ultimo_acceso, vbShortDate)
Range("A4") = "Tamaño del fichero: " & tamano_fichero & " Kb"
Else
Range("A1") = "Fecha de creación del fichero: n.d."
Range("A2") = "Fecha de la última modificación del fichero: n.d."
Range("A3") = "Fecha del último acceso al fichero: n.d."
Range("A4") = "Tamaño del fichero: n.d."
End If
'limpiamos los objetos
Set fso = Nothing
Set archivo = Nothing
End Sub

¿Que es lo que vamos a conseguir con este macro?. Pues vamos a escribir en las celdas que van desde A1 a A4, los siguientes datos:
  • La fecha de creación del fichero: Este dato nos saldrá por defecto con formato dd/mm/aaaa hh:mm:ss, es decir, nos saldrá la fecha, y al lado la hora, en la que se creó el fichero (se crea cuando se guarda por primera vez). Si en tu formato regional tienes indicado mm/dd/aaaa, entonces te lo mostrará así, invirtiendo día y mes.

  • La fecha de la última modificación del fichero: Este dato nos saldrá por defecto con formato dd/mm/aaaa hh:mm:ss, es decir, nos saldrá la fecha, y al lado la hora, en la que por última vez se modificó el fichero. Si en tu formato regional tienes indicado mm/dd/aaaa, entonces te lo mostrará así, invirtiendo día y mes.

  • La fecha del último acceso: Este dato nos saldrá por defecto con formato dd/mm/aaaa, es decir, nos saldrá la fecha, pero sin la hora al lado. Si en tu formato regional tienes indicado mm/dd/aaaa, entonces te lo mostrará así, invirtiendo día y mes.

  • Tamaño del fichero: Este dato nos saldrá en Kbytes.


Si deseamos que tanto la fecha de creación, como la fecha de modificación nos salgan con el formato dd/mm/aaaa, pero sin la hora, entonces nos bastará cambiar estas líneas del macro:

Range("A1") = "Fecha de creación del fichero: " & fecha_creacion
Range("A2") = "Fecha de la última modificación del fichero: " & fecha_modificacion

Por estas otras:

Range("A1") = "Fecha de creación del fichero: " & FormatDateTime(fecha_creacion, vbShortDate)
Range("A2") = "Fecha de la última modificación del fichero: " & FormatDateTime(fecha_modificacion, vbShortDate)

O si lo deseamos, por estas otras, que hacen exactamente lo mismo:

Range("A1") = "Fecha de creación del fichero: " & FormatDateTime(fecha_creacion, 2)
Range("A2") = "Fecha de la última modificación del fichero: " & FormatDateTime(fecha_modificacion, 2)

Si en lugar de un macro, queréis crearos vuestras propias funciones personalizadas, entonces bastará con copiar estas cuatro funciones en un módulo VBA (no en ThisWokbook, sino en un módulo). He variado ligeramente el mensaje que muestra, para que veáis la diferencia con el macro.

La función para determinar la fecha de creación del fichero será esta:

Function fechadecreacion()
'Si hay errores, que continúe
On Error Resume Next
'pasamos la ruta y el nombre del
'fichero activo, a una variable

fichero_y_ruta = ActiveWorkbook.Path & "\" & ActiveWorkbook.Name
'Creamos el objeto FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
'seleccionamos el libro activo
Set archivo = fso.GetFile(fichero_y_ruta)
'vamos a ver los datos que necesitamos
fecha_creacion = archivo.DateCreated
'Si no hemos guardado previamente el fichero,
'nos dará error nº 424, por lo que tendremos
'esto en cuenta

If Err.Number <> 424 Then
fecha = "Creado el " & FormatDateTime(fecha_creacion, vbShortDate)
Else
fecha = "Fichero sin guardar"
End If
'limpiamos los objetos
Set fso = Nothing
Set archivo = Nothing
'ponemos el dato en la celda activa
fechadecreacion = fecha
End Function

La función para determinar la última fecha de modificación del fichero, será esta:

Function fechadelaultimamodificacion()
'Si hay errores, que continúe
On Error Resume Next
'pasamos la ruta y el nombre del
'fichero activo, a una variable

fichero_y_ruta = ActiveWorkbook.Path & "\" & ActiveWorkbook.Name
'Creamos el objeto FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
'seleccionamos el libro activo
Set archivo = fso.GetFile(fichero_y_ruta)
'vamos a ver los datos que necesitamos
fecha_modificacion = archivo.DateLastModified
'Si no hemos guardado previamente el fichero,
'nos dará error nº 424, por lo que tendremos
'esto en cuenta

If Err.Number <> 424 Then
fecha = "Modificado el " & FormatDateTime(fecha_modificacion, vbShortDate)
Else
fecha = "Fichero sin guardar"
End If
'limpiamos los objetos
Set fso = Nothing
Set archivo = Nothing
'ponemos el dato en la celda activa
fechadelaultimamodificacion = fecha
End Function

La función para determinar la fecha del último acceso al fichero, será esta:

Function fechadelultimoacceso()
'Si hay errores, que continúe
On Error Resume Next
'pasamos la ruta y el nombre del
'fichero activo, a una variable

fichero_y_ruta = ActiveWorkbook.Path & "\" & ActiveWorkbook.Name
'Creamos el objeto FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
'seleccionamos el libro activo
Set archivo = fso.GetFile(fichero_y_ruta)
'vamos a ver los datos que necesitamos
fecha_ultimo_acceso = archivo.DateLastAccessed
'Si no hemos guardado previamente el fichero,
'nos dará error nº 424, por lo que tendremos
'esto en cuenta

If Err.Number <> 424 Then
fecha = "Último acceso el " & FormatDateTime(fecha_ultimo_acceso, vbShortDate)
Else
fecha = "Fichero sin guardar"
End If
'limpiamos los objetos
Set fso = Nothing
Set archivo = Nothing
'ponemos el dato en la celda activa
fechadelultimoacceso = fecha
End Function

La función para determinar el tamaño en Kbytes del fichero, será esta:

Function pesodelfichero()
'Si hay errores, que continúe
On Error Resume Next
'pasamos la ruta y el nombre del
'fichero activo, a una variable

fichero_y_ruta = ActiveWorkbook.Path & "\" & ActiveWorkbook.Name
'Creamos el objeto FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
'seleccionamos el libro activo
Set archivo = fso.GetFile(fichero_y_ruta)
'vamos a ver los datos que necesitamos
tamano_fichero = archivo.Size / 1024
'Si no hemos guardado previamente el fichero,
'nos dará error nº 424, por lo que tendremos
'esto en cuenta

If Err.Number <> 424 Then
peso = "Tamaño del fichero: " & tamano_fichero & " Kb"
Else
peso = "Fichero sin guardar"
End If
'limpiamos los objetos
Set fso = Nothing
Set archivo = Nothing
'ponemos el dato en la celda activa
pesodelfichero = peso
End Function

Y llamaremos a las funciones desde cualquier celda, así:

=fechadecreacion()


=fechadelaultimamodificacion()


=fechadelultimoacceso()


=pesodelfichero()

Si deseáis que estas funciones personalizadas estén disponibles para cualquier libro de Excel, sin necesidad de incorporarlas expresamente al libro en cuestión, entonces tendréis que echarle un vistazo al artículo donde hablo del libro de macros personal.

Aquí os dejo un pantallazo, con el resultado de aplicar el macro en el evento open, y las cuatro funciones personalizadas que hemos visto a lo largo de este artículo:



17 comentarios:

Anónimo dijo...

Excelente artículo, era lo que estaba buscando.

Leonard dijo...

Muuuuy bueno, si señor. He estado mirando un montón de artículos, pero en español no había muchos que hablasen de esta macro, y mucho menos con tanto detalle!
Gracias! :)

rodrigo dijo...

te pasaste me sirvio demasiado este articulo en conjunto con otro que hace referencia a las modificaciones de una celda se te agradece tus aportes

juan jose dijo...

Muchas gracias, me biene fenomenal.

Una pregunta:
¿Hay alguna manera para ver quien ha echo modificaciones de un archivo y cuando?

Anónimo dijo...

Muy claro y muy interesante, pero cuándo la utilizo siempre me sale la fecha de hoy, donde puede estar el problema?

sadid dijo...

tengo un problema, y es que necesito alistar los archivos de excel que tengo en una determinada carpeta, hasta hay todo bien con un codigo que estaba aqui que es superbueno, mi segundo problema una vez alla alistado los archivos de excel, necesito que me arroje la informacion de esos archivos en especial de dos celas en especifia pueden ser de a1 y b1. y no se como hacer este segundo, me gustaria mucho que me ayudaran gracias.....saludos desde bogota colombia.

Anónimo dijo...

excelente

julian dijo...

Gracias por tu gran aportación, empero me gustaría saber si es posible modificar la fecha de modificación de un fichero por código y es que tengo como 700 ficheros por modificar con fechas variables desde Mayo a la fecha. U otra es la de cambiar la fecha de la máquina por código.

Saludos y gracias

malvamont dijo...

eHola que tal, primero que nada quiero felicitarte y agradecerte por tus aportes eh leido algunos y son bastante buenos y entendibles, me gustaria ver si me puedes apoyar y asesorar en unas cuestiones tengo un formulario donde guardo algunos campos en excel, me gustaria saber si esxiste la manera de que al darle click al boton registrar me guarde la fecha de creacion del archivo y el nombre del equipo, y si despues se quieren hacer cambios en el registro guarde en otra celda la fecha de modificacion y el nombre del equipo y asi sucesivamente sin importar las veces que se modifique el archivo, espero puedas ayudarme o darme una idea de como poder hacerlo, desde ya muchas gracias!! Saludos...

Javier Marco dijo...

Quizás te sea de ayuda, tanto el artículo que has leído, como este otro: controlar cambios en ficheros compartidos.

Saludos.

malvamont dijo...

Hola que tal, muchas gracias por responder a mi peticion, te comento que eh leido y puesto en marcha el codigo del articulo "controlar cambios en ficheros compartidos" sin obtener algun cambio,meto el codigo tal cual en el modulo y no pasa nada ya puse visible la hoja 3 y no muetra los datos, espero puedas seguirme ayudando, de ante mano muchas gracias!!
Saludos

Javier Marco dijo...

Bájate el ejemplo y verás como funciona :-)

malvamont dijo...

Es lo que intente pero no lo encuentro por ningun lado!!!

Javier Marco dijo...

Malvamont, había un error (cosa de las prisas). No debes grabar ese código en un módulo sino en ThisWorkbook (lo he corregido en el artículo).

Pruébalo, y verás como la hoja3 está invisible, pero almacena el nombre del usuario y la hora en la que se han realizado los cambios (para ello deberás grabar el fichero, porque si no lo guardas, no hay cambios).

Para ver lo que se ha grabado en la hoja3, deberás hacerla visible desde VBA, seleccionando en la propiedad Visible, esto: xlSheetVisible

malvamont dijo...

No te preocupes suele pasar, y efectivamente ya me hace los cambios, muchisimas gracias son muy valiosos tus aportes y explicaciones y nuevamente te felicito por tu sitio!!!

patton dijo...

por que no resulta pegar en codigo en office 2007? porque en office 2003 resulta

Sergio Manuel Frias dijo...

Hola Qué tal muchas gracias por responder nuestras dudas :)
Tuve un problema pequeño.
Supongamos que el archivo tiene la funcion creada y al día siguiente hago una copia, cuando abro esta última no me copia la fecha de creación :(
Puede ser que no funcione si creo una copia del archivo con otra fecha?
Ojalá puedas responder mi duda :) Muchas gracias de antemano :)