• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:照合した結果によって決めた値を転記するマクロ)

VLOOKUPを使用した値の照合マクロの作成方法

このQ&Aのポイント
  • VLOOKUP関数を使用してシート1とシート2の値を照合するマクロを作成していますが、判定1、2、3の転記がうまくできない問題があります。
  • また、VLOOKUP関数の処理が遅く、速く処理できる方法を探しています。
  • シート1のA列、B列、C列の値とシート2のF列、G列、B列の値を連結して照合し、結果に応じてシート2のAF列に1、2、3を転記するマクロの記述方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.15

おはようございます。 見直してみたら無駄な箇所があったので修正しました。 これで同一データで0.4秒でした。 それから「非対称」って、かたっぽが「対象」なら「非対象」じゃないですか? Sub test06() ‘  Dim t As Single ‘  t = Timer   Dim myDic As Object   Dim myV, myV2, myW, myX, myY   Dim i As Long, uw As Long, uv As Long   With Sheets("Sheet1")     myV = .Range("A2", .Cells(Rows.Count, "C").End(xlUp)).Value   End With   With Sheets("Sheet2")     myW = .Range("B2", .Cells(Rows.Count, "G").End(xlUp)).Value   End With   uv = UBound(myV)   uw = UBound(myW)   ReDim myV2(1 To uv, 1 To 1) As String   ReDim myX(1 To uw, 1 To 1) As String   ReDim myY(1 To uv, 1 To 1) As String   Set myDic = CreateObject("Scripting.Dictionary")   For i = 1 To uv     myV2(i, 1) = myV(i, 1) & "!" & myV(i, 2) & "!" & myV(i, 3)   Next i   For i = 1 To uw     myDic(myW(i, 5) & "!" & myW(i, 6) & "!" & myW(i, 1)) = i     myX(i, 1) = "非対象"   Next i   For i = 1 To uv     If Not myDic.Exists(myV2(i, 1)) Then       myY(i, 1) = "再発行"     Else       myX(myDic(myV2(i, 1)), 1) = "対象"     End If   Next i   Application.ScreenUpdating = False   Sheets("Sheet2").Range("AF2").Resize(uw, 1).ClearContents   Sheets("Sheet2").Range("AF2").Resize(uw, 1).Value = myX   Sheets("Sheet1").Range("G2").Resize(uv, 1).ClearContents   Sheets("Sheet1").Range("G2").Resize(uv, 1).Value = myY   Application.ScreenUpdating = True ‘  Debug.Print Timer - t End Sub

gx9wx
質問者

お礼

Sub test04()と比べました。 Sub test04()→25秒 Sub test06()→1秒以内 また結果も双方同じでした。 ありがとうございました。

gx9wx
質問者

補足

はははは。(笑) >「非対称」って、かたっぽが「対象」なら「非対象」 私の誤記は永久に直りません。(ToT)/~~~ 見直してもその時はおかしいと思わない? 投稿後読み直すと気がつきます。 もしくは指摘されてから。 いつもすいません。

すると、全ての回答が全文表示されます。

その他の回答 (14)

  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.4

つい最近、dictionaryを使った検索をこのサイトで勉強しましたので、 試してください。 Sub ■dictest_2() Dim dic As Object Dim i As Long Dim a_b_c, b_b, f_g, a_f_1, a_f_2 Dim 行 As Long With Sheets("Sheet1") 行 = .Range("A" & Rows.Count).End(xlUp).Row a_b_c = .Range("A2:C" & 行).Value ReDim a_f_1(1 To UBound(a_b_c), 1 To 1) End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(a_b_c) dic.Add "@" & a_b_c(i, 1) & a_b_c(i, 2) & a_b_c(i, 3), i '"@"をつけるのは、八桁以上の数字のみだと非常に遅くなるから Next With Sheets("Sheet2") 行 = .Range("B" & Rows.Count).End(xlUp).Row b_b = .Range("B2:B" & 行).Value f_g = .Range("F2:G" & 行).Value ReDim a_f_2(1 To UBound(b_b), 1 To 1) For i = 1 To UBound(b_b) If dic.exists("@" & f_g(i, 1) & b_b(i, 1) & f_g(i, 2)) Then a_f_2(i, 1) = 1 Else a_f_2(i, 1) = 2 End If Next .Range("AE2:AF" & 行).ClearContents .Range("AF2:AF" & 行).Value = a_f_2 End With Set dic = Nothing '*****これ以下はSheet2に有り、Sheet1に無いものを探す。 Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(b_b) dic.Add "@" & f_g(i, 1) & b_b(i, 1) & f_g(i, 2), i Next For i = 1 To UBound(a_b_c) If Not dic.exists("@" & a_b_c(i, 1) & a_b_c(i, 2) & a_b_c(i, 3)) Then a_f_1(i, 1) = 3 End If Next With Sheets("Sheet1") .Range("AE2:AF" & UBound(a_b_c) + 1).ClearContents .Range("AF2:AF" & UBound(a_b_c) + 1).Value = a_f_1 End With Set dic = Nothing End Sub

gx9wx
質問者

お礼

ありがとうございます。 瞬時に終了しました。 A-NO.3の補足の 以下の内容が駄目でした。 >>3.「シート1には有るがシート2には無い場合は >>シート2のAF列に3と記入」 >>としているが、 >>いったいSheet2のどの行に入れさせるおつもりなのか? >申し訳ありません。出来るわけ有りませんでした。 >その場合はシート1のG列に3と記入したいです。

