我有一个宏,根据会计期间填充开始日期和完成日期。例如:产品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)”
非常感谢任何帮助。
答案 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