重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

シート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と転記

A 回答 (15件中11~15件)

間違いがありました。



>.Range("AE2:AF" & UBound(a_b_c) + 1).ClearContents

.Range("AF2:AF" & UBound(a_b_c) + 1).ClearContents
    • good
    • 0
この回答へのお礼

ありがとうございます。
こちらで試しました。

私の質問の不備である
A-NO.3の補足の
以下の内容が駄目でした。

>>3.「シート1には有るがシート2には無い場合は
>>シート2のAF列に3と記入」
>>としているが、
>>いったいSheet2のどの行に入れさせるおつもりなのか?

>申し訳ありません。出来るわけ有りませんでした。
>その場合はシート1のG列に3と記入したいです。

お礼日時:2010/12/10 08:46

つい最近、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
    • good
    • 0
この回答へのお礼

ありがとうございます。
瞬時に終了しました。
A-NO.3の補足の
以下の内容が駄目でした。

>>3.「シート1には有るがシート2には無い場合は
>>シート2のAF列に3と記入」
>>としているが、
>>いったいSheet2のどの行に入れさせるおつもりなのか?

>申し訳ありません。出来るわけ有りませんでした。
>その場合はシート1のG列に3と記入したいです。

お礼日時:2010/12/10 08:41

質問では不明確な点がいくつかあります。


自分はわかっていることでも他の人はまったく知らないのだということを忘れずに、質問を推敲してから投稿するようにしましょう。

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列には空白は絶対無いです。

補足日時:2010/12/09 18:55
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/12/10 07:49

どのような運用か分かりませんが、愚直にマクロを書いてみてはどうでしょうか。



「Application.ScreenUpdating=False」を書いておけば後は(アルゴリズムと)CPUパワーです。
処理自体は単純そうなので普通にマクロを書いても2万件くらいなら1時間もあれば完了すると思います。
    • good
    • 0
この回答へのお礼

質問したのは最大のパターンで
通常はシート1、シート2共に最大3,500行くらいです。

>愚直にマクロを書いてみて

で1,2,3を転記する部分の記述がうまくできない(おかしな値が転記される)
ので速度だけではないのです。
VLOOKUPだと照合してヒットしたらその行の指定列を返すので
それを条件分岐にする?
ここら辺がよくわからず困っています。
遅い処理でもいいので、記述全体を教えていただきたかったのですが。

どうもありがとうございました。

お礼日時:2010/12/09 17:27

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

    • good
    • 0
この回答へのお礼

アクセス。
触った事ないです。

シート1、シート2共に3,500行くらいのもありますが
それでもアクセスの方がいいのでしょうか?

どうもありがとうございました。

お礼日時:2010/12/09 17:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!