Excel工作簿在更新和保存后无法打开

我有两本相互协作的工作手册。 每周两次(通过MS W10 Task Scheduler和一个运行Excel的简单的VBScript,显示设置为“隐藏”),打开一个工作簿(WB-A),执行networking查询,使用检索到的数据更新四个它的工作表保存自己,然后打开另一个工作簿(WB-B)开始进一步处理新的数据。

这一切都很好,一段时间。 现在,在更新过程完成后,我可以重新访问工作簿的唯一方法是如果手动循环到另一个Office生成版本(通过“ officec2rclient.exe / update user updatetoversion = 16.0.XXXX.XXXX ”,I已经在1609和1610之间切换)。

没有这样做,Excel将崩溃,我会看到错误告诉我,Excel已经“停止响应”。 如果我先打开Excel,然后尝试打开其中一个工作簿,有时候我会看到一个错误,在关键警报MsgBox中只显示“400”。

最初我虽然认为这个问题可能是由于WB-B的重量造成的(磁盘大约70MB,内存大约4GB),所以我开始窃取它。 我删除了所有无关的条件格式,命名范围和外部链接(到WB-A)。 这似乎有相当大的帮助,至less在加载时间。

乍一看,似乎我已经用这些改进解决了这个问题。 通过优化外部链接,可以减less约60%的通话次数,并将整体内存使用量减less约50%。 直到下一次预定的更新之后,我才意识到我还没有走出困境。

有关这两个工作簿的相关细节

1)它们包含表单button(控件),条件格式,命名范围,公式,并且都是macros启用的。

2)当它们打不开时,当button(控件)应该出现时,它们失败(我相信随着工作簿正在完成其“计算”过程)。

3)试图在Excel中使用内置的“打开并修复”function,无法正常加载工作簿。

4)执行Office365的修复安装(快速和联机方法)不能解决问题。

5)还有其他时间我会去打开WB-B,每个单元格格式化为一个date。 清除“正常”不正确保存的格式可以解决问题。

在此之前

在此之前,我得到了“ 图片太大,将被截断 ”的消息,因为自动更新过程似乎正在包装和保存每个工作簿。 在保存之前,我添加了Application.CutCopyMode = False这似乎消除了这个错误,因为我不再看到popup窗口。

下一步

我意识到,每个练习册中的条件格式和复杂的公式都是很大的障碍,所以我鼓起勇气再次攻破每本练习册。 我可以随意添加/删除WB-B中的所有button/条件格式,以至于每次打开文件时都会感到恼火(这是一种可能性)。

我现在唯一能想到的就是将每个练习册分成“一半”。

在WB-A中,我可以看到有4张或5张表格可以分配给一个新的工作簿,我可以限制WB-B中的表格数量(目前它在每次更新时添加一张新表格,截至今天共计约160张表格) 。 限制WB-B中的表格数量意味着我将不得不创build一个包含所有“切断后”表格相关数据的隐藏表格,因为有依赖于所述数据成功完成的子表格。 这些将被删除的表格将需要移动到新的工作簿,因为它们可视地帮助完整地分析工作簿。

请求帮助

在进行所有这些之前,我希望有人知道我可以用一些简单的VBA来解决所有这些问题。 在我看来,Excel必须caching与这些工作簿相关的内容,但我一直无法find任何有关这方面的信息。 我的印象是,使用Application.CutCopyMode = False清除剪贴板,但也许有更多的。

更新(1-1-16)

看来这个问题直接关系到存储在%temp%中的文件。 清除后,我不再遇到任何问题。

所以总结一下

1)什么是清除Excel可能使用的所有caching(包括剪贴板)的正确方法?

2)什么可以解释一个工作簿无法打开和崩溃的Excel,但切换到不同的Office版本成功打开?

3)是否有一行代码将删除Excel存储在%temp%所有临时文件?

相关系统信息:Windows 10 Pro 64位,AMD FX 8350,16GB DDR3,Office365 1609(Build 7369.2055)+

注意:我也在我的笔记本电脑上看到这个问题,这是英特尔/ DDR4,所以这个问题与处理器/ RAM有什么关系是值得怀疑的。

 Public Declare Function CloseClipboard Lib "user32" () As Long Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function EmptyClipboard Lib "user32" () As Long Property Hwnd As Long read-only Member of Excel.Application 

正常的架构是一个用户界面,另一个是数据。 我认为你应该主要在数据库中,而不是使用电子表格作为数据库。

Excel不会将任何内容复制到剪贴板,直到它退出或粘贴到非Excel程序中。

所以调用OpenClipboard,EmptyClipboard,然后CloseClipboard。 这将消除关于记忆的任何含糊之处。 最终的结果将不会被使用。 根据帮助不要使用Excel的HWnd,但使用0。

这是VB6 / VBA6 alias是可选的。

 Private Declare Function CloseClipboard Lib "user32" () As Long Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function EmptyClipboard Lib "user32" () As Long Private Sub Form_Load() x = OpenClipboard(0) y = EmptyClipboard() z = CloseClipboard() MsgBox x & " " & y & " " & z End Sub