我正在运行几个VBA代码模块。在运行过程中,代码崩溃,因为Access的最大大小为2GB;但是,如果我在那时压缩数据库它只有200MB。
代码运行时是否可以定期压缩数据库?
答案 0 :(得分:2)
是的,你可以。但是,您必须关闭使用数据库文件的所有记录集和数据库变量,表单和报表。您可以通过运行代码并查看LDB文件是否不再存在来自行测试。此外,除了您自己以外的所有用户当然都必须超出数据库文件。
您可以遍历Forms集合(实际上是开放表单)和Reports集合来覆盖它们。当然,一旦完成处理,您将需要重新打开任何自动启动表单等。
答案 1 :(得分:2)
我最近偶然发现了这个问题,我在答案中遇到的一些事情是完全错误的:
这是不幸的,到目前为止最简单的解决方法是创建一个链接数据库。但如果这是不可取的,如果你愿意做一些奇怪的诡计,你可以做另外一件事。
问题是在紧凑和修复发生时必须关闭主数据库。要解决这个问题,我们可以执行以下操作:
Public Sub CompactRepairViaExternalScript()
Dim vbscrPath As String
vbscrPath = CurrentProject.Path & "\CRHelper.vbs"
If Dir(CurrentProject.Path & "\CRHelper.vbs") <> "" Then
Kill CurrentProject.Path & "\CRHelper.vbs"
End If
Dim vbStr As String
vbStr = "dbName = """ & CurrentProject.FullName & """" & vbCrLf & _
"resumeFunction = ""ResumeBatch""" & vbCrLf & _
"Set app = CreateObject(""Access.Application"")" & vbCrLf & _
"Set dbe = app.DBEngine" & vbCrLf & _
"Set objFSO = CreateObject(""Scripting.FileSystemObject"")" & vbCrLf & _
"On Error Resume Next" & vbCrLf & _
"Do" & vbCrLf & _
"If Err.Number <> 0 Then Err.Clear" & vbCrLf & _
"WScript.Sleep 500" & vbCrLf & _
"dbe.CompactDatabase dbName, dbName & ""_1""" & vbCrLf & _
"errCount = errCount + 1" & vbCrLf & _
"Loop While err.Number <> 0 And errCount < 100" & vbCrLf & _
"If errCount < 100 Then" & vbCrLf & _
"objFSO.DeleteFile dbName" & vbCrLf & _
"objFSO.MoveFile dbName & ""_1"", dbName" & vbCrLf & _
"app.OpenCurrentDatabase dbName" & vbCrLf & _
"app.UserControl = True" & vbCrLf & _
"app.Run resumeFunction" & vbCrLf & _
"End If" & vbCrLf & _
"objFSO.DeleteFile Wscript.ScriptFullName" & vbCrLf
Dim fileHandle As Long
fileHandle = FreeFile
Open vbscrPath For Output As #fileHandle
Print #fileHandle, vbStr
Close #fileHandle
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
wsh.Run """" & vbscrPath & """"
Set wsh = Nothing
Application.Quit
End Sub
这将完成上述所有步骤,并通过调用调用此函数的数据库上的ResumeBatch
函数(不带任何参数)来恢复批处理。
请注意,点击运行保护和防病毒/策略等不喜欢vbscript文件的行为可能会破坏这种方法。
答案 2 :(得分:1)
这在以前版本的MS-Access中有效,但由于我们运行Access 2010,因此失败了。
Sub CompactRepair()
Dim control As Office.CommandBarControl
Set control = CommandBars.FindControl(Id:=2071)
control.accDoDefaultAction
End Sub
当然,mdb将被关闭,压缩并重新打开。 自Access 2010以来,压缩操作必须由Microsoft进行调整。
希望这有帮助。
答案 3 :(得分:0)
您只能压缩未打开的数据库(或将其压缩到不同名称的文件)。
有关步骤,请参阅here。
答案 4 :(得分:0)
我不确定vb,但我总是通过调用“/ compact”命令行开关从命令行执行此操作。我认为您可以通过命令行开关调用数据库,就像在vb中轻松打开任何文件一样。
每个MS
压缩并修复Access数据库,或压缩在/ compact选项之前指定的Access项目,然后关闭Access。如果在/ compact选项后面省略目标文件名,则会将文件压缩为原始名称和文件夹。要压缩为其他名称,请指定目标文件。如果未在目标数据库或目标Access项目中包含路径,则默认情况下会在“我的文档”文件夹中创建目标文件。在Access项目中,此选项压缩Access项目(.adp)文件,但不压缩SQL Server数据库。
答案 5 :(得分:0)
根据Microsoft的说法,只要文件是专门打开的,您就可以压缩打开的Access数据库。