2012-10-24 64 views
0

我有一个基于会计期填充开始和完成日期的宏。例如:产品X在1月12日至12月12日期间销售。宏将使用一个vlookup/min数组来查找开始和一个vlookup/max数组来查找结束。日期格式为YYYYMM,所以vlookup会查看日历标签,将相应的YYYYMM映射到开始日期或结束日期。编码工作正常,但在某些情况下,有30,000 - 100,000行,可能需要15-20分钟才能运行。有没有人有任何想法如何使这个运行更快?Excel VBA FormulaArray太慢

下面是代码:

细胞(RCNT,5).FormulaArray = “= VLOOKUP(MIN(IF( '归' A:A =” &细胞(RCNT,1)。地址(FALSE,FALSE)& “ '规范化' 记者:!j)), '日历' A:C,2,FALSE)”

任何帮助将不胜感激。

回答

0

不要在宏中使用公式。您可以通过自己编写VBA代码来使代码更快。您可以遍历一行中的所有值并存储最小值和最大值(您可以保留最大值和最小值,因此只需要一个循环)。然后将这些值写入适当的地方。这应该已经是excel公式的加速。

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

+0

IM不大不小的新手....究竟会我设置? – brewbrah

+0

我添加了一些关于如何入门的信息。如果你从未编程过,那么你可能需要更加努力。如果您有任何其他问题,请在您自行调查后再发布。 – emschorsch

0

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

几个其他的事情要尽量加快这:

  • 设置你的代码的第一行:

    Application.Calculation = xlCalculationManual 
    

    和你的最后一行:

    Application.Calculation = xlCalculationAutomatic 
    

    (你仍然有大量的查找,但它们会一次计算所有数据,而不是每次创建每行公式时计算的数值)

  • 如果对数据进行排序不会飞,你可以在每个产品上陆续自动筛选和使用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 
+0

日期基于公司会计月份,所以201210可能开始09/29/2012和结束2012年10月25日 – brewbrah

+0

我对目标感到困惑。你是否试图总结多个时期的销售?或者只是试图将YYYYMM日期转换为每个月的第一个和最后一个财政日?或两者?您是否尝试过手动计算模式,是否会加快速度? – ExactaBox