Vba MSAccess在打开文件时崩溃
我正在windows 10 PC上使用Office 365 我在Access中有一些VBA代码,用于检查文件是否打开或锁定(该文件是此电脑的本地文件) 在一台计算机上,此代码对大多数文件运行,但在到达特定文件集时始终崩溃。如果我从第一个文件开始手动逐步执行代码,则每次都是相同的文件集。我尝试重新启动电脑以清除所有锁,但结果是一样的 当我说崩溃时,我的意思是我失去了对访问的控制,windows报告它不再响应 如果我在不同的电脑上运行相同的代码,引用相同的文件,它会报告文件已锁定,但不会崩溃 文件未被锁定,或者不是我理解的文件锁定方式。从用户界面,我可以随意重命名、移动或删除文件 我相当肯定所编写的VBA代码没有任何问题,并且我开始认为某个地方可能有一个损坏的DLL VBA参考资料Vba MSAccess在打开文件时崩溃,vba,ms-access,locking,Vba,Ms Access,Locking,我正在windows 10 PC上使用Office 365 我在Access中有一些VBA代码,用于检查文件是否打开或锁定(该文件是此电脑的本地文件) 在一台计算机上,此代码对大多数文件运行,但在到达特定文件集时始终崩溃。如果我从第一个文件开始手动逐步执行代码,则每次都是相同的文件集。我尝试重新启动电脑以清除所有锁,但结果是一样的 当我说崩溃时,我的意思是我失去了对访问的控制,windows报告它不再响应 如果我在不同的电脑上运行相同的代码,引用相同的文件,它会报告文件已锁定,但不会崩溃 文件未
我的代码在以下行崩溃
打开我的源代码以将输入锁读为#ff
Function copyormovemyfiles(my_source As String, my_dest As String, mycontrol As Integer) As Boolean
Dim fso As Scripting.FileSystemObject
Dim ff As Long, ErrNo As Long
''''''''''''''''
' mycontrol = 1 for a move
' mycontrol = 2 for a copy. It will not overwrite files
''''''''''''''''
On Error GoTo error_control
Set fso = New Scripting.FileSystemObject
If Not fso.FileExists(my_source) Then
Err.Raise 1000, , my_source & " does not exist!" & vbExclamation & "Source File Missing"
ElseIf Not fso.FileExists(my_dest) Then
fso.CopyFile my_source, my_dest, True
Else
Err.Raise 1000, my_dest & " already exists!" & vbExclamation
End If
Select Case mycontrol
Case 1
On Error Resume Next
ff = FreeFile()
Open my_source For Input Lock Read As #ff
Close ff
ErrNo = Err
'On Error GoTo 0
If ErrNo > 0 Then Stop
Err.Clear
'Select Case ErrNo
'Case 0: IsWorkBookOpen = False
'Case 70: IsWorkBookOpen = True
'Case Else: Error ErrNo
'End Select
On Error GoTo error_control
最好只是做一个动作,然后处理失败案例,而不是事先测试。原因是状态可能会在测试和操作之间发生变化。此外,当您可以让代码有机地引发错误时,您正在手动引发错误 因此,您说您的副本不会覆盖,但随后告诉copy命令覆盖。如果我们告诉它不要覆盖,那么我们就不再需要测试源或目标是否存在,它们都会导致明显的错误 注意:不要在变量或函数名中使用下划线“\u1”,因为它们用于VBA事件处理程序中的事件定义
Function copyormovemyfiles(my_source As String, my_dest As String, mycontrol As Integer) As Boolean
''''''''''''''''
' mycontrol = 1 for a move
' mycontrol = 2 for a copy. It will not overwrite files
''''''''''''''''
On Error GoTo error_control
Dim fso As Scripting.FileSystemObject
fso.CopyFile my_source, my_dest, overwrite:=False
If mycontrol = 1 Then
SetAttr my_source, vbNormal
fso.DeleteFile my_source
End If
copyormovemyfiles = True
error_control:
If Err.Number <> 0 Then
' You can select case here and handle the error
copyormovemyfiles = False
End If
End Function
函数copyormovemyfiles(my_source为字符串,my_dest为字符串,mycontrol为整数)为布尔值
''''''''''''''''
'mycontrol=1表示移动
'对于副本,mycontrol=2。它不会覆盖文件
''''''''''''''''
关于错误转到错误控制
将fso设置为Scripting.FileSystemObject
fso.CopyFile my\u source,my\u dest,overwrite:=False
如果mycontrol=1,则
设置属性我的源,vbNormal
fso.deletefilemyu源
如果结束
copyormovemyfiles=True
错误控制:
如果错误号为0,则
'您可以在此处选择case并处理错误
copyormovemyfiles=False
如果结束
端函数
如果在下一步继续执行错误时删除,会发生什么情况?访问“无响应”可能只是尝试/未能获取文件锁的结果。。。另外,我怀疑Err.Cl
是可编译的。谢谢马修。Cl只是一个打字错误。代码实际上是err.Clear.Mathieu。如果我删除了on error resume next,代码仍然会以完全相同的方式崩溃。唯一的区别是,在第二台PC上,所谓的文件锁确实被捕获,并且(正确地)跳转到错误处理代码。这是一个很好的挑战,但并没有改变任何事情。一个完整的挑战可能会有所帮助。安德烈-我刚刚做到了这一点,这没有什么不同。谢谢你的建议,谢谢你。在过去的几周里,我在寻找解决方案的过程中多次尝试更改代码。事实上,你的建议就是我的出发点。如果我尝试对文件使用move、deletefile或kill命令(我确信还会有其他命令),也会出现相同的错误。关于您的问题“当您可以让代码有机地提高错误时,您正在手动提高错误”,这只是我试图在错误崩溃之前捕获错误的最新迭代,尽管实际上到那时已经太晚了。Hackslash。我在前面的评论中达到了角色限制。以下是你其余问题的答案。你评论了下划线。我可以确认,删除它们对执行或崩溃没有影响。。希望这些都有帮助。我唯一一次遇到这样的问题是与属性有关的。我在删除之前手动设置属性的地方发现了一些代码。也许这会解决问题,或者给你一个更好的错误来处理。我在代码示例中添加了SetAttr我的源代码vbNormal
,谢谢。对延迟回复表示歉意。我做了你建议的修改,不幸的是没有什么不同。我应该补充一点,当我在第二台电脑上运行代码时报告的错误现在是70,权限被拒绝。