2013-10-22 227 views
1

我有一個宏的Excel,沒有太花哨,沒有對象,只是普通的舊週期與公式。基本上是這樣的:Excel,VBA:清除內存

我循環遍歷一列中的行,爲單元分配相當大的SUMPRODUCT函數而不執行它們。一旦我循環遍歷該行,我會執行Range.Value = Range.Value兩次以執行公式並將結果保存爲值。然後我去下一個專欄。

由Excel使用的每列內存顯着增加,在宏完成後我保存文件 - 內存仍然使用(如果我可以信任任務管理器)。關閉並重新打開文件後 - 當然,所有內存都已釋放,我可以繼續工作。由於內存限制,我無法在32位Excel上處理所需的所有列。

我想知道,也許有一些技巧,我可以在列之間實現,使Excel忘記它一直記住的任何東西?我並不在乎它是否會影響性能(以防它對緩存進一步計算有用),但我只是需要防止內存使用量過大而無法處理。我搜索了一下,但所有的建議都與把大對象設置爲無關 - 我沒有真正設置任何東西,只是循環,所以可能不適用於我的情況。

代碼是這樣(沒有它在我的權利,但它是它是什麼一般的簡化版本):

for i = 1 to 12 
    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Font.Color = vbWhite 

    for m = 1 to x 
     ThisWorkbook.ActiveWorksheet.Cells(m, i).Formula = "'=SUMPRODUCT(blah)" 
    next m 

    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value 
    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value 

    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Font.Color = vbBlack 
next i 

基本上,我將它們上色白色,所以我不看到雜亂的功能文本,添加功能,執行它,保存爲值,顏色文本黑色。 重要的補充:我使用SUMPRODUCT來從封閉文件中求和一些單元格。

+1

向我們展示您的代碼:) – 2013-10-22 08:55:29

+0

是的,對不起,添加了簡化的代碼示例:)所有其他代碼基本上都是清除某些單元格,消息框和幾個ifs中的內容,這些內容不應該增加主題。 – pokrishka

+1

你可以嘗試用VBA代碼替換'SUMPRODUCT'調用嗎?這樣,您可以對外部工作簿何時打開和關閉有更多的控制權,或者甚至可以將它們隔離到單獨的實例中。獎勵:不需要'.Value = .Value'。 – Chel

回答

4

這不是真的足夠的代碼來幫助你提高效率。現在我可以爲你指出一些提示。

要記住的第一件事就是申請屏幕更新在宏觀的啓動開關爲false。

Application.ScreenUpdating = False

然後只是宏代碼

Application.ScreenUpdating = True

改變現在的字體顏色是不必要的結束之前切換回。您的屏幕將被鎖定用於在宏執行時進行刷新,因此在宏完成工作之前您不會看到更改。

請考慮,禁用事件。

Application.EnableEvents = FalseApplication.EnableEvents = true相同的思路與屏幕更新。

第二件事是利用Evaluate()函數。請谷歌,並閱讀有關該功能可以有多高效。

而不是將函數放入單元格,然後做.Value = .Value您可以只是Evaluate()表達式並將結果直接返回到更快的單元格!

所以你可以做這樣的事情

for i = 1 to 12 
    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = Evaluate("=SUM(blah)") 
next i 

我希望你的想法。

這裏是有提示就如何加快宏幾個環節:

+0

感謝您的提示,我會嘗試他們!起初,我試圖讓我需要VBA的價值觀,但它慢慢電池迭代細胞,而功能,如果我計算它們一下子都相當快,所以我不得不讓我描述的方式。我肯定會嘗試評估現在,看起來這可以幫助我的情況,非常感謝你! – pokrishka

+0

至於整體題目問題,沒有辦法清除Excel使用的內存,而不關閉它? – pokrishka

+0

不,實際上沒有辦法*清除*內存。看一下'Set objName = Nothing',但如果你需要在代碼中稍後重用對象,這不會真的有幫助。 – 2013-10-22 11:16:53

1

我知道這是一個老問題,但似乎工作就是保存工作簿的方式。在運行一段時間ThisWorkbook.Save每一次,如果你在任務管理器監視EXCEL,你會發現,它清除了內存顯著量。

它好像Excel可能會被緩存某些函數調用或東西,節省清除該緩存。