
シート1には
A~F列まで値があり、行数は都度相違し約15,000行くらい。
データは2行目から開始です。
シート2には
A~AE列まで値があり、行数は都度相違し約5,000~25,000行
あり同じくデータは2行目からです。
シート1の行ごとに
A列,B列,C列の順で連結した値と
シート2の行ごとに
F列,G列,B列の順で連結した値を
照合させます。
その値が
(1)シート1にもシート2にもある場合は
シート2のAF列に1と転記
(2)シート1には無いがシート2にはある場合は
シート2のAF列に2と転記
(3)シート1には有るがシート2には無い場合は
シート2のAF列に3と記入
シート2のデータのある行まで
作業を繰り返すマクロの記述を教えてください。
VLOOKUPを使用したマクロを作成しましたが
判定1,2,3の転記がうまく出来ないのと
VLOOKUPが重すぎて処理が遅すぎるので
速く処理が出来るとうれしいです。
例
シート1
A2=XXXX
B2=1234
C2=5678
シ-ト2
B2=1234
F2=XXXX
G2=5678
シート1の値=XXXX12345678
シート2の値=XXXX12345678
照合する
↓(一致なので)
シート2のセルAF2に1と転記
No.5
- 回答日時:
間違いがありました。
>.Range("AE2:AF" & UBound(a_b_c) + 1).ClearContents
↓
.Range("AF2:AF" & UBound(a_b_c) + 1).ClearContents
ありがとうございます。
こちらで試しました。
私の質問の不備である
A-NO.3の補足の
以下の内容が駄目でした。
>>3.「シート1には有るがシート2には無い場合は
>>シート2のAF列に3と記入」
>>としているが、
>>いったいSheet2のどの行に入れさせるおつもりなのか?
>申し訳ありません。出来るわけ有りませんでした。
>その場合はシート1のG列に3と記入したいです。
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
ありがとうございます。
瞬時に終了しました。
A-NO.3の補足の
以下の内容が駄目でした。
>>3.「シート1には有るがシート2には無い場合は
>>シート2のAF列に3と記入」
>>としているが、
>>いったいSheet2のどの行に入れさせるおつもりなのか?
>申し訳ありません。出来るわけ有りませんでした。
>その場合はシート1のG列に3と記入したいです。
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
この回答への補足
いつもいつもすいません。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時間もあれば完了すると思います。
質問したのは最大のパターンで
通常はシート1、シート2共に最大3,500行くらいです。
>愚直にマクロを書いてみて
で1,2,3を転記する部分の記述がうまくできない(おかしな値が転記される)
ので速度だけではないのです。
VLOOKUPだと照合してヒットしたらその行の指定列を返すので
それを条件分岐にする?
ここら辺がよくわからず困っています。
遅い処理でもいいので、記述全体を教えていただきたかったのですが。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 3 2023/02/28 01:13
- Excel(エクセル) Excelで、別シートの表のステータスに伴った動的な自動転記をしたいです。 2 2023/06/14 15:56
- Excel(エクセル) Excel_マクロ_複数のシートのVLOOKUPで表示された#N/A以外に色付けをしたいです 1 2023/02/16 22:37
- Visual Basic(VBA) VBAで、シート間の転記するコードをFOR~NEXTで教えてください。 9 2023/04/30 20:04
- その他(Microsoft Office) エクセルマクロ オートフィルターでで選択コピー 2 2022/04/18 11:05
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 1 2023/02/27 22:21
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 顧客ごとに違う点検案内を作成するマクロ 4 2022/09/16 05:34
- Excel(エクセル) エクセル VBA セルの結合 2 2022/09/07 11:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】【配列】3つのシー...
-
文字の色も参照 VLOOKUP
-
【条件付き書式】countifsで複...
-
シートをまたぐ条件付き書式に...
-
ExcelのVlookup関数の制限について
-
エクセルVBA 列検索後に該当デ...
-
Excelにて、ファイル内の複数シ...
-
Excelでの並べ替えを全シートま...
-
マクロか関数で処理したいので...
-
エクセルで、チェックボックス...
-
エクセルの保護で、列の表示や...
-
スプレッドシートでindexとIMPO...
-
Excel 2段組み
-
【VBA】ピボットテーブルを既存...
-
エクセルVBA データを別シート...
-
エクセルの列の限界は255列以上...
-
複数行の同列に同じ値があった...
-
照合した結果によって決めた値...
-
【Excel】ある文字列からはじま...
-
エクセルのマクロで重複データ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字の色も参照 VLOOKUP
-
ExcelのVlookup関数の制限について
-
【条件付き書式】countifsで複...
-
エクセルの保護で、列の表示や...
-
Excelのセルの色を変えた行(す...
-
エクセルで、チェックボックス...
-
VBAで繰り返しコピーしながら下...
-
シートをまたぐ条件付き書式に...
-
Excelでの並べ替えを全シートま...
-
Excel の複数シートの列幅を同...
-
Excelに自動で行の増減をしたい...
-
【VBA】複数のシートの指定した...
-
【エクセル】1列のデータを交...
-
SUMPRODUCTにて別シートのデー...
-
Excel 2段組み
-
エクセル マクロ 標準モジュー...
-
エクセルの列の限界は255列以上...
-
excel 複数のシートの同じ場所...
-
エクセルVBAで、ある文字を含ん...
-
VLOOKアップ関数の結果の...
おすすめ情報