• ベストアンサー

エクセルマクロ シート間の照合_上書き

マクロ初心者です。(エクセル2003使用) Sheet2の管理番号をSheet1の管理番号と照合し、同じであれば、数量など3項目を上書きするマクロを作ろうとしています。 (Sheet1:日々更新される元データ)全データ数約500件くらい A列   ,B,  C,  D,   ・・・ 1行 管理番号,品名,注文数量,出荷数量,・・・ (Sheet2:上書きさせたいシート)全データ数約80件くらい G列   ,H,  I   J      9行 管理番号,品名,注文数量,出荷数量 ↑シート2にある管理番号をもとに数量などを照合&上書きをしたいのです。 ■シート1も2も行数は日々変動します。 ■シート1で、まれに同じ管理番号が2つ存在することがありますが、取り出したい数量などのデータは、常に1番目に照合する管理番号です。 Sub シート間照合と上書き() Dim i As Integer a = Worksheets("sheet1").Range("a65536").End(xlUp).Row For i = 2 To a If Worksheets("sheet1").Range("A2") = Worksheets("sheet2").Range("G9") Then Worksheets("sheet1").Cells(1, i) = Worksheets("sheet2").Range("G9") Worksheets("sheet1").Cells(2, i) = Worksheets("sheet2").Range("H9") Worksheets("sheet1").Cells(3, i) = Worksheets("sheet2").Range("I9") While Cells(1, i) <> "" i = i + 1 Wend End If Next End Sub ■上記 模索しながらマクロを作ってみたのですが、エラーにはならないのですが(F8)、まったく動きませんでした。 すみませんが、お力をかしてください。 よろしくお願いいたします。

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

  • ベストアンサー
  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.3

まずcells(1,i) セルの参照はcells(行番号,列番号)です 反対になっていませんか? 片方でrange("G9”)という表記もあるので統一しましょう range("G9”)はcells(9,7)という風に書きます 処理の手順を考えましょう シート2の全てのデータ行について処理を行うのですから シート2を10行目から最後まで次の処理をする シート2の一件に対する処理は シート1を2行目から順番に管理番号を比較し一致したら転記する 最初のFor next ループの回数はシート2で決めなければなりません。 そしてシート2の管理番号でシート1を探すのですからここにもループが必要です。 Dim i As Integer Dim j As Integer a = Worksheets("sheet2").Range("a65536").End(xlUp).Row b = Worksheets("sheet1").Range("a65536").End(xlUp).Row For i = 10 To a    For j=2 to b       if Worksheets("sheet2").Cells(i,8)= Worksheets("sheet1").Cells(j,2) Then           Worksheets("sheet2").Cells(i,9) = Worksheets("sheet1").Cells(j,3)           Worksheets("sheet2").Cells(i,10) = Worksheets("sheet1").Cells(j,4)           Worksheets("sheet2").Cells(i,11) = Worksheets("sheet1").Cells(j,5))           exit for       end if     next next 後可読性(読みやすさ)や変更の容易さを考えると Worksheetをオブジェクト変数を使うとすっきりすると思います。 自分で勉強してね

kkk-z
質問者

お礼

ご丁寧な解説と回答、本当にありがとうございます。 無事マクロ作動することができました。 基礎的なこともまだまだおぼろげなので、しっかり勉強しようと思います。 お力添えいただきまして、ありがとうございました。

その他の回答 (2)

  • van111
  • ベストアンサー率14% (1/7)
回答No.2

実際とデータの配置が違うかも・・ でもこんな感じだと思うので一度ステップインで実行してみてください。 確認点 sheet2へコピーを行うのですよね? それならば Worksheets("sheet1").Cells(1, i) = Worksheets("sheet2").Range("G9")ではなく Worksheets("sheet2").Range("G9")=Worksheets("sheet1").Cells(1, i) にならなけらばいけないのでは? あと、forの使い方についても少し間違った覚え方をしておられる?かと・・ Sub test() For i = Worksheets("sheet1").Range("a65536").End(xlUp).Row To 2 Step -1 If Cells(i, 1) <> "" And Application.CountIf(Range(Cells(2, 1), Cells(i, 1)), Cells(i, 1).Value) = 1 Then key = Cells(i, 1).Value With Worksheets("Sheet2") Set h = .Range(.Cells(9, 7), .Cells(65536, 7).End(xlUp)).Find(what:=key, LookIn:=xlValues, lookat:=xlWhole) End With If Not h Is Nothing Then hRow = h.Row With Worksheets("Sheet2") .Cells(hRow, 8).Value = Cells(i, 2).Value .Cells(hRow, 9).Value = Cells(i, 3).Value .Cells(hRow, 10).Value = Cells(i, 4).Value End With End If End If Next i End Sub

kkk-z
質問者

お礼

ご回答どうもありがとうございます。 分からないコードがあるので、調べて実行したいと思います。 ご丁寧な回答、ほんとうに助かります。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

For i = 2 To a ・・・・・・・・・ i = i + 1 ・・・・・・・・・ Next For文の中でiの値を変えちゃだめですよ。

kkk-z
質問者

お礼

ありがとうございます。 かなり基礎的なことも分かっていないので、ご指摘助かります。