【问题标题】:Ms Access - Delete all tables, queries, forms, reports and modulesMs Access - 删除所有表格、查询、表格、报告和模块
【发布时间】:2017-06-11 21:36:49
【问题描述】:

出于安全原因,我想在我的数据库中创建一个自毁按钮。我需要修改我的代码,以便它可以在我的所有表、查询、表单、报告、模块中循环并删除它们。如果发生错误,则转到下一个。

现在我正在使用以下代码,这是一个示例:

 On error Resume Next
 DoCmd.DeleteObject acTable, "tblExtra"
 DoCmd.DeleteObject acTable, "tblFinances"
 DoCmd.DeleteObject acTable, "tblHealth"
 ....

如您所见,我对每个要删除的项目都使用 DoCmd.DeleteObject。

谢谢。

【问题讨论】:

    标签: vba ms-access button


    【解决方案1】:

    此代码将删除所有对象,沿途可能会出现错误,因此如果需要,您仍应在下一个错误恢复中使用。它关闭对象然后删除:

    Dim obj As AccessObject
    
    For Each obj In CurrentProject.AllReports
        Debug.Print "Deleting " & obj.Name
        DoCmd.Close acReport, obj.Name, acSaveNo
        DoCmd.DeleteObject acReport, obj.Name
    Next
    
    For Each obj In CurrentProject.AllForms
        Debug.Print "Deleting " & obj.Name
        DoCmd.Close acForm, obj.Name, acSaveNo
        DoCmd.DeleteObject acForm, obj.Name
    Next
    
    For Each obj In CurrentData.AllTables
        If obj.Name Not Like "MSys*" then
             Debug.Print "Deleting " & obj.Name
             DoCmd.Close acTable, obj.Name, acSaveNo
             DoCmd.DeleteObject acTable, obj.Name
        End If
    Next
    
    For Each obj In CurrentData.AllQueries
        Debug.Print "Deleting " & obj.Name
        DoCmd.Close acQuery, obj.Name, acSaveNo
        DoCmd.DeleteObject acQuery, obj.Name
    Next
    

    供您参考,如果您想添加更多要删除的对象,以下是 CurrentData 中的对象:

    https://msdn.microsoft.com/en-us/library/office/ff823195.aspx

    这是 CurrentProject 中的对象:

    https://msdn.microsoft.com/en-us/library/office/ff835979.aspx

    【讨论】:

    • 感谢您的回复。这是我想要的,但是到现在我发现了两个错误。
    • 1) 如果表单是按下按钮的表单,则代码出错
    • 2) 第一个表是 MSysAccessStorage 并再次出现错误。
    • 确实要小心 MSys* 表,它是 MS Access 内置的系统表。在表块中放置一个 if 条件:If obj.Name Not Like "MSys*"。当然也要注意运行此代码的对象。
    • 在答案中添加了 msys,感谢 Parfait。伊维特,我不明白你所说的“按下按钮的位置”是什么意思。您是在谈论不会关闭的表单吗?
    【解决方案2】:

    对于 Access 2016,Graham 的答案在删除对象时随机失败(自动化错误)。

    按索引从最后一个到第一个删除对象更安全。 checkonly 参数仅用于测试目的,以防您删除任何重要对象。

    我已经在 Access 2016 MSO (16.0.8431.2110) 32 位中测试了这两种解决方案。

    Public Sub deleteObjects(Optional ByVal CheckOnly As Boolean = True)
    
        Dim obj     As AccessObject
        Dim i       As Long
    
        With CurrentProject
            For i = .AllReports.count - 1 To 0 Step -1
                Set obj = .AllReports(i)
                Debug.Print "Deleting " & obj.Name
                If Not CheckOnly Then
                    DoCmd.Close ObjectType:=acReport, ObjectName:=obj.Name, Save:=acSaveNo
                    DoCmd.DeleteObject acReport, obj.Name
                End If
            Next
    
            For i = .AllForms.count - 1 To 0 Step -1
                Set obj = .AllForms(i)
                If obj.Name <> "myImportantForm" Then
                    Debug.Print "Deleting " & obj.Name
                    If Not CheckOnly Then
                        DoCmd.Close ObjectType:=acForm, ObjectName:=obj.Name, Save:=acSaveNo
                        DoCmd.DeleteObject acForm, obj.Name
                    End If
                End If
            Next
    
            For i = .AllModules.count - 1 To 0 Step -1
                Set obj = .AllModules(i)
                If obj.Name <> "myImportantModule" Then
                    Debug.Print "Deleting " & obj.Name
                    If Not CheckOnly Then
                        DoCmd.DeleteObject acModule, obj.Name
                    End If
                End If
            Next
        End With
    
        With CurrentData
            For i = .AllQueries.count - 1 To 0 Step -1
                Set obj = .AllQueries(i)
                Debug.Print "Deleting " & obj.Name
                If Not CheckOnly Then
                    DoCmd.Close ObjectType:=acQuery, ObjectName:=obj.Name, Save:=acSaveNo
                    DoCmd.DeleteObject acQuery, obj.Name
                End If
            Next
    
            For i = .AllTables.count - 1 To 0 Step -1
                Set obj = .AllTables(i)
                If Not obj.Name Like "MSys*" Then
                    Debug.Print "Deleting " & obj.Name
                    If Not CheckOnly Then
                        DoCmd.Close ObjectType:=acTable, ObjectName:=obj.Name, Save:=acSaveNo
                        DoCmd.DeleteObject acTable, obj.Name
                    End If
                End If
            Next
        End With
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2019-07-13
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多