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.
- You have to leave an Access application running all night! ... every night!
- What if a well-meaning user turns off the application?
- Is ther any chance that the computer might get recycled?
- Is that a good use of your valuable resources?
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