Vba Ms Access-删除所有表、查询、表单、报告和模块

Vba Ms Access-删除所有表、查询、表单、报告和模块,vba,ms-access,button,Vba,Ms Access,Button,出于安全原因,我想在数据库中创建一个自毁按钮。我需要修改我的代码,这样它就可以在我所有的表、查询、表单、报表、模块中循环并删除它们。如果发生错误,请转到下一个错误 现在我使用以下代码,这是一个示例: On error Resume Next DoCmd.DeleteObject acTable, "tblExtra" DoCmd.DeleteObject acTable, "tblFinances" DoCmd.DeleteObject acTable, "tblHealth" ...

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

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

 On error Resume Next
 DoCmd.DeleteObject acTable, "tblExtra"
 DoCmd.DeleteObject acTable, "tblFinances"
 DoCmd.DeleteObject acTable, "tblHealth"
 ....
正如您将看到的,我正在为每个要删除的项目使用DoCmd.DeleteObject


谢谢。

此代码将删除所有对象,在执行过程中可能会出现错误,因此如果需要,您仍应使用on error resume next。它关闭对象,然后删除:

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中的对象:

以下是CurrentProject中的对象:


此代码将删除所有对象,过程中可能会出现错误,因此如果需要,您仍应使用on error resume next。它关闭对象,然后删除:

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中的对象:

以下是CurrentProject中的对象:


至于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

至于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

谢谢你的回复。这正是我想要的,但到目前为止我发现了两个错误。1如果表单是按下按钮的表单,则代码出现错误2第一个表是MSYSACCESS存储,再次出现错误。确实,请小心MSys*表,它们是MS Access内置的系统表。在tables块中放置一个if条件:if obj.Name不象MSys*。当然也要注意这个代码运行的对象。在答案中添加了msys,谢谢这个冻糕。伊维特,我不明白你说的按钮在哪里是什么意思。您是在说一个无法关闭的表单吗?谢谢您的回复。这正是我想要的,但到目前为止我发现了两个错误。1如果表单是按下按钮的表单,则代码出现错误2第一个表是MSYSACCESS存储,再次出现错误。确实,请小心MSys*表,它们是MS Access内置的系统表。在tables块中放置一个if条件:if obj.Name不象MSys*。当然也要注意这个代码运行的对象。在答案中添加了msys,谢谢这个冻糕。伊维特,我不明白你说的按钮在哪里是什么意思。你说的是一个无法关闭的表单吗?