MS Access: how to compact current database in VBA

后端 未结 13 1559
慢半拍i
慢半拍i 2020-11-29 07:34

Pretty simple question, I know.

相关标签:
13条回答
  • 2020-11-29 07:54

    When the user exits the FE attempt to rename the backend MDB preferably with todays date in the name in yyyy-mm-dd format. Ensure you close all bound forms, including hidden forms, and reports before doing this. If you get an error message, oops, its busy so don't bother. If it is successful then compact it back.

    See my Backup, do you trust the users or sysadmins? tips page for more info.

    0 讨论(0)
  • 2020-11-29 07:56

    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
    
    0 讨论(0)
  • 2020-11-29 07:56

    DBEngine.CompactDatabase source, dest

    0 讨论(0)
  • 2020-11-29 07:57

    Check out this solution VBA Compact Current Database.

    Basically it says this should work

    Public Sub CompactDB() 
        CommandBars("Menu Bar").Controls("Tools").Controls ("Database utilities"). _
        Controls("Compact and repair database...").accDoDefaultAction 
    End Sub 
    
    0 讨论(0)
  • 2020-11-29 07:58

    Yes it is simple to do.

    Sub CompactRepair()
      Dim control As Office.CommandBarControl
      Set control = CommandBars.FindControl( Id:=2071 )
      control.accDoDefaultAction
    End Sub
    

    Basically it just finds the "Compact and repair" menuitem and clicks it, programatically.

    0 讨论(0)
  • 2020-11-29 07:59

    If you don't wish to use compact on close (eg, because the front-end mdb is a robot program that runs continually), and you don't want to create a separate mdb just for compacting, consider using a cmd file.

    I let my robot.mdb check its own size:

    FileLen(CurrentDb.Name))
    

    If its size exceeds 1 GB, it creates a cmd file like this ...

    Dim f As Integer
    Dim Folder As String
    Dim Access As String
        'select Access in the correct PF directory (my robot.mdb runs in 32-bit MSAccess, on 32-bit and 64-bit machines)
        If Dir("C:\Program Files (x86)\Microsoft Office\Office\MSACCESS.EXE") > "" Then
            Access = """C:\Program Files (x86)\Microsoft Office\Office\MSACCESS.EXE"""
        Else
            Access = """C:\Program Files\Microsoft Office\Office\MSACCESS.EXE"""
        End If
        Folder = ExtractFileDir(CurrentDb.Name)
        f = FreeFile
        Open Folder & "comrep.cmd" For Output As f
        'wait until robot.mdb closes (ldb file is gone), then compact robot.mdb
        Print #f, ":checkldb1"
        Print #f, "if exist " & Folder & "robot.ldb goto checkldb1"
        Print #f, Access & " " & Folder & "robot.mdb /compact"
        'wait until the robot mdb closes, then start it
        Print #f, ":checkldb2"
        Print #f, "if exist " & Folder & "robot.ldb goto checkldb2"
        Print #f, Access & " " & Folder & "robot.mdb"
        Close f
    

    ... launches the cmd file ...

    Shell ExtractFileDir(CurrentDb.Name) & "comrep.cmd"
    

    ... and shuts down ...

    DoCmd.Quit
    

    Next, the cmd file compacts and restarts robot.mdb.

    0 讨论(0)
提交回复
热议问题