Arrays Excel VBA FormulaArray太慢

Arrays Excel VBA FormulaArray太慢,arrays,excel,vlookup,vba,Arrays,Excel,Vlookup,Vba,我有一个宏,它根据会计期间填充开始和完成日期。例如:产品X在1月12日至12月12日销售。宏将使用vlookup/min数组查找开始,使用vlookup/max数组查找结束。日期是YYYYMM格式的,因此vlookup正在查看一个日历选项卡,该选项卡将相应的YYYYMM映射到开始或完成日期。编码工作正常,但在某些情况下有30000-100000行,运行可能需要15-20分钟。有没有人对如何让它跑得更快有什么想法 代码如下: 单元格(Rcnt,5).FormulaArray=“=VLOOKUP(最

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

代码如下:

单元格(Rcnt,5).FormulaArray=“=VLOOKUP(最小值(如果('Normalized'!A:A=“&单元格(Rcnt,1).地址(False,False)&“,'Normalized'!J:J)),'Calendar'!A:C,2,False)”


任何帮助都将不胜感激。

不要在宏中使用公式。通过自己在VBA中编写代码,可能可以使代码更快。可以循环一行中的所有值,并存储最小值和最大值(可以保留最大值和最小值,因此只需要一个循环)。然后将这些值写入适当的位置。这应该已经比excel公式快了很多


要开始在VBA中编写宏,请参见。您将特别希望了解如何通过单元格进行转换。您需要设置最大值=1月1日,最小值=12月31日,然后,如果当前检查的值大于最大值,则将最大值设置为等于该值,同样设置为最小值。循环该行后,该行将包含最大值和最小值。然后,您可以将这些值写入另一列,重置最大值和最小值,并移到下一行。

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

还有一些其他的事情可以加快速度:

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

    Application.Calculation = xlCalculationManual
    
    最后一行是:

    Application.Calculation = xlCalculationAutomatic
    
    (您仍然有大量的查找,但它们将一次计算所有内容,而不是在创建每行公式时一次计算一个内容)

  • 如果无法对数据进行排序,您可以连续对每个产品进行自动筛选,并使用SUBTOTAL()函数(引用日期列)获取最小值和最大值。(您可以将SUBTOTAL()公式放置在未使用的单元格中,并在代码中引用该单元格,或使用Application.WorksheetFunction直接在代码中使用它)

另一个似乎不必要的部分(在没有看到您的数据的情况下,我们无法确定)是使用查找将YYYYMM转换为日期,如果所有日期都采用这种格式的话。如果不使用VBA,也不使用DATE()公式,或者需要在宏中使用它,则可以轻松完成此操作:

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

我添加了一些关于如何开始的信息。如果您从未编程过,那么您可能需要更加努力地工作。如果您有任何其他问题,请在自己调查后发布。日期基于公司会计月,因此201210可能从2012年9月29日开始,到2012年10月25日结束。我对目标感到困惑。你是不是在多个时期总结销售额?或者只是尝试将YYYYMM日期转换为每个月的第一个和最后一个会计日?或者两者都有?你有没有尝试过手动计算模式,这是否加快了速度?