Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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 每20秒保存一次。导致1004错误_Vba_Excel_Save_Runtime Error - Fatal编程技术网

Vba 每20秒保存一次。导致1004错误

Vba 每20秒保存一次。导致1004错误,vba,excel,save,runtime-error,Vba,Excel,Save,Runtime Error,我在共享驱动器上有一个excel文档,每20秒保存一次活动工作簿 Sub Save() ActiveWorkbook.Save Application.OnTime Now + TimeValue("00:00:20"), "Save" End Sub 当一个或两个用户使用它时,它工作正常。但是,如果有三个或更多的用户在使用它,那么它就会开始抛出 运行时错误1004文件已锁定 我相信这是因为文档已经被另一个用户保存了。有办法避免这个错误吗?例如,是否有方法查看其他用户是否正在使用V

我在共享驱动器上有一个excel文档,每20秒保存一次活动工作簿

Sub Save()
   ActiveWorkbook.Save
   Application.OnTime Now + TimeValue("00:00:20"), "Save"
End Sub
当一个或两个用户使用它时,它工作正常。但是,如果有三个或更多的用户在使用它,那么它就会开始抛出

运行时错误1004文件已锁定

我相信这是因为文档已经被另一个用户保存了。有办法避免这个错误吗?例如,是否有方法查看其他用户是否正在使用VBA保存到共享工作簿


或者,如果其他用户对文档进行了更改,是否有方法触发保存事件?非常感谢你的帮助

我相信您可以右键单击工作表选项卡,然后选择“查看代码”。在此窗口中,您应该能够键入以下内容:

Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveWorkbook.save
End Sub
还有检查它是否被锁定的代码,因此如果您想将上面的代码与计时器(在它被锁定的情况下)结合起来,那么您可以执行以下操作

   Private Sub Worksheet_Change(ByVal Target As Range)
       Save(Target)
   End Sub

   Sub Save(ByVal Target As Range)
       ' check shared and stop sharing
       With ActiveWorkbook
       If .MultiUserEditing Then
           Application.DisplayAlerts = False
           .ExclusiveAccess
           Application.DisplayAlerts = True
       End If
       End With
       'resave with sharing switched on
       With ActiveWorkbook
            Application.DisplayAlerts = False
            .SaveAs Filename:=.FullName, AccessMode:=xlShared
            Application.DisplayAlerts = True
       End With
   End Sub
编辑:MoondogsMaDawg提出了一个很好的观点。我已经更新了代码,在1-10秒之间选择一个随机值(可以根据需要随意更改)

编辑#2:找到了一个更好的解决方案来获取独占访问并保存它,因此它不必检查它是否被锁定

注意:我不经常创建Excel宏,因此请原谅我的错误。


来源:

我相信您可以右键单击工作表选项卡,然后选择“查看代码”。在此窗口中,您应该能够键入以下内容:

Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveWorkbook.save
End Sub
还有检查它是否被锁定的代码,因此如果您想将上面的代码与计时器(在它被锁定的情况下)结合起来,那么您可以执行以下操作

   Private Sub Worksheet_Change(ByVal Target As Range)
       Save(Target)
   End Sub

   Sub Save(ByVal Target As Range)
       ' check shared and stop sharing
       With ActiveWorkbook
       If .MultiUserEditing Then
           Application.DisplayAlerts = False
           .ExclusiveAccess
           Application.DisplayAlerts = True
       End If
       End With
       'resave with sharing switched on
       With ActiveWorkbook
            Application.DisplayAlerts = False
            .SaveAs Filename:=.FullName, AccessMode:=xlShared
            Application.DisplayAlerts = True
       End With
   End Sub
编辑:MoondogsMaDawg提出了一个很好的观点。我已经更新了代码,在1-10秒之间选择一个随机值(可以根据需要随意更改)

编辑#2:找到了一个更好的解决方案来获取独占访问并保存它,因此它不必检查它是否被锁定

注意:我不经常创建Excel宏,因此请原谅我的错误。


来源:

如果两个用户以20秒的延迟同步打开同一个文件,则此后每次调用时都会发生冲突,并且在其中一个用户关闭工作簿之前都不会保存。尝试将一个随机数(比如1-10)添加到时间值中,以便可以偏移两个冲突的用户。
如果Target.Locked=False,则检查范围是否锁定,而不是工作簿。也许我不明白,如果工作簿被锁定,范围也会被锁定,但我只是想指出一下,以防我怀疑的是正确的。谢谢Stephen。我相信这让我走上了正确的道路。但有一件事我不确定。工作表的更改是否会拾取其他用户所做的更改,还是只查看本地用户所做的更改?我想我们最近遇到了一个类似的问题,即如果用户在保存或关闭时键入(更改),将无法工作,因为excel正在启动其他处理程序。Cody,只要每个人都在excel中启用了宏,每次用户有机会(在他们自己的计算机上的Excel上)时,事件都会触发。我还更新了解决方案(希望)有一个更好的解决方案来维护独占访问并允许保存上述Scott的问题。如果两个用户在20秒延迟的情况下同步打开同一个文件,则此后每次调用都会发生冲突,并且在其中一个用户关闭工作簿之前都不会保存。尝试将一个随机数(比如1-10)添加到时间值中,以便可以偏移两个冲突的用户。
如果Target.Locked=False,则检查范围是否锁定,而不是工作簿。也许我不明白,如果工作簿被锁定,范围也会被锁定,但我只是想指出一下,以防我怀疑的是正确的。谢谢Stephen。我相信这让我走上了正确的道路。但有一件事我不确定。工作表的更改是否会拾取其他用户所做的更改,还是只查看本地用户所做的更改?我想我们最近遇到了一个类似的问题,即如果用户在保存或关闭时键入(更改),将无法工作,因为excel正在启动其他处理程序。Cody,只要每个人都在excel中启用了宏,每次用户有机会(在他们自己的计算机上的Excel上)时,事件都会触发。我还更新了解决方案(希望)有一个更好的解决方案来保持独占的访问,并允许保存关于史葛的关注以上。考虑利用Excel的内置自动保存/自动转换功能来代替。此外,在慢速网络上,根据文件大小,20秒可能不足以在两次保存之间完成任何实际工作。我会在不眨眼的情况下注释掉那个宏。如果用户正在修改单元格,它会挂起吗?另一个问题是试图在计时器上关闭,但如果用户正在使用该工作表,问题就解决了。考虑利用Excel的内置自动保存/自动转换功能来代替。此外,在慢速网络上,根据文件大小,20秒可能不足以在两次保存之间完成任何实际工作。我会在不眨眼的情况下注释掉那个宏。如果用户正在修改单元格,它会挂起吗?另一个问题是试图在计时器上关闭,但如果用户正在使用该工作表,问题就解决了。