2017-11-09 21 views
0

カラム1,2と3をカラム4,5,6に比較しようとしています。カラム1と4は時間ですが、必ずしも並んでいるわけではありません。エラーマージンは2秒です。列2と5と3と6は常に正確に一致する必要があります。私はコードが列1を実行し、列3内の値が範囲内にあるかどうかを確認したいと思います。もしそうなら、私は他の2つの値が一致するかどうかを確認したいと思います。それらがすべて一致した場合、array1とarray2の値の一部を "Sheet2"に貼り付けたいと思います。キーは私がそれを速く走らせたいということです。以下は私がこれまで持っていたものを投稿したものです。どんな提案/批評/オーバーホールも大歓迎です!VBA配列の比較

おかげで、

サム

Sub Comp() 

Dim array1() As Variant 
Dim array2() As Variant 
Dim last1 As String 
Dim last2 As String 
Dim C As Integer 
Dim A As Integer 
Dim high As Long 
Dim low As Long 
Dim x As Boolean 

last2 = Sheets("Comparison").Range("B1000000").End(xlUp).Row 
last1 = Sheets("Comparison").Range("BV10000").End(xlUp).Row 
C = 0 
A = 0 

ReDim array1(C To last1, 3) 
ReDim array2(A To last2, 5) 

For C = 0 To last1 

array1(C, 1) = Sheets("Comparison").Range("A" & C + 2).Value 
array1(C, 2) = Sheets("Comparison").Range("D" & C + 2).Value 
array1(C, 3) = Sheets("Comparison").Range("G" & C + 2).Value 

high = array1(C, 1) + (1.15740740740741E-05 * 2) '2 seconds 
low = array1(C, 1) + (1.15740740740741E-05 * 2) '2 seconds 
x = False 

For A = 0 To last2 

array2(last2, 1) = Sheets("Comparison").Range("I" & A + 2).Value 
array2(last2, 2) = Sheets("Comparison").Range("K" & A + 2).Value 
array2(last2, 3) = Sheets("Comparison").Range("M" & A + 2).Value 
array2(last2, 4) = Sheets("Comparison").Range("J" & A + 2).Value 
array2(last2, 5) = Sheets("Comparison").Range("L" & A + 2).Value 

If array1(C, 2) = array2(A, 2) And array1(C, 3) = array2(A, 3) And high >= array2(A, 1) And array2(A, 1) >= low Then 

x = True 

If x = True Then 

Exit For 

If x = True Then Sheets("Sheet2").Range("C100000").End(xlUp).Offset(1, 0).Value = array2(A, 4).Value And Sheets("Sheet2").Range("D100000").End(xlUp).Offset(1, 0).Value = array2(A, 5).Value 

Else 

Next A 

Exit For 

For C = 0 To last1 

If x = True Then Sheets("Sheet2").Range("A100000").End(x1up).Offset(1, 0) = array1(C, 1).Value And Sheets("Sheet2").Range("B100000").End(x1up).Offset(1, 0) = array1(C, 3).Value 

Next C 

End Sub 

答えて

0
  1. あなたのコード内のいくつかのタイプミスがありますが、私は以下のように修正しました。
  2. 必要なI/Oが少ないほど、パフォーマンスが向上します。そして、500行を一度読んでから1行を読んだり何かをしたり、次の行を読んだり、何かをするよりも、一度はいくつかのデータを読んでおく方がいいです。したがって、すべてのデータを配列に読み込んで3番目の配列に保存する方が良いでしょう。すべての比較が完了したら、それをワークシートに書き戻します。 Ref

以下のコードはテストされていません。

Sub Comp() 

    Dim array11, array12, array13 As Variant 
    Dim array2 As Variant 
    Dim arrayMatch As Variant 
    Dim arrayTmp As Variant 
    Dim last1 As String 
    Dim last2 As String 
    Dim C As Integer 
    Dim A As Integer 
    Dim matchCount As Long 

    With Sheets("Comparison") 
     last1 = .Range("A100000").End(xlUp).Row 
     last2 = .Range("I100000").End(xlUp).Row 
     '[1] 
     array11 = .Range("A2:A" & last1 + 2).Value 
     array12 = .Range("D2:D" & last1 + 2).Value 
     array13 = .Range("G2:G" & last1 + 2).Value 

     array2 = .Range("I2:L" & last2 + 2).Value 
    End With 

    '[2] 
    ReDim arrayMatch(1 To 500, 1 To 4) As Variant 

    For C = LBound(array11) To UBound(array11) 
     For A = LBound(array2) To UBound(array2) 
      If array12(C) = array2(A, 3) And array13(C) = array2(A, 5) And Abs(DateDiff("s", array11(C), array2(A, 1))) <= 2 Then 
       matchCount = matchCount + 1 

       'Check the result array is fulled or not 
       If matchCount > UBound(arrayMatch) Then 
        '[3] 
        arrayTmp = arrayMatch 
        ReDim arrayMatch(1 To UBound(arrayTmp) + 500, 1 To 4) 
        For i = LBound(arrayTmp) To UBound(arrayTmp) 
         arrayMatch(i, 1) = arrayTmp(i, 1) 
         arrayMatch(i, 2) = arrayTmp(i, 2) 
         arrayMatch(i, 3) = arrayTmp(i, 3) 
         arrayMatch(i, 4) = arrayTmp(i, 4) 
        Next i 
       End If 

       arrayMatch(matchCount, 1) = array11(C) 
       arrayMatch(matchCount, 2) = array13(C) 
       arrayMatch(matchCount, 3) = array2(A, 2) 
       arrayMatch(matchCount, 4) = array2(A, 4) 

       Exit For 
      End If 
     Next A 
    Next C 

    Sheets("Sheet2").Range("A100000").End(x1up).Offset(1, 0).Resize(matchCount, 4).Value = arrayMatch 
End Sub 
  1. 範囲は連続的である場合、一度に一つの配列に値を代入すると、最良の方法です。しかし、あなたの場合、それらは分離された列です、私は値を格納するために3つの配列を設定します。 array2の場合と同じ理由で、一度に値を読み取るとループするよりも優れています。より良いパフォーマンスが必要な場合は、列の順序を変更する必要はありません。このような配列の値を代入すると、配列は1から始まります。

  2. 私は約500試合を推測します。あなたはそれを自由に調整することができます。

  3. 実際に何個のマッチがあるかを誰も予測できないので、arrayMatchが十分に大きくない可能性があります。確かに時間とメモリの両方が浪費されているので、いいサイズのarrayMatchを決めることが重要です。