2013-10-22 178 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可能会被缓存某些函数调用或东西,节省清除该缓存。