The Problem with Compacting
If you have worked with Microsoft Access databases for any length of time, you have
no doubt noticed that the mdb file itself tends to bloat as you work with it. Every time
you open a form or report in design mode, the mdb file grows. Each time you add records
to a table or create a temporary table, the mdb file grows. And contrary to what you
might expect, closing or deleting objects and deleting records does not "shrink" the database.
Those actions merely make shrinking the mdb file possible. The actual shrinking is done by
executing a DAO (Data Access Objects) Method named CompactDatabase.
The CompactDatabase method may be executed from within the MS Access environment by selecting Compact Database from the Tools >> Database Utilities menu (in Access 97). This command will compact the current database. If you want to compact an external database, such as a "back end" database containing the tables, you could execute a line of code like this:
Application.DBEngine.CompactDatabase "C:\Data.mdb", "C:\DataComp.mdb"
This line of code works fine and does it's job ... with one condition: Microsoft Access must be
running for it to work.
This may not always be possible or convenient. What if you want to compact the mdb file at night when no users are attached to the data? You could leave an Access application running with a form open and put some complicated code in the Form_Timer event that would execute our one line of code. This seems excessive to me and is prone to unexpected errors.
Alternatively, it has been suggested that you could schedule a Microsoft Access application to open at a predefined time using the Windows Scheduler (or similar tool) and place the CompactDatabase code in the AutoExec macro. This will work and is a considerable improvement over the previously described solution, but if you're going to schedule this as a job anyway, why not move the work from a resource intensive Access application to a simple Windows Scripting Host, VBS script?
VBS ... a better solution
From VBS you can use COM Automation to exploit the MS Access Object Model and call the
CompactDatabase method. This is done by using the CreateObject method to set an object
variable to the MS Access Application object. The code sample
includes the syntax for instantiating either Access 97 or Access 2000 application objects.
In order to use the sample, you need only change the hard-coded name of the database which is stored in the variable named strPathToMDB, to the name and path of the database you wish to compact. Paste the attached script into notepad and save as CompactMDB.vbs or with some other name which is meaningful to you. Execute the script by double-clicking the vbs file. Check to see that the newly compacted file exists, along with a copy of the original mdb file renamed to Filename.mdbx for safe keeping.
Now that your script is created and tested, it may be added to the Windows scheduler as a job to run nightly, or as often as is necessary and/or practical. The data file can be compacted and backups made automatically with a simple script that is easy to maintain.
View VBS Code
How to compact an Access Database using VBS Script from Danny Lesandrini.
VBS Script to Compact Access Database
<-- Back To Article
' ***************** BEGIN CODE HERE ' *****************
' ///////////// NOTE: User must edit variables in this section /////
' The following line of code is the only variable that need be edited
' You must provide a path to the Access MDB which will be compacted
strPathToMDB = "C:\EMSEnt.mdb"
' Set a name and path for a temporary mdb file
strTempDB = "C:\Comp0001.mdb"
' Create Access 97 Application Object
Set objAccess = CreateObject("Access.Application.8")
' For Access 2000, use Application.9
'Set objAccess = CreateObject("Access.Application.9")
' Perform the DB Compact into the temp mdb file
' (If there is a problem, then the original mdb is preserved)
objAccess.DbEngine.CompactDatabase strPathToMDB ,strTempDB
If Err.Number > 0 Then
' There was an error. Inform the user and halt execution
strMsg = "The following error was encountered while compacting database:"
strMsg = strMsg & vbCrLf & vbCrLf & Err.Description
' Create File System Object to handle file manipulations
Set objScript= CreateObject("Scripting.FileSystemObject")
' Back up the original file as Filename.mdbz. In case of undetermined
' error, it can be recovered by simply removing the terminating "z".
objScript.CopyFile strPathToMDB , strPathToMDB & "z", True
' Copy the compacted mdb by into the original file name
objScript.CopyFile strTempDB, strPathToMDB, True
' We are finished with TempDB. Kill it.
' Always remember to clean up after yourself
Set objAccess = Nothing
Set objScript = Nothing
' ****************** END CODE HERE ' ******************
Back To Article