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

Posted

技术标签:

【中文标题】每 20 秒保存一次。导致1004错误【英文标题】:Save every 20 secs. Causing 1004 error 【发布时间】:2018-01-18 18:50:06 【问题描述】:

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

Sub Save()
   ActiveWorkbook.Save
   Application.OnTime Now + TimeValue("00:00:20"), "Save"
End Sub

当一个或两个用户使用它时,它可以正常工作。但是,如果三个或更多用户正在使用它,那么它就会开始抛出

运行时错误 1004 文件被锁定

我相信这是因为该文档已经在由另一个用户保存。有没有办法解决这个错误?例如,有没有办法查看其他用户是否正在使用 VBA 保存到共享工作簿?

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

【问题讨论】:

考虑改用 Excel 的内置自动保存/自动恢复功能。此外,通过慢速网络并根据文件大小,20 秒可能不足以在两次保存之间完成任何实际工作。我会在不眨眼的情况下注释掉那个宏。 如果用户正在修改单元格,它会挂起吗?另一个问题是尝试关闭计时器,但如果用户正在使用工作表,则会被覆盖。 ***.com/q/48121305/8716187 【参考方案1】:

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

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 宏,所以请原谅我的错误。

来源:MrExcel run-time-error

【讨论】:

如果两个用户在 20 秒延迟的情况下同步打开同一个文件,此后每次调用都会发生冲突,并且在其中一个用户关闭工作簿之前不会保存。尝试向 TimeValue 添加一个随机数(例如,从 1 到 10),这样您就可以抵消两个碰撞的用户。 If Target.Locked = False Then 正在检查范围是否被锁定,而不是工作簿。也许我不明白如果工作簿被锁定,范围也是如此,但只是想指出它以防我怀疑是正确的。 谢谢斯蒂芬。我相信这让我走上了正确的道路。我不确定的一件事。 worksheet_change 会接收其他用户所做的更改,还是只会看到本地用户所做的更改? 我想我们最近有一个类似的问题,如果用户在保存或关闭时键入(更改)将不起作用,因为 excel 正在触发其他处理程序。 Cody,只要每个人都在 Excel 中启用了宏,每次用户有机会(在他们自己计算机上的 Excel 上)时,都会触发该事件。我还更新了解决方案,以(希望)有一个更好的解决方案来保持独占访问并允许保存上述 Scott 的担忧。

以上是关于每 20 秒保存一次。导致1004错误的主要内容,如果未能解决你的问题,请参考以下文章

每 10 秒更新一次用户位置 - 从 mysql 获取位置

每 20 秒启动一次动画

是否可以使用 dotNet 使用 Hangfire 每 20 秒运行一次作业?

如何每 20 秒执行一次 bash 脚本? ,好用睡眠和循环?

每 20 秒打印一次消息的信号(C 多线程程序)

有没有办法让这个(内部 URL)JQuery 计数器每 20 秒读取一次 JSON