すると、全ての回答が全文表示されます。
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

質問では不明確な点がいくつかあります。 自分はわかっていることでも他の人はまったく知らないのだということを忘れずに、質問を推敲してから投稿するようにしましょう。 1.行ごとに照合とは、Sheet1とSheet2の同じ行で比較するのか、行を問わないのか? (両シートの行数が違うようなので、行を問わず、総当りで照合するのだろうとは想像しますが・・・・) 2.同じシートに重複があった場合はどうするのか? 挙げられた例で、シート2の値=XXXX12345678が、Sheet2に複数あった場合は、最初の行のAF列に入力させるだけでいいのか、重複する全部のAF列に入力させるのか?はたまた重複はありえないのか。 3.「シート1には有るがシート2には無い場合はシート2のAF列に3と記入」としているが、いったいSheet2のどの行に入れさせるおつもりなのか? 4.データに空白行や空白列がある可能性はあるのかないのか? これだけ不明確な点があったら、普通はコードを書く気にはなれませんが、とりあえず ・行は問わずに総当り検索 ・重複にも記入 ・シート1には有るがシート2には無い場合はどこに記入するかわからないので無視 ・すくなくとも対象列の最終行は空白ではない。 という前提で書きました。 VLOOKUPではなく配列に取り込んでマッチングさせていますからそんなに時間はかからないのではと思いますが、試してみてください。 Sub test01()   Dim myV, myV2, myW, myW2, myX   Dim i As Long, n As Long, j As Long   With Sheets("Sheet1")     myV = .Range("A2", .Cells(Rows.Count, "C").End(xlUp)).Value   End With   With Sheets("Sheet2")     myW = .Range("B2", .Cells(Rows.Count, "G").End(xlUp)).Value   End With   ReDim myV2(1 To UBound(myV), 1 To 1)   ReDim myW2(1 To UBound(myW), 1 To 1)   ReDim myX(1 To UBound(myW), 1 To 1)   For i = 1 To UBound(myV2)     myV2(i, 1) = myV(i, 1) & myV(i, 2) & myV(i, 3)   Next i   For i = 1 To UBound(myW2)     myW2(i, 1) = myW(i, 5) & myW(i, 6) & myW(i, 1)   Next i   For i = 1 To UBound(myV2)     For n = 1 To UBound(myW2)       If myV2(i, 1) = myW2(n, 1) Then         myX(n, 1) = 1       End If     Next n   Next i   For n = 1 To UBound(myX)     If myX(n, 1) = Empty Then       myX(n, 1) = 2     End If   Next n   Sheets("Sheet2").Range("AF2").Resize(UBound(myX), 1).Value = myX End Sub

gx9wx
質問者

お礼

質問がめちゃくちゃですいません。 補足に対応した回答をいただきましたので、 テストはそちらで行います。 どうもありがとうございました。

gx9wx
質問者

補足

いつもいつもすいません。m(__)m >1.行ごとに照合とは、Sheet1とSheet2の同じ行で比較するのか、 >行を問わないのか? >(両シートの行数が違うようなので、行を問わず、 >総当りで照合するのだろうとは想像しますが・・・・) はい。総当りで照合です。 >2.同じシートに重複があった場合はどうするのか? >挙げられた例で、シート2の値=XXXX12345678が、 >Sheet2に複数あった場合は、 >最初の行のAF列に入力させるだけでいいのか、 >重複する全部のAF列に入力させるのか? >はたまた重複はありえないのか。 同じシートでの重複は無いです。 その為3つのセルを結合させた値で照合をします。 >3.「シート1には有るがシート2には無い場合は >シート2のAF列に3と記入」 >としているが、 >いったいSheet2のどの行に入れさせるおつもりなのか? 申し訳ありません。出来るわけ有りませんでした。 その場合はシート1のG列に3と記入したいです。 >4.データに空白行や空白列がある可能性はあるのかないのか? 空白行はありません。 空白のセルはシート2でところどころにあります。 ですが照合対象となるF列,G列,B列には空白は絶対無いです。

すると、全ての回答が全文表示されます。
回答No.2

どのような運用か分かりませんが、愚直にマクロを書いてみてはどうでしょうか。 「Application.ScreenUpdating=False」を書いておけば後は(アルゴリズムと)CPUパワーです。 処理自体は単純そうなので普通にマクロを書いても2万件くらいなら1時間もあれば完了すると思います。

gx9wx
質問者

お礼

質問したのは最大のパターンで 通常はシート1、シート2共に最大3,500行くらいです。 >愚直にマクロを書いてみて で1,2,3を転記する部分の記述がうまくできない(おかしな値が転記される) ので速度だけではないのです。 VLOOKUPだと照合してヒットしたらその行の指定列を返すので それを条件分岐にする? ここら辺がよくわからず困っています。 遅い処理でもいいので、記述全体を教えていただきたかったのですが。 どうもありがとうございました。

すると、全ての回答が全文表示されます。
  • aokii
  • ベストアンサー率23% (5210/22063)
回答No.1

データが多いので、アクセスをお勧めします。

gx9wx
質問者

お礼

アクセス。 触った事ないです。 シート1、シート2共に3,500行くらいのもありますが それでもアクセスの方がいいのでしょうか? どうもありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A