fla*_*nut 9 excel vba excel-vba excel-2013
我有一本工作簿可以对我的费用进行'智能'图表.它已经运行了一年,现在有很多图表和费用.每当我更改任何内容或打开工作簿时,Excel现在都会抛出资源不足的错误.事实上,我有很多资源,而且几乎没有使用任何资源.
Win8 64bit w/ 8 core CPU and 32GB of ram
Office 2013 64bit
Run Code Online (Sandbox Code Playgroud)
我有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
)
)
Run Code Online (Sandbox Code Playgroud)
我可以给Excel更多资源吗?(我很高兴它可以使用我的所有内存,并将我的CPU用了几分钟).
有没有更有效的方法我可以做这个公式?
据我所知,这个公式正在创建一个大型网格并用它屏蔽我的费用列表,并且对于每个公式,必须创建此网格.我应该创建一个宏来更有效地执行此操作吗?如果我有一个宏,我会想从某个单元格中调用它
=sumExpenses(<startDate>, <endDate>, <needle>)
Run Code Online (Sandbox Code Playgroud)
那可能吗?
谢谢.
小智 6
我有一个类似的问题,有几个数组公式下来约150行,我得到这个错误,这真的困惑我,因为真的没有那么多的公式来计算.我联系了我们的IT人员,他解释了以下内容,其中一些是我理解的,其中大部分内容都没有:
通常,当计算机尝试处理大量数据时,它会使用多线程计算,它使用计算机欺骗自己认为具有的所有8个处理器.关闭多线程计算时,计算机不会抛出"Excel耗尽资源..."错误.
要关闭多线程计算,请转到Excel工作簿中的"文件"选项卡,然后选择"选项".在出现的框的右侧选择"高级",然后向下滚动到"公式"标题.在该标题下有一个复选框,显示"启用多线程计算".取消它,然后选择"确定"并重新计算您的公式.
我尝试创建一个函数,希望能够复制当前方程在 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
Run Code Online (Sandbox Code Playgroud)