我有两本相互协作的工作簿。每周两次(通过MS W10任务计划程序和一个简单的vbscript,运行Excel,显示设置为" Hidden"),其中一个工作簿打开(WB-A),执行Web查询,使用检索到的数据更新其四张纸,保存自己,然后打开另一张工作簿(WB-B)以开始进一步处理新数据。
这一切都很美妙,一时间。现在,在此更新过程完成后,我可以回到工作簿的唯一方法是手动循环到另一个Office构建版本(通过" officec2rclient.exe /update user updatetoversion= 16.0.XXXX.XXXX&#34 ;,我一直在1609和1610之间切换)。
如果不执行此操作,Excel将崩溃,我将看到错误告诉我Excel已经停止响应"。如果我先打开Excel,然后尝试打开其中一个工作簿,有时我会看到只有" 400"显示在一个关键警报MsgBox内。
最初我认为这个问题可能是由WB-B的重量引起的(磁盘上大约70mb,内存大约4GB),所以我开始抨击它。我删除了所有无关的条件格式,命名范围和外部链接(到WB-A)。这似乎有很大帮助,至少在加载时间。
乍一看,似乎我已经通过这些改进解决了这个问题。优化外部链接可将呼叫次数减少约60%,并将总内存使用量减少约50%。直到下一次预定的更新之后,我才意识到我还没有走出困境。
1)它们包含表单按钮(控件),条件格式,命名范围,公式,并且都是启用宏的。
2)当它们无法打开时,它们会在按钮(控件)出现时失败(我相信当工作簿正在完成它的"计算"过程)。
3)尝试使用内置"打开和修复" Excel中的函数无法在正常尝试的同一时刻加载工作簿。
4)执行Office365的修复安装(快速和在线方法)无法解决问题。
5)我还有其他时间打开WB-B,每个单元格都被格式化为日期。删除"正常"的错误保存格式纠正了这个问题。
在这个开始发生之前,我正在接受" The picture is too large and will be truncated "消息,因为自动更新过程似乎正在结束并保存每个工作簿。在保存之前,我添加了Application.CutCopyMode = False
,这似乎消除了这个错误,因为我不再看到弹出窗口。
我意识到每个工作簿中的条件格式和复杂公式都是很大的障碍,因此我鼓起勇气再次攻击每个工作簿。我可以随意添加/删除WB-B中的所有按钮/条件格式,这样会令人恼火(每次打开文件时处理),这是可能的。
此时我唯一能想到的就是将每个工作簿拆分为" half"。
我可以看到分配给WB-A中的新工作簿的4或5张表格,我可以限制WB-B中的工作表数量(目前它在每次更新期间添加了一张新工作表,总共约160张表格作为今天的)。限制WB-B中的表格数量意味着我必须创建一个隐藏的表单,其中包含所有" post cut-off"表'相关数据,因为存在依赖于所述数据成功完成的Subs。这些要删除的表格需要移动到新的工作簿,因为它们在视觉上有助于对工作簿的整体分析。
在进入所有这些之前,我希望有人知道我可以使用一些简单的VBA来解决所有这些问题。在我看来,Excel必须缓存与这些工作簿相关的东西,但我无法找到有关它的任何信息。我的印象是使用Application.CutCopyMode = False
清除了剪贴板,但可能还有更多内容。
问题似乎与%temp%中存储的文件直接相关。清除后,我不再遇到任何问题。
1)清除Excel可能正在使用的所有缓存(包括剪贴板)的正确方法是什么?
2)什么可以解释工作簿无法打开并崩溃Excel,但在切换到其他Office版本后成功打开? 击>
3)是否有一行代码会删除%temp%
中Excel存储的所有临时文件?
相关系统信息:Windows 10 Pro 64位,AMD FX 8350,16 GB DDR3,Office365 1609(Build 7369.2055)+
注意:我的笔记本电脑上也出现了这个问题,即Intel / DDR4,因此该问题与处理器/ RAM有关,这是值得怀疑的。
答案 0 :(得分:0)
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
正常的架构是一方面的UI和另一方面的数据。我认为你应该主要是在数据库中,而不是使用电子表格作为数据库。
在退出或粘贴非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