Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


14600 / 76738 ←次へ | 前へ→

【67627】Re:三列が合致していないセルにチェック
回答  Hirofumi  - 10/12/19(日) 9:10 -

引用なし
パスワード
   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行だといやに成るほど時間が掛かる筈です
 アルゴリズム、セルの操作等を見直せば劇的に速く成ると思いますので考えて見て下さい
0 hits

【67477】三列が合致していないセルにチェック Yoshim 10/12/8(水) 16:09 質問
【67478】Re:三列が合致していないセルにチェック Jaka 10/12/8(水) 16:20 発言
【67479】Re:三列が合致していないセルにチェック Hirofumi 10/12/8(水) 17:47 回答
【67515】Re:三列が合致していないセルにチェック Yoshim 10/12/9(木) 21:41 お礼
【67621】Re:三列が合致していないセルにチェック Yoshim 10/12/18(土) 22:27 質問
【67626】Re:三列が合致していないセルにチェック UO3 10/12/19(日) 9:05 回答
【67627】Re:三列が合致していないセルにチェック Hirofumi 10/12/19(日) 9:10 回答
【67631】Re:三列が合致していないセルにチェック UO3 10/12/19(日) 23:33 回答
【67643】Re:三列が合致していないセルにチェック Yoshim 10/12/20(月) 22:18 お礼

14600 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free