Excel VBA FormulaArray太慢了

时间:2012-10-24 00:36:18

标签: arrays excel-vba vlookup vba excel

我有一个宏,根据会计期间填充开始日期和完成日期。例如:产品X在1月12日至12月12日销售。宏将使用vlookup / min数组来查找开始,使用vlookup / max数组来查找结束。日期采用YYYYMM格式,因此vlookup正在查看日历选项卡,该选项卡将相应的YYYYMM映射到开始日期或结束日期。编码工作正常,但在某些情况下有30,000 - 100,000行,运行时间可能需要15-20分钟。有没有人对如何让这次运行更快有任何想法?

以下是代码:

  

单元格(Rcnt,5).FormulaArray =“= VLOOKUP(MIN(IF('Normalized'!A:A =”& Cells(Rcnt,1).Address(False,False)&“,'Normalized 'Y:!j)),' 日历“A:C,2,FALSE)”

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

不要在宏中使用公式。您可以通过自己在VBA中编写代码来更快地编写代码。您可以循环遍历行中的所有值并存储最小值和最大值(您可以保持最大值和最小值,这样您只需要一个循环)。然后将这些值写入适当的位置。这应该比excel公式更快。<​​/ p>

要开始在VBA中编写宏,请查看here。您将特别想要了解如何通过单元格loop。您需要设置max = Jan 1和min = Dec 31,然后如果您当前检查的值大于max,则将max设置为值,同样设置为min。循环遍历该行后,您将获得该行中的最大值和最小值。然后,您可以将这些值写入其他列,重置最大值和最小值,然后移动到下一行。

答案 1 :(得分:0)

我对您的问题的理解是,您的数据列出了每个月每个产品的销售情况,因此对于每个产品,您都在搜索第一个月和最后一个月。您可以按产品和日期对数据进行排序吗?这将是Emschorsch描述的实现循环的最简单方法,因为您一次只处理一个产品。

还有其他一些方法可以加快速度:

  • 将代码的第一行设置为:

    Application.Calculation = xlCalculationManual
    

    和你的最后一行:

    Application.Calculation = xlCalculationAutomatic
    

    (你仍然有大量的查询,但是他们会一次计算所有,而不是在创建每一行的公式时一次计算)

  • 如果排序数据不会飞,您可以连续自动过滤每个产品并使用SUBTOTAL()函数,引用日期列,以获得最小值和最大值。 (您可以将SUBTOTAL()公式放在未使用的单元格中,并在代码中引用该单元格,或使用Application.WorksheetFunction直接在代码中使用它)

其他似乎没必要的部分(没有看到我们无法确定的数据)是使用查找将YYYYMM转换为日期,如果这确实是所有日期所在的格式。可以轻松完成没有使用DATE()公式的VBA,或者如果你需要在宏中使用它:

cells(Rcnt, 5).Value = DateSerial(Left(x, 4), Right(x, 2), 1)  'x is your date in YYYYMM format