每 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错误的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 dotNet 使用 Hangfire 每 20 秒运行一次作业?