6

データ量が多いため、私のコードは非常に遅いです (シートごとに 10 分以上)。配列を使用して高速化する方法があると思いますが、どうすればよいかわかりません。状況を詳しく説明しようと思います。

請求書番号、部品番号、および販売価格 (その他の情報) を含む 2 つのワークシートがあり、それらを比較して違いを見つけようとしています。両方のシートの送り状番号と部品番号を連結して、データの各行に一意の番号を作成しました。また、両方のシートをその番号で手動で並べ替えました。これらの一意の番号のどれがシート 1 にあり、シート 2 にないか、またはその逆かを見つけたいと思います。(これの別の部分は、一致するものをチェックして、販売価格が異なるかどうかを確認することですが、それは十分に簡単に把握できると思います。) 目標は、ベンダーが部分的または完全に見逃した請求書を確認することです。そして私の会社。

1 つのシートに約 10,000 行のデータがあり、もう 1 つのシートには 11,000 行のデータがあります。以下は、www.vb-helper.com/howto_excel_compare_lists.html で見つけたものと、このサイトで同様の質問への回答を見て、現在使用しているコードです。シートが逆になっているほぼ同一の 2 番目のサブがあります。両方の方法で1つだけを書くことが可能かどうかはわかりません。

Private Sub cmdCompare2to1_Click()
Dim first_index As Integer
Dim last_index As Integer
Dim sheet1 As Worksheet
Dim sheet2 As Worksheet
Dim r1 As Integer
Dim r2 As Integer
Dim found As Boolean

Set sheet1 = Worksheets(1)
Set sheet2 = Worksheets(2)

Application.ScreenUpdating = False

first_index = 1
last_index = sheet1.Range("a" & Rows.Count).End(xlUp).Row

' For each entry in the second worksheet, see if it's
' in the first.
For r2 = first_index To last_index
    found = False
    ' See if the r1-th entry on sheet 2 is in the sheet
    ' 1 list.
    For r1 = first_index To last_index
        If sheet1.Cells(r1, 16) = sheet2.Cells(r2, 9) Then
        ' We found a match.
            found = True
            Exit For
        End If
    Next r1

    ' See if we found it.
    If Not found Then
        ' Flag this cell.
        sheet2.Cells(r2, 9).Interior.ColorIndex = 35
        End If
Next r2

Application.ScreenUpdating = True

End Sub

小さなデータセットでは問題なく機能しますが、多数の行を通過させると、永遠に時間がかかり、会計士は誰もそれを使用したくありません. 理想的には、違いを緑色にするだけでなく、それらを別のシートにコピーします。つまり、シート 3 はシート 1 ではなくシート 2 にすべて含まれますが、この時点で取得できるものを取得します。

解決策を探し回った結果、高速化には配列の使用が必要であることにインターネット上の誰もが同意しているようです。ただし、その素敵なアドバイスを現在のコードに適用する方法がわかりません。このコードを破棄して最初からやり直さなければならない可能性が高いことは理解していますが、どうすればよいでしょうか?

4

1 に答える 1

7
于 2013-02-21T17:01:42.677 に答える