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

Excel在尝试计算一个或多个公式时耗尽了资源,excel,excel-2013,vba,Excel,Excel 2013,Vba,我有一本手册,可以用“智能”图表显示我的开支。它已经运行了一年,现在有很多图表和费用。现在,每当我更改任何内容或打开工作簿时,Excel都会抛出资源不足错误。问题是,我有很多资源,它几乎不使用任何资源 Win8 64bit w/ 8 core CPU and 32GB of ram Office 2013 64bit 我有两张表,第一张叫做“费用”的表有3列[日期、说明、金额]和大约1500行数据。第二张纸上有很多(500左右)的公式,它们都是相同的,目的是“在描述匹配的情况下,将X和Y日期之

我有一本手册,可以用“智能”图表显示我的开支。它已经运行了一年,现在有很多图表和费用。现在,每当我更改任何内容或打开工作簿时,Excel都会抛出资源不足错误。问题是,我有很多资源,它几乎不使用任何资源

Win8 64bit w/ 8 core CPU and 32GB of ram
Office 2013 64bit
我有两张表,第一张叫做“费用”的表有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
    )
)
=
腹肌(
SUMPRODUCT(
--(费用!A:A>=日期(2011年12月1日)),
--(费用!A:A<日期(2012,1,1)),
--(ISNUMBER(查找(C50,费用!B:B)),
费用!C:C
)
)
我可以给Excel更多的资源吗?(我很高兴它能使用我所有的ram,并用我的CPU运行几分钟)

有没有更有效的方法我可以做这个公式

我知道这个公式正在创建一个大的网格,并用它来掩盖我的费用清单,而且对于每个公式,都必须创建这个网格。我是否应该创建一个宏来更有效地执行此操作?如果我有一个宏,我会想从一个类似

=sumExpenses(<startDate>, <endDate>, <needle>)
=总费用(,)
可能吗


谢谢。

我尝试过创建一个函数,希望它能复制当前方程式在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
作为对象的公共缓存
公钥作为字符串
公共函数sumExpenses(ByVal dS作为日期,ByVal dE作为日期,ByVal sN作为字符串)作为变量
将键变暗为字符串
键=日(dS)&“-”月(dS)&“-”年(dS)&“日(dE)&“-”月(dE)&“-”年(dE)
如果CacheKey=Key,则
如果不是,则缓存为空
如果Cache.Exists(sN),则
sumExpenses=缓存(sN)
退出功能
如果结束
设置缓存=无
如果结束
如果结束
CacheKey=Key
Set Cache=CreateObject(“Scripting.Dictionary”)
将费用作为工作表
将行设置为整数
将项目设置为字符串
设置费用=此工作簿。工作表(“费用”)
行=1
While(非费用.单元格(第1行)=“”)
如果Expenses.Cells(第1行).Value>dS和Expenses.Cells(第1行).Value
我遇到了一个类似的问题,大约150行下有几个数组公式,我得到了这个错误,这让我很困惑,因为要计算的公式实在不多。我联系了我们的IT人员,他解释了以下内容,其中一些我理解,但大部分我不理解:

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


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

原因可能很多。我只希望Excel能告诉我们,目前有哪一个(或多个)的“普通嫌疑犯”犯了贪吃公羊罪

也找

  • 循环引用

  • 分段条件格式(由剪切、粘贴、排序、删除和添加单元格或行引起)

  • 导致#N/A、#REF、#DIV/0!等的错误

  • 过度使用volatile函数TODAY()、NOW()等

  • 使用了太多不同的格式

  • …按顺序

    当你在那里的时候,检查一下

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

  • 任何包含#REF!的公式。如果您的公式被弄乱,这些公式也可能存在。它们不会导致错误标志,但可能会导致一些未报告的错误。如果您的公式满足早期条件,则在其他条件出现之前,将不会计算包含#REF!的公式部分


  • 单个对象可能增长过大。语言(如.NET)中存在大小限制一个对象可以有多大。我想。我希望有其他用户的工作簿比我大得多,也比我复杂得多。我很惊讶,我已经在这么小的数据集上遇到了问题。这是一个漂亮的excel弹出错误还是一个愤怒的windows错误?
    --
    在您的应用程序中的数组之前做了什么
    sumproduct
    ?从未真正使用过它,也不知道它的用途。(1)
    SUMIFS
    sumproduct
    (2)如果工作簿损坏,我会尝试“重新生成”该文件