11

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

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

我有 2 张工作表,第一个名为Expenses的工作表有 3 列 [Date,Description,Amount] 和大约 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>)

那可能吗?

谢谢。

4

3 回答 3

8

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

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

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

于 2015-07-22T20:50:57.837 回答
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
于 2013-03-11T01:44:01.627 回答
1

这可能有很多原因。我只是希望 Excel 能告诉我们哪个(或更多)“通常的嫌疑人”此时正在犯下占用 RAM 的罪行。

也找

  1. 循环引用

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

  3. 导致#N/A、#REF、#DIV/0 的错误!ETC,

  4. 过度使用 volatile 函数 TODAY()、NOW() 等。

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

... 以该顺序

当你在那里时,检查

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

  2. 任何包含#REF! 的公式。如果你的公式很乱,这些也可能存在。它们不会导致错误标志,但可能会导致一些未报告的错误。如果您的公式满足较早的条件,则公式部分包含#REF!除非其他条件为准,否则不会进行评估。

于 2016-07-17T05:55:02.807 回答