在尝试计算一个或多个公式时,Excel耗尽了资源

时间:2013-03-10 23:53:42

标签: excel excel-vba excel-2013 vba

我有一本工作手册可以对我的费用进行'智能'图表。它已经运行了一年,现在有很多图表和费用。每当我更改任何内容或打开工作簿时,Excel现在都会抛出资源不足的错误。事实上,我有很多的资源,而且几乎没有使用任何资源。

Win8 64bit w/ 8 core CPU and 32GB of ram
Office 2013 64bit

我有2张纸,第一张名为费用的纸张有3列[日期,描述,金额]和大约1500行数据。第二张纸有很多(大约500个)公式,它们都是相同的,并且旨在“将日期X和Y之间的所有费用汇总,其中描述匹配 - 一些针 - ”。我的公式是:

=
ABS(
    SUMPRODUCT(
        --(Expenses!A:A >= DATE(2011,12,1)), 
        --(Expenses!A:A < DATE(2012,1,1)), 
        --(ISNUMBER(FIND(C50,Expenses!B:B))),
        Expenses!C:C
    )
)

我可以为Excel提供更多资源吗? (我很高兴它可以使用我的所有内存,并将我的CPU用了几分钟)。

我能用这种方式更有效吗?

据我所知,这个公式正在创建一个大型网格并用它屏蔽我的费用列表,并且对于每个公式,必须创建此网格。我应该创建一个宏来更有效地执行此操作吗?如果我有一个宏,我想从某个单元格中调用它

=sumExpenses(<startDate>, <endDate>, <needle>)

这可能吗?

感谢。

3 个答案:

答案 0 :(得分:6)

我有一个类似的问题,其中有一些数组公式大约150行,我得到了这个错误,这真的让我困惑,因为实际上没有那么多公式可以计算。我联系了我们的IT人员,他解释了以下内容,其中一些是我理解的,其中大部分都没有:

通常,当计算机尝试处理大量数据时,它会使用多线程计算,它使用计算机欺骗自己认为具有的所有8个处理器。关闭多线程计算时,计算机不会抛出“Excel资源耗尽...”错误。

要关闭多线程计算,请转到Excel工作簿中的“文件”选项卡,然后选择“选项”。在出现的框的右侧选择“高级”,然后向下滚动到“公式”标题。在该标题下有一个复选框,显示“启用多线程计算”。取消它,然后选择“确定”并重新计算公式。

答案 1 :(得分:2)

我开始创建一个函数,希望能够复制你当前的等式在VBA中所做的一些差异。由于我不知道你的第二张表的细节,缓存可能根本没有帮助。

如果你的第二张图片对sumExpenses的所有来电都使用相同的日期范围,那么它应该更快一些,因为它会在第一遍中预先计算所有内容,如果你的日期范围发生变化那么它只是做了一个很多工作都没有。

Public Cache As Object
Public CacheKey As String

Public Function sumExpenses(ByVal dS As Date, ByVal dE As Date, ByVal sN As String) As Variant
Dim Key As String
Key = Day(dS) & "-" & Month(dS) & "-" & Year(dS) & "_" & Day(dE) & "-" & Month(dE) & "-" & Year(dE)

    If CacheKey = Key Then
        If Not Cache Is Nothing Then
            If Cache.Exists(sN) Then
                sumExpenses = Cache(sN)
                Exit Function
            End If
            Set Cache = Nothing
        End If
    End If
    CacheKey = Key
    Set Cache = CreateObject("Scripting.Dictionary")

    Dim Expenses As Worksheet
    Dim Row As Integer
    Dim Item As String

    Set Expenses = ThisWorkbook.Worksheets("Expenses")

    Row = 1

    While (Not Expenses.Cells(Row, 1) = "")
        If Expenses.Cells(Row, 1).Value > dS And Expenses.Cells(Row, 1).Value < dE Then
            Item = Expenses.Cells(Row, 2).Value
            If Cache.Exists(Item) Then
                Cache(Item) = Cache(Item) + Expenses.Cells(Row, 3).Value
            Else
                Cache.Add Item, Expenses.Cells(Row, 3).Value
            End If
        End If
        Row = Row + 1
    Wend

    If Cache.Exists(sN) Then
        sumExpenses = Cache(sN)
    Else
        sumExpenses = CVErr(xlErrNA)
    End If

End Function

Public Sub resetCache()
    Set Cache = Nothing
    CacheKey = ""
End Sub

答案 2 :(得分:1)

这可能有很多原因。我只希望Excel能告诉我们通常的嫌疑人中的哪一个(或更多)&#39;是在这个时候犯了RAM占用的罪行。

同时寻找

  1. 循环参考

  2. 碎片化条件格式(由切割,粘贴,排序,删除和添加单元格或行引起。

  3. 错误导致#N / A,#REF,#DIV / 0!等

  4. 过度使用易失性函数TODAY(),NOW()等

  5. 使用了太多不同的格式

  6. ......按顺序

    当你在那里时,请检查

    1. 链接断开。依赖外部数据的新值的公式可能会返回错误。

    2. 包含#REF!的所有公式。如果你的公式混乱,那么这些公式也可能存在。它们不会导致错误标志,但可能会导致一些未报告的错误。如果您的公式满足早期条件,则公式的部分包含#REF!在其他条件成熟之前不会被评估。