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,谢谢这个冻糕。伊维特,我不明白你说的按钮在哪里是什么意思。你说的是一个无法关闭的表单吗?