首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Excel在试图计算一个或多个公式时耗尽了资源。

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

Stack Overflow用户
提问于 2013-03-10 23:53:41
回答 4查看 47.4K关注 0票数 11

我有一本工作簿要做“聪明”--关于我的开支的图表。它已经运行了一年,现在有很多图表和费用。Excel现在每当我更改任何东西或打开工作簿时都会抛出一个资源不足的错误。问题是,我有很多资源,而且几乎不使用其中任何一种资源。

代码语言:javascript
运行
复制
Win8 64bit w/ 8 core CPU and 32GB of ram
Office 2013 64bit

我有两张纸,第一张叫做费用,有三栏日期,描述,金额和大约1500行的数据。第二张纸有很多公式(大约500个),它们都是相同的,目的是“在描述匹配-some穿针的日期X和Y之间进行所有费用之和”。我的公式是:

代码语言:javascript
运行
复制
=
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几分钟)。

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

我知道这个公式正在创建一个大网格,并用它掩蔽我的费用列表,并且每个公式都必须创建这个网格。我应该创建一个宏来更有效地完成这个任务吗?如果我有一个宏,我想从一个单元格调用它,就像

代码语言:javascript
运行
复制
=sumExpenses(<startDate>, <endDate>, <needle>)

这有可能吗?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-11 01:44:01

我尝试创建一个函数,希望它能够复制VBA中当前公式的功能,但有一些不同之处。由于我不知道您的第二个工作表的具体内容,缓存可能根本没有帮助。

如果您的第二个工作表对所有对sumExpenses的调用使用相同的日期范围,那么它应该会更快一些,因为它预先计算了第一次传递中的所有内容,如果您的日期范围在整个过程中都发生了变化,那么它只是做了大量的工作而毫无意义。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2015-07-22 20:50:57

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

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

要关闭多线程计算,请进入Excel工作簿中的“File”选项卡并选择“Options”。在显示的框的右侧,选择“高级”并向下滚动到“公式”标题。在这个标题下有一个复选框,上面写着“启用多线程计算”。取消它,然后选择'OK‘并重新计算您的公式。

票数 8
EN

Stack Overflow用户

发布于 2016-07-17 05:55:02

这可能有很多原因。我只希望Excel能告诉我们,在这段时间里,哪一个(或更多的)“普通嫌疑犯”犯了占用内存的罪行。

也要找

  1. 循环引用
  2. 分段条件格式(由裁剪、粘贴、排序、删除和添加单元格或行引起。
  3. 导致#N/A,#REF,#DIV/0的错误!等,
  4. 过度使用今天()、现在()等等的易失性函数。
  5. 使用的格式太多了

..。按这个顺序

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

  1. 断了的链接。依赖于外部数据的新值的公式可能返回错误。
  2. 任何包含#REF的公式!如果你的公式是那样的糟糕,这些很可能也存在。它们不会导致错误标志,但可能会导致一些未报告的错误。如果您的公式满足于前面的条件,则公式中包含#REF的部分!在其他条件占上风之前不会进行评估。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15329199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档