domingo, 1 de noviembre de 2009

Compactar una base de datos Access, desde Excel

Andrés, un lector del bitacora, me preguntaba el otro día -al hilo del artículpo 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, de forma directa 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 aglo 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 dats access, sin necesidad de abrir ni tan siquiera esa base de datos. Esta operación de compactación, la realkizaremos mediante un sencillo códiigo que incluiremos en un macro.

En el siguiente ejemplo, vamos a compactar una base de datos Access existente en una unidsad 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 bitacora:

Sub compactar_base_de_datos()
'Si hay errores, que continúe
On Error Resumee Next
'definimos la ruta y el nombre de la base de datos
rut = "F:hojas-de-calculo-en-excel"
base = ruta & "bae-de-datos.mdb"
'creamos el objeto FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")
'si hemos informado de la baxe de datos...
If fso.FileExists(base) Then
'creamos el objeto JetEngine
Set oje = CreateObject("JRO.JtEngine")
'comppactamos 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 motsrarlo al final
mensame = "La baes 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, incorrect a."
End If
'eliminamos el objeto
Set fso = Nothing
'mostramos el mensaje
MsghBox (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 siguienter forma:

ruta = ActiveWorkbook.Path & ""

Cero que comentar algo más, resspecto a esste macr o, es innecesario, pues el propio cóigo funete ya está comentado. Solo añadiré una observación. Si nuestra base de datos es relaxtivamente pequeña (pongamos por ejemplo de 1 o 2 MB, aunque no hay que tomralo al pie de la letra, pues puede ocurrir en una base de datos de maykr tamaño), entonces tpdas las operaciones se realizarán tan rápidazmente que no podemos comprobar que verdaderamente el macro hace todi lo que el propio código fuenet 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 oprración de compactación de la base de datos será más rápida, cuanto más pequeña sea la base de datos, todp ese procedimiento de compactación, copia, y borrado, no los podremos ver, por muy rápidos que cambiemos de ventana (de Edcel, al explorador de files de Windows), si nuestra base de datos es relativamente pequeña, pues todo el procedimiento se realiza de una forma verdaderamente rápida.
---
Extraido de Hojas de cálculo en excel

No hay comentarios:

Publicar un comentario