簡體   English   中英

更新和保存后,Excel工作簿無法打開

[英]Excel Workbook fails to open after updating and saving

我有兩本工作簿,彼此協同工作。 每周兩次(通過MS W10任務計划程序和一個簡單的vbscript,運行Excel並將顯示設置為“隱藏”),其中一個工作簿打開(WB-A),執行Web查詢,使用檢索到的數據更新四個其工作表,自行保存,然后打開其他工作簿(WB-B)以開始進一步處理新數據。

這一切都很美妙,一時間。 現在,在此更新過程完成后,我可以回到工作簿的唯一方法是,如果我手動循環到另一個Office構建版本(通過“ officec2rclient.exe / update user updatetoversion = 16.0.XXXX.XXXX ”,我已經在1609和1610之間切換)。

如果不這樣做,Excel將崩潰,我將看到錯誤告訴我Excel已“停止響應”。 如果我先打開Excel,然后嘗試打開其中一個工作簿,有時我會看到一個錯誤,在關鍵警報MsgBox中只顯示“400”。

最初我認為這個問題可能是WB-B的重量造成的(磁盤上大約70mb,內存大約4GB),所以我開始抨擊它。 我刪除了所有無關的條件格式,命名范圍和外部鏈接(到WB-A)。 這似乎有很大幫助,至少在加載時間。

乍一看,似乎我已經通過這些改進解決了這個問題。 優化外部鏈接可將呼叫次數減少約60%,並將總內存使用量減少約50%。 直到下一次預定更新后我才意識到我還沒有走出困境。

有關兩本工作簿的相關詳細信息

1)它們包含表單按鈕(控件),條件格式,命名范圍,公式,並且都是啟用宏的。

2)當它們無法打開時,它們會在按鈕(控件)出現時失敗(我相信工作簿正在完成其“計算”過程)。

3)嘗試在Excel中使用內置的“打開並修復”功能無法在正常嘗試的同一時刻加載工作簿。

4)執行Office365的修復安裝(快速和在線方法)無法解決問題。

5)我還有其他時間打開WB-B,每個單元格都被格式化為日期。 刪除錯誤保存的“正常”格式可以糾正問題。

在此問題之前

在這個開始發生之前,我得到了“ 圖片太大並且將被截斷 ”的消息,因為自動更新過程似乎正在結束並保存每個工作簿。 在保存之前,我添加了Application.CutCopyMode = False ,這似乎消除了該錯誤,因為我不再看到彈出窗口。

下一步

我意識到每個工作簿中的條件格式和復雜公式都是重大障礙,因此我鼓起勇氣再次攻擊每個工作簿。 我可以隨意添加/刪除WB-B中的所有按鈕/條件格式,這樣會令人惱火(每次打開文件時處理),這是可能的。

在這一點上,我唯一能想到的就是將每個工作簿分成“一半”。

我可以看到有4或5張表格分配給WB-A中的新工作簿,我可以限制WB-B中的工作表數量(目前它在每次更新時添加了一張新工作表,截至今天共計約160張) 。 限制WB-B中的表格數量意味着我必須創建一個包含所有“截止后”表格的相關數據的隱藏表格,因為存在依賴於所述數據成功完成的Subs。 這些要刪除的表格需要移動到新的工作簿,因為它們在視覺上幫助完整地分析工作簿。

請求幫助

在進入所有這些之前,我希望有人知道我可以使用一些簡單的VBA來解決所有這些問題。 在我看來,Excel必須緩存與這些工作簿相關的東西,但我無法找到有關它的任何信息。 我的印象是使用Application.CutCopyMode = False清除了剪貼板,但也許還有更多的東西。

更新(1-1-16)

該問題似乎與%temp%中存儲的文件直接相關。 清除后,我不再遇到任何問題。

總結一下

1)清除Excel可能正在使用的所有緩存(包括剪貼板)的正確方法是什么?

\n

2)什么可以解釋工作簿未能打開並崩潰Excel,但切換到其他Office構建版本成功打開?

3)是否有一行代碼將刪除Excel存儲在%temp%所有臨時文件?

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

注意:我的筆記本電腦上也出現了這個問題,即Intel / 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

通常的架構是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM