Excel内存pipe理:closuresExcel有什么作用?

运行我的macros时出现“内存不足”错误。 我的macros设置可以分为两部分:1)打开一个Excel文件并运行一堆macros2)打开另一个非常大的Excel文件(800 MB)并提取数据

– macros的第一部分完成就好了。 当Part#2启动时,当它试图打开Excel文件时会挂起。

– 我已经想出了一个解决方法是在部件1完成后保存工作簿,closures工作簿,重新打开工作簿,然后运行macros部件#2。

– 我读过,也许保存工作簿可以释放一些内存。 所以我在第一部分结束之后,第二部分开始之前添加了代码保存,但是没有帮助。

无论如何,我可以使用VBA释放相同数量的内存,如果我closures并重新打开Excel? 还是至less有其他的方法来释放内存,除了清空variables?

我附上了本地窗口的图片,以显示部件1完成后仍然存储在内存中的内容 – 这正好是在我得到“内存不足”错误之前。 我没有得到它的是,我的解决方法(即closures并重新打开工作簿来运行零件#2)仍然创build所有非本地variables您在本地屏幕截图中看到之前运行零件#2。 所以我不能通过将variables设置为Nothing来释放更多的内存。

在这里输入图像说明

这是我的macros的肉:

 Sub main_macro() Application.ScreenUpdating = False Application.DisplayAlerts = False Application.Calculation = xlCalculationManual Dim reg_wb, thisfile, sc_wb As Workbook Set thisfile = ThisWorkbook GageSht.Select gage_factors = Range("C3", Range("C3").End(xlDown).End(xlToRight)).Value config_list = Range("H3", Range("H3").End(xlDown).End(xlToRight)).Value regime_sub_list = Range("O3", Range("O3").End(xlDown).End(xlToRight)).Value InputSht.Select gage_tape_run = sort_rng_arr(Range("gage_list").Row, Range("gage_list").Column, Range("gage_list").End(xlToRight).Column) If UBound(gage_tape_run) > 1 Then unique_gage_list = remove_dupes_array(Application.Index(gage_tape_run, 0, 1)) Else Dim single_gage(1 To 1) As Variant single_gage(1) = Range("gage_list") unique_gage_list = single_gage End If WOWsht.Visible = True WOWsht.Select If Range("A3") <> "" Then Range("A3", Range("A3").End(xlToRight).End(xlDown)).ClearContents End If WOWsht.Visible = False InputSht.Select Range("regime_list", Range("regime_list").End(xlDown)).Cells.ClearContents 'Part #1 Call get_predicted_data(thisfile, gage_tape_run, unique_gage_list, gage_factors, config_list) 'Part #2 Call get_corrected_test_data(thisfile, gage_tape_run, unique_gage_list, gage_factors, config_list, regime_sub_list) Application.ScreenUpdating = True Application.DisplayAlerts = True Application.Calculation = xlCalculationAutomatic End Sub 'Part 2 Sub get_corrected_test_data(thisfile, gage_tape_run, unique_gage_list, gage_factors, config_list, regime_sub_list) thisfile.Activate InputSht.Select Set regimerng = Range("regime_list", Range("regime_list").End(xlDown)) regime_list = regimerng.Value reg_dir = Range("reg_dir") If Right(reg_dir, 1) <> "\" Then reg_dir = reg_dir & "\" End If reg_f = Range("reg_f") 'Part 2 fails when trying to open the workbook If AlreadyOpen(reg_f) Then Else Workbooks.Open reg_dir & reg_f End If Set reg_wb = Workbooks(reg_f) reg_wb.Activate Application.ScreenUpdating = False Application.DisplayAlerts = False Application.Calculation = xlCalculationManual ' rest of the macro ' End Sub 

你真的不应该使用800MB的Excel文件! 这是一个疯狂的文件大小的工作簿,我甚至觉得它甚至打开。 如果你有这么多的数据,你应该移动它的MS Access和查询数据库。 这里和这里 , 这里和这里的例子。

注意:你可能也想看看为什么你的Excel文件很大 。