Pretty simple question, I know.
Microsoft Access provides a Compact and Repair Utility, which performs two separate functions. First, it compacts the database to eliminate wasted space and, secondly, it attempts to repair the database, if it was corrupted.
If you want to compact/repair an external mdb file (not the one you are working in just now):
Application.compactRepair sourecFile, destinationFile
If you want to compact the database you are working with:
Application.SetOption "Auto compact", True
In this last case, your app will be compacted when closing the file.
My opinion: writting a few lines of code in an extra MDB "compacter" file that you can call when you want to compact/repair an mdb file is very usefull: in most situations the file that needs to be compacted cannot be opened normally anymore, so you need to call the method from outside the file.
Otherwise, the autocompact shall by default be set to true in each main module of an Access app.
In case of a disaster, create a new mdb file and import all objects from the buggy file. You will usually find a faulty object (form, module, etc) that you will not be able to import.
If you have the database with a front end and a back end. You can use the following code on the main form of your front end main navigation form:
Dim sDataFile As String, sDataFileTemp As String, sDataFileBackup As String Dim s1 As Long, s2 As Long sDataFile = "C:\MyDataFile.mdb" sDataFileTemp = "C:\MyDataFileTemp.mdb" sDataFileBackup = "C:\MyDataFile Backup " & Format(Now, "YYYY-MM-DD HHMMSS") & ".mdb" DoCmd.Hourglass True 'get file size before compact Open sDataFile For Binary As #1 s1 = LOF(1) Close #1 'backup data file FileCopy sDataFile, sDataFileBackup 'only proceed if data file exists If Dir(sDataFileBackup vbNormal) <> "" Then 'compact data file to temp file On Error Resume Next Kill sDataFileTemp On Error GoTo 0 DBEngine.CompactDatabase sDataFile, sDataFileTemp If Dir(sDataFileTemp, vbNormal) <> "" Then 'delete old data file data file Kill sDataFile 'copy temp file to data file FileCopy sDataFileTemp, sDataFile 'get file size after compact Open sDataFile For Binary As #1 s2 = LOF(1) Close #1 DoCmd.Hourglass False MsgBox "Compact complete " & vbCrLf & vbCrLf _ & "Size before: " & Round(s1 / 1024 / 1024, 2) & "Mb" & vbCrLf _ & "Size after: " & Round(s2 / 1024 / 1024, 2) & "Mb", vbInformation Else DoCmd.Hourglass False MsgBox "ERROR: Unable to compact data file" End If Else DoCmd.Hourglass False MsgBox "ERROR: Unable to backup data file" End If DoCmd.Hourglass False
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With