2017-04-26 84 views
1

我在VBA中廣泛使用了32位2013 Excel。我已禁用硬件圖形加速和COM加載項,但我仍然努力解決以下問題:Excel VBA:內存超過第二次導入的限制

我導入另一個大型工作簿的格式與單元格但沒有公式(〜3MB Excel文件)的內容到有問題的Excel工作簿。第一次嘗試 - 當內容尚未導入時 - 導入成功。我導入通過VBA類似於下面的代碼內容:

Application.Workbooks(F_Home).Activate 
Workbooks(F_Home).Sheets(Sheet1).Visible = xlSheetVisible 
... 
Application.Workbooks(F_Source).Activate 
Workbooks(F_Source).Sheets(S_Source).Cells.Copy Destination:=Workbooks(F_Home).Sheets(Sheet1).Cells 
Application.Workbooks(F_Home).Activate 

F_Home是有問題的Excel工作簿和F_Source與我們導入的內容的工作簿在這樣做時第一次它的工作原理,然後。我保存該文件並關閉它,然後重新打開該文件,然後再次嘗試。在第二次嘗試導入內容時(當內容已經導入時),F_Home工作簿在將F_Source內容複製到的行上崩潰,出現內存不足錯誤(沒有足夠的內存來完成此操作...) F_Home。

使用Process Explorer我發現Excel進程的虛擬內存大小通常在600mb-700mb左右,但是當我們運行VBA腳本第二次導入內容時,虛擬內存大小突然跳到4GB(這不會發生在第一次,其中保持在600mb - 700mb範圍內)。我應該如何解決這個問題?我無法做一個解決方法,比如在第二次導入內容之前保存文件,因爲使用了該文件的時間戳,並且通過VBA保存文件會使某些用戶感到困惑。

謝謝你的幫助。

+0

工作簿上沒有公式要導入的內容 - 只是數據。 – haans

+1

您的問題來自您複製1048576 * 16384單元的事實。你知道那有多大?你真的需要這樣做嗎?您只能複製其中包含數據的範圍,而且速度更快,計算成本更低。 – Masoud

+0

另外,如果沒有公式,請考慮將它們分配給範圍而不是複製/粘貼。 – Masoud

回答

0

複製並粘貼整張紙不是明智的做法。假設您有來自「A1:Z99999」的數據。你可以做到這一點會更快。

Set S_Range = Workbooks(F_Source).Sheets(S_Source).Range("A1:Z99999") 
Set H_Range = Workbooks(F_Home).Sheets(Sheet1).Range("A1:Z99999") 

H_Range.Value = S_Range.Value 

也讀出why you should avoid selecting and activating in vba

+0

不幸的是,我遇到了使用此方法複製數據的問題。處於調試模式時,將使用F_Source工作簿中的所有數據填充S_Range變量,並將數據複製到F_Home工作簿。但是,在不調試代碼的情況下調用此函數時,它僅複製3行數據,而不是F_Source工作簿中的數千行。 – haans

+0

請[編輯](http://stackoverflow.com/posts/43644970/edit)你的問題,幷包括你正在使用的確切代碼。這部分代碼沒有任何問題。別的東西會觸發它。 – Masoud