|
UO3さんの言われる様に、シートの修飾が抜けている事と
Public Sub test_3()
Dim i As Long, k As Long
Dim RowEnd1 As Long
Dim RowEnd2 As Long
Dim Ws1 As Worksheet
Dim Ws2 As Worksheet
Set Ws1 = Sheets(1)
RowEnd1 = Ws1.Cells(Rows.Count, 1).End(xlUp).Row
Set Ws2 = Sheets(2)
RowEnd2 = Ws2.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To RowEnd1
For k = 2 To RowEnd2
' If Ws1.Cells(i, 1) & Cells(i, 2) & Cells(i, 3) = _
' Ws2.Cells(k, 1) & Cells(k, 2) & Cells(k, 3) Then
If Ws1.Cells(i, 1).Value & vbTab & Ws1.Cells(i, 2).Value _
& vbTab & Ws1.Cells(i, 3).Value = _
Ws2.Cells(k, 1).Value & vbTab & Ws2.Cells(k, 2).Value _
& vbTab & Ws2.Cells(k, 3).Value Then
Exit For
End If
Next k
If k > RowEnd2 Then
Ws1.Cells(i, 1).Interior.ColorIndex = 34
End If
Next i
Set Ws1 = Nothing
Set Ws2 = Nothing
End Sub
例えば、以下の様なデータが有ったとします
シート1
大分類 中 小
AAA AA BBB
BB BBB CCC
CC CCC DDD
DD DDD EEE
シート2
BB BAB CCC
AA AAA BBB
DD DDD EGE
CC CCC DDD
AAA AA BBB
今回の質問のコードですと
If Ws1.Cells(i, 1) & Cells(i, 2) & Cells(i, 3) = _
Ws2.Cells(k, 1) & Cells(k, 2) & Cells(k, 3) Then
としていますので
シート1の1行目は、AAAAABBBと成ります
一方、シート2では、2行目もAAAAABBBと成り、4行目もAAAAABBBと成ります
因って、本来4行目を引っかけたいのですが先に、2行目を引っかけてしまいます
多分この様な事が起きていると思います
因みに修正したコードでは、値の間にTabコードを挟んで連結していますので、
(大分類、中、小に含まれない文字なら、特にTabで無くても構いません、例えば「:」「/」)
シート1の1行目は、AAA:AA:BBBと成ります
一方、シート2では、2行目はAA:AAA:BBBと成り、4行目はAAA:AA:BBBと成ります
因って、2行目と4行目を見分けられるので、4行目にヒットします
ただ、幾つか気に成る所が有りますので書いて置きます
1、テスト用のデータの量を揃えて(多分1000行も有れば差が出るかな?)、
最初に示したコード「Sub test_2」と今回の「Sub test_3」の時間を比べて見て下さい
多分、「Sub test_2」の方が速く成ると思います
セルの読み書きは非常に遅い動作と成りますし、文字列の連結も同じく遅い動作と成ります
「Sub test_2」の場合、大分類が違った場合、セルの比較はシート1とシート2で2回ですし
中分類で違った場合で、4回です、小分類まで行って6回です
「Sub test_3」では、常に6回セルから読み出し、文字列を連結する操作が加わります
この時間の差が「Sub test_2」と「Sub test_3」の差として出て来ると思います
2、Yoshimさんのコードでは「Ws1.Cells(i, 1) & Cells(i, 2) & Cells(i, 3)」と成っていますが?
もっと複雑なコードに成ると、此れがセル範囲を指すのか、値を指すのか勘違いの元(バグの元)に成ります
必ず、値を示すなら「.Value」を付けましょう
3、今回(前回も含めて)のコードは、1番基本のコードで速度が出ません
多分1000行、10000行だといやに成るほど時間が掛かる筈です
アルゴリズム、セルの操作等を見直せば劇的に速く成ると思いますので考えて見て下さい
|
|