在vba中优化匹配公式循环

时间:2017-05-16 17:47:09

标签: vba excel-formula micro-optimization

Lastrow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
For i = 3 To Lastrow

       Sheets("sample").Range("AM1000000").End(xlUp).Offset(1, 0).Select
        Selection.FormulaArray = _
        "=IF(ISNUMBER(MATCH(1," & Chr(10) & "  (order!R2C15:R1000000C15=RC[-24])*" & Chr(10) & "  (order!R2C7:R1000000C7=RC[-32])*" & Chr(10) & "  (order!R2C24:R1000000C24=RC[-15])," & Chr(10) & "  0)), ""pass"",""review"")"

    Next i
      Columns("AM:AM").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

我在for循环中使用匹配公式,但是花费了太多时间。有没有办法优化这段代码以使其更快?

谢谢!

2 个答案:

答案 0 :(得分:0)

你可以做出很多改进,主要有几个:

1)读取和写入工作表上的单元格非常慢,字符串操作也是如此。而是首先计算结果然后将其写入工作表而不是将公式写入单元格。更好的是,将结果存储在一个数组中并在最后将它们全部写出来(但这超出了这个问题的范围,你可以在线搜索数组)。您可以使用application.worksheetfunction在VBA中重新创建现有公式,或者您可以考虑创建自己的函数来执行此操作。

2)避免再次选择细胞 - 操作非常慢。而是使用带有Cells引用的for循环来指定受影响的单元格:

For i = 3 To Lastrow

       Sheets("sample").cells(i, 39).FormulaArray = _
        "=IF(ISNUMBER(MATCH(1," & Chr(10) & "  (order!R2C15:R1000000C15=RC[-24])*" & Chr(10) & "  (order!R2C7:R1000000C7=RC[-32])*" & Chr(10) & "  (order!R2C24:R1000000C24=RC[-15])," & Chr(10) & "  0)), ""pass"",""review"")"

Next i

Cells语法是(行,列)。这里我是行号,39是第AM列。

答案 1 :(得分:0)

通过减少数组公式中的参考范围,我们可以加快它的速度。

同时删除剪贴板也会加快速度:

lastrow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
For i = 3 To lastrow
    With WorksSheets("sample").Range("AM" & i)
        .FormulaArray = _
            "=IF(ISNUMBER(MATCH(1," & Chr(10) & "  (order!R2C15:R" & lastrow & "C15=RC[-24])*" & Chr(10) & "  (order!R2C7:R" & lastrow & "C7=RC[-32])*" & Chr(10) & "  (order!R2C24:R" & lastrow & "C24=RC[-15])," & Chr(10) & "  0)), ""pass"",""review"")"
        .Value = .Value
    End With