我们有一个每 30 秒自动保存一次的 .xlsm(使用 here 中的解决方案创建)。
但每隔一段时间,它就会遇到“1004 错误”,并说它找不到一个 8 字符命名的临时文件,并在 vba 行上出现错误
ThisWorkbook.Save
(来自上面的简单解决方案)。工作表中的数据量很小,保存时间不应超过一秒钟。
我还检查了“选项”->“保存”->“仅为此工作簿禁用自动恢复”,这似乎略微缓解但没有解决这个问题。
谢谢你的帮助。
[编辑]: 问题似乎已经发展了。现在让 excel 自行运行几乎不会再出现 1004 保存错误。但是如果有另一个python进程使用pandas“read_excel”文件(循环读取触发问题),excel会很快冻结并弹出一个窗口来保存tmp文件(如excel“另存为”功能)。
pandas read_excel() 似乎在保存时锁定了导致冲突的excel,但我没有看到“read_only”参数。如何在读取文件时不锁定文件? (这是在窗户上)
我不确定这个特定问题是否是导致您遇到错误的原因,但是您实现的自动保存功能存在问题。
Application.OnTime
就像你如何称呼它一样; Application
对象的方法。这意味着它不是从任何特定的工作簿/工作表调用的,而是从应用程序 Excel 本身调用的。这意味着只要 Excel 打开,它就会继续运行。
因此,如果您有第二个(不相关的)工作簿打开并关闭您实现了自动保存功能的工作簿,自动保存的代码将继续运行。如果您现在再次打开自动保存工作簿,您将突然有 2 个自动保存循环在运行。所以每 30 秒自动保存 2 次。再做一次,您将同时运行 3 个自动保存循环。
自动保存循环只会在您完全关闭 Excel 时终止。
可以通过在关闭工作簿之前终止 OnTime 调用来解决此问题。您可以如下所示执行此操作:
普通模块:
Global saveTimer As Variant
Sub Save1()
ThisWorkbook.Save
saveTimer = Now + TimeValue("00:00:30")
Application.OnTime saveTimer, "Save1"
End Sub
工作簿模块:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnTime saveTimer, "Save1", , False
End Sub
Private Sub Workbook_Open()
saveTimer = Now + TimeValue("00:00:30")
Application.OnTime saveTimer, "Save1"
End Sub
使用此代码,如果您关闭工作簿,当前正在运行的
OnTime
调用将终止。
我可以或多或少地告诉你这里发生了什么,虽然不一定是如何解决它。
当你在Excel中保存打开的工作簿时,实际发生的事情大致是这样的:
Microsoft 的文档 here 部分涵盖了这一点。 您还可以阅读 这个 SuperUser 答案 或 Reddit 上的这个 Q&A,其中描述了类似的问题。
在您的情况下发生的情况是,在某些时候,在 Excel 期望的后续步骤中无法访问在上面的步骤 1 中创建的临时文件。
可能的原因包括:
您可以尝试禁用防病毒软件、Windows Defender 或其他 Excel 加载项(等)以尝试找出原因,但如果您在公司环境中工作,这可能是不可能的。
如果你真的需要确定确切的原因,你可能需要编写一些相当复杂的自定义代码来监视该文件夹并找出在保存期间临时文件到底发生了什么以及哪些进程拥有这些文件的句柄。我不建议尝试这个。
更实际的是,我建议添加一些简单的错误处理来捕获这个 1004 错误,也许重试保存然后静默中止,正常安排下一次保存。如果您每 30 秒保存一次文件,偶尔的静默故障应该不是主要问题。