为什么Excel需要很长时间来计算和生成不准确的结果?
我有一个30万行的电子表格BO2009。 只有一列包含公式其他所有值都是粘贴值,因此只需要在整个工作簿中计算一个公式。 这里是公式: =IFERROR(INDEX('RE2009'!H:H,MATCH('BO2009'!A2,'RE2009'!A:A,0)),1)
这个公式被复制到底部表,所以300K次。
RE2009表有180k行。 'RE2009'!H:H包含十进制数字和'RE2009'!A:A,'BO2009'!A:A包含ID代码 – 数字和字母的8个字符组合。 “RE2009”!A:A,'BO2009'!A:A格式化为一般。
我一直使用INDEX / MATCH,而我的大多数电子表格不是300k长,60k-100k是典型的。 现在我的CPU需要花费几分钟的时间才能完成计算。
这是正常的吗? 有没有办法提高Excel的performance?
最重要的是,我得到不准确的结果:而不是0.3查找会产生一个错误。
正如所build议的,我已经将BO2009表格过滤到80k行,但仍然有相同的问题。 我决定看一个特别的公式: =IFERROR(INDEX('RE2009'!H:H,MATCH('BO2009'!A108661,'RE2009'!A:A,0)),1)
工作正常。 使用MATCH函数查找的ID是查找数组中的第3个条目,但仍不能产生正确的值(0.3)
看来你已经find了一个令人满意的解决scheme,但是作为一个好奇的问题,你可能希望按照目前的基于公式的解决scheme来计算这个问题,看看速度是否有显着的提高。
Sub index_match_mem() Dim v As Long, vVALs As Variant, vTMP As Variant Dim dRE2009 As Object Debug.Print Timer Application.ScreenUpdating = False With Worksheets("RE2009") With .Cells(1, 1).CurrentRegion With .Resize(.Rows.Count, 8) vTMP = .Cells.Value2 End With End With End With Set dRE2009 = CreateObject("Scripting.Dictionary") dRE2009.CompareMode = vbTextCompare For v = LBound(vTMP, 1) To UBound(vTMP, 1) If Not dRE2009.exists(vTMP(v, 1)) Then _ dRE2009.Add Key:=vTMP(v, 1), Item:=vTMP(v, 8) Next v With Worksheets("BO2009") With .Cells(1, 1).CurrentRegion With .Resize(.Rows.Count - 1, 2).Offset(1, 0) vVALs = .Cells.Value2 For v = UBound(vVALs, 1) To LBound(vVALs, 1) Step -1 If dRE2009.exists(vVALs(v, 1)) Then vVALs(v, 2) = dRE2009.Item(vVALs(v, 1)) Else vVALs(v, 2) = 1 End If Next v .Cells = vVALs End With End With End With dRE2009.RemoveAll: Set dRE2009 = Nothing Application.ScreenUpdating = True Debug.Print Timer End Sub
这将在BO2009工作表的B列产生静态值。 以秒为单位的启动和停止将在VBE的立即窗口(Ctrl + G)