2017-03-13 11 views
0

入れ子のforループを作成して、2つのシート内の3つの異なるセル値を比較しました。このループは、データが小さいときにうまく動作しますが、5,000行で実行すると遅すぎるとクラッシュするのが優れています。どのようにこれをより効率的に実行するかの考え。複数の値を比較するためのループVBA

Sub RowMatch() 

Dim x As Integer 

     ' Make sure we are in the right sheet 
     Worksheets("Q416").Activate 
     ' Set numrows = number of rows of data. 
     NumRows = Range("C2", Range("C2").End(xlDown)).Rows.count 
     ' find the reference range 
     Worksheets("Q415").Activate 
     NumRows2 = Range("C5", Range("C5").End(xlDown)).Rows.count 
     Worksheets("Q416").Activate 
     MsgBox ("Total # of Rows on this sheet = " & NumRows & " and " & NumRows2 & " in Ref Range") 
     Range("A1").Select 
     ' Establish "For" loop to loop "numrows" number of times. 
     For x = 1 To NumRows 
     'MsgBox NumRows2 
     For y = 1 To NumRows2 
     'MsgBox (ActiveCell.Offset(x, 0).Value & " & " & Worksheets("Q415").Cells(y + 1, 1)) 
     If ActiveCell.Offset(x, 0).Value = Worksheets("Q415").Cells(y + 1, 1).Value _ 
     And ActiveCell.Offset(x, 2).Value = Worksheets("Q415").Cells(y + 1, 3).Value Then 
     If ActiveCell.Offset(x, 5).Value = Worksheets("Q415").Cells(y + 1, 6).Value Then 
     'If NumRows(i).Value = ActiveCell.Offset(1, 0).Value Then 
     ActiveCell.Offset(x, 10).Value = "Same" 
     Else 
     ActiveCell.Offset(x, 10).Value = ActiveCell.Offset(x, 5).Value - Worksheets("Q415").Cells(y + 1, 6).Value 
     End If 
     End If 


     Next y 
     Next x 
End Sub 
+3

死のActiveCellで!はい、Select/Activate/ActiveCellを使用しないようにする方法を簡単に検索してください。 – CallumDA

+1

.findメソッドを試して、見つかった行の別の列と2番目の一致を一致させることができます。 http://stackoverflow.com/questions/42768906/excel-macro-iterating-through-rows-and-combined-loop –

+2

私が投稿したと思います@CallumDAは次のようなものです:http:// stackoverflow .com/questions/10714251/how-to-avoid-using-excel-vba-macros – Ralph

答えて

1

ExcelのVBAで実行するのが最も遅い操作の1つです。代わりに、ワークシートに含まれている値を配列に配置し、そこで作業する必要があります。ここでは、参考文献:http://www.cpearson.com/excel/ArraysAndRanges.aspxです。配列例えばをconsituteます範囲を定義するために、あなたのNUMROWS変数を使用して、列の文字または数字のいずれか:

myRange = Range("A1:C" & NumRows) 
myArray = myRange.value 

リンクからチップピアソンサイトへ:

Dim Arr() As Variant 
Arr = Range("A1:B10") 
Dim R As Long 
Dim C As Long 
For R = 1 To UBound(Arr, 1) ' First array dimension is rows. 
    For C = 1 To UBound(Arr, 2) ' Second array dimension is columns. 
     Debug.Print Arr(R, C) 
    Next C 
Next R 
関連する問題