Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba MSAccess在打开文件时崩溃_Vba_Ms Access_Locking - Fatal编程技术网

Vba MSAccess在打开文件时崩溃

Vba MSAccess在打开文件时崩溃,vba,ms-access,locking,Vba,Ms Access,Locking,我正在windows 10 PC上使用Office 365 我在Access中有一些VBA代码,用于检查文件是否打开或锁定(该文件是此电脑的本地文件) 在一台计算机上,此代码对大多数文件运行,但在到达特定文件集时始终崩溃。如果我从第一个文件开始手动逐步执行代码,则每次都是相同的文件集。我尝试重新启动电脑以清除所有锁,但结果是一样的 当我说崩溃时,我的意思是我失去了对访问的控制,windows报告它不再响应 如果我在不同的电脑上运行相同的代码,引用相同的文件,它会报告文件已锁定,但不会崩溃 文件未

我正在windows 10 PC上使用Office 365

我在Access中有一些VBA代码,用于检查文件是否打开或锁定(该文件是此电脑的本地文件)

在一台计算机上,此代码对大多数文件运行,但在到达特定文件集时始终崩溃。如果我从第一个文件开始手动逐步执行代码,则每次都是相同的文件集。我尝试重新启动电脑以清除所有锁,但结果是一样的

当我说崩溃时,我的意思是我失去了对访问的控制,windows报告它不再响应

如果我在不同的电脑上运行相同的代码,引用相同的文件,它会报告文件已锁定,但不会崩溃

文件未被锁定,或者不是我理解的文件锁定方式。从用户界面,我可以随意重命名、移动或删除文件

我相当肯定所编写的VBA代码没有任何问题,并且我开始认为某个地方可能有一个损坏的DLL

VBA参考资料

我的代码在以下行崩溃
打开我的源代码以将输入锁读为#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,权限被拒绝。