0

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

这是代码:

Cells(Rcnt, 5).FormulaArray = "=VLOOKUP(MIN(IF('Normalized'!A:A= " & Cells(Rcnt, 1).Address(False, False) & ", 'Normalized'!J:J )),'日历'!A:C,2,FALSE)"

任何帮助将不胜感激。

4

2 回答 2

0

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

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

于 2012-10-24T00:41:55.587 回答
0

我对您的问题的理解是,您的数据列出了每个产品在每个月的销售额,因此对于每个产品,您都在搜索第一个月和最后几个月。您可以按产品和日期对数据进行排序吗?正如 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
于 2012-10-24T03:10:39.163 回答