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循环中使用匹配公式,但是花费了太多时间。有没有办法优化这段代码以使其更快?
谢谢!
答案 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