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

Compactar una base de datos Access, desde Excel

Andrés, un lector del blog, me preguntaba el otro día -al hilo del artículo en el cual explicaba como importar desde excel y mediante un macro, los datos existentes de una tabla de Acess-, si era posible compactar una base de datos, directamente desde Excel. Yo intuía que sí se podía, pues eso mismo lo venía haciendo desde una página asp (active server page) atacando a una base de datos Access, así que suponía que con tan solo modificar algo el código, en teoría se debería poder hacer también desde Excel.

Y efectivamente así fue. Modifiqué el código ligeramente, y alehop!, desde excel podemos compactar una base de datos access, sin necesidad de abrir ni tan siquiera esa base de datos. Esta operación de compactación, la realizaremos mediante un sencillo código que incluiremos en un macro.

En el siguiente ejemplo, vamos a compactar una base de datos Access existente en una unidad F (en mi caso, la unidad F, corresponde a una llave USB), y dentro de una carpeta llamada hojas-de-calculo-en-excel (el nombre de este blog:


Sub compactar_base_de_datos()
'Si hay errores, que continúe
On Error Resume Next
'definimos la ruta y el nombre de la base de datos
ruta = "F:\hojas-de-calculo-en-excel\"
base = ruta & "base-de-datos.mdb"
'creamos el objeto FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
'si hemos informado de la base de datos...
If fso.FileExists(base) Then
'creamos el objeto JetEngine
Set oje = CreateObject("JRO.JetEngine")
'compactamos la base de datos,
'con una copia de respaldo

oje.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
base, "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ruta & _
"base_temporal.mdb"
'copiamos reemplazando y borramos
'la copia de la base de datos

fso.CopyFile ruta & "base_temporal.mdb", base
fso.DeleteFile (ruta & "base_temporal.mdb")
'eliminamos el objeto
Set oje = Nothing
'creamos un mensaje para mostrarlo al final
mensaje = "La base de datos " & base & "," & _
Chr(13) & "ha sido compactada."
Else
'Si no existe la base de datos, o
'la ruta es incorrecta, mostraremos un
'mensaje distinto

mensaje = "Base de datos o ruta, incorrecta."
End If
'eliminamos el objeto
Set fso = Nothing
'mostramos el mensaje
MsgBox (mensaje)
End Sub

Si deseáis compactar una base de datos, que esté en la misma carpeta donde tengamos el fichero de excel, entonces sustituiremos la variable ruta del código anterior, para que nos quede definida de la siguiente forma:

ruta = ActiveWorkbook.Path & "\"

Creo que comentar algo más, respecto a este macro, es innecesario, pues el propio código fuente ya está comentado. Solo añadiré una observación. Si nuestra base de datos es relativamente pequeña (pongamos por ejemplo de 1 o 2 MB, aunque no hay que tomarlo al pie de la letra, pues puede ocurrir en una base de datos de mayor tamaño), entonces todas las operaciones se realizarán tan rápidamente que no podemos comprobar que realmente el macro hace todo lo que el propio código fuente dice hacer. Si nuestra base de datos es algo más grande (yo he utilizado una de 8 MB, para ver los efectos), entonces observaremos que efectivamente se crea una copia de la base de datos, y que una vez compactada la base de datos original, al final se borra la base de datos temporal.

Como la operación de compactación de la base de datos será más rápida, cuanto más pequeña sea la base de datos, todo ese procedimiento de compactación, copia, y borrado, no los podremos ver, por muy rápidos que cambiemos de ventana (de Excel, al explorador de archivos de Windows), si nuestra base de datos es relativamente pequeña, pues todo el procedimiento se realiza de una forma realmente rápida.



4 comentarios:

Unknown dijo...

Javier, Muchas gracias por tu articulo, el problema es que cuando ejecuto la Macro no me compacta el archivo que deseo compactar. Lo que si hace es crear la "base_temporal.mdb" (copia de la base compactada) que posteriormente borra, o sea en la practica no hace nada ya que no compacta la base original y la copia compactada la borra. Tal vez una solución sería borrar la base original y posteriormente cambiar el nombre de la temporal. De todas formas es una Macro con un código muy útil para mis necesidades.

Muchas gracias nuevamente, por tu valiosa ayuda

P.D. ¿también publicaras la forma de listar las tablas y/o consultas de un Access con una Macro en Excel?

El pilt®afilla - www.3piesalgato.com dijo...

Gracias por el aviso Andrés. Ya está solucionado. Me había dejado precisamente eso, hacer un reemplazo de la base temporal, por la original.

Si te fijas en el código, solo cambia la línea anterior al borrado de la base de datos temporal.

La semana que viene publicaré como mostrar las tablas existentes en una base de datos. Ya lo tengo hecho, pero hay que dosificar las entregas, que se me agotan las ideas ;-)

Un saludo, y muchas gracias por la observación.

Unknown dijo...

Javier, gracias por la pronta respuesta... Estaré pendiente a tu próximo articulo y no te preocupes si se te agotan las ideas ya que yo tengo varias preguntas :). por ejemplo y aprovechando este comentario. ¿es posible hacer consultas anidadas (en el editor sql) en Access?.

Saludos.

Atte.
Andrés Silva C.

El pilt®afilla - www.3piesalgato.com dijo...

Si, con Access puedes hacer consultas sobre consultas (se llaman subconsultas), si es a lo que te refieres, pero yo no soy experto en Access (ni tan siquiera lo soy en Excel). En el blog solo trato temas de Excel, y en este caso, como lo de Access afecta, pues también lo he tocado.

No obstante, si googleas un poco, verás que hay algún que otro sitio especializado en Access, y allí te podrán aclarar todas esas dudas.

Saludos.