2017-05-16 13 views
0
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ループ内の一致式を使用していますが、時間がかかりすぎています。このコードを最適化して速くする方法はありますか?最適化一致式vbaでループする

ありがとうございました!

答えて

0

あなたが作ることができるかなりの数の改善があり、主なもののカップルです:文字列操作がそうであるようにワークシートのセルに

1)読み出しと書き込みは、非常に遅いです。代わりに、結果を最初に試してから、セルに数式を書き込むのではなく、シートに書き込んでください。さらに、結果を配列に格納し、最後にすべて書き出すこともできます(しかし、これはこの質問の範囲を超えており、オンラインで配列を検索できます)。 application.worksheetfunctionを使用してVBAで既存の数式を再作成するか、または独自の関数を作成してそれを実行することを検討できます。

2)非常に遅い操作でも、細胞の選択は避けてください。代わりに、影響を受けたセルを指定するCells参照してループのためのあなたの使用:

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 

細胞構文は(行、列)です。ここではiが行番号、39は列AMです。

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