VBAで値が一致したときに転記するマクロを組んでいるのですが、うまいこと転記できず困っております。
前提・実現したいこと
ざっくりとどういう動きをさせたいかですが、
商品コードのマスタと、棚卸した結果のブックがあり、両ブックの項番が一致したとき、
棚卸結果をマスタに転記させるというものです。
発生している問題・エラーメッセージ
以下コードにて実行したのですが、そもそもVBAへの理解度が乏しく全量把握できておりません...;;
圧倒的な知識不足により質問の意図がうまく伝えられず申し訳ございませんが何卒、皆様のお力をお借りしたく...
以下、当サイトで質問されていたコードを基に作成いたしました。
Public Sub ブック間転記() 'ループ用の変数 Dim m As Long Dim n As Long Dim row1 As Long 'マスタ C,D列へ書き込む行番号 Dim s1 As Worksheet Dim s2 As Worksheet Set s1 = Workbooks("マスタ.xlsx").Worksheets(1) Set s2 = Workbooks("棚卸結果.xlsx").Worksheets(1) row1 = 2 'それぞれのシートの比較行を最終行までループ For m = 2 To s1.Cells(Rows.Count, 1).End(xlUp).Row For n = 2 To s2.Cells(Rows.Count, 4).End(xlUp).Row 'マスタと棚卸結果列の比較 これだと列ごとに比較してしまうので 'マスタの(m,1)を棚卸結果のD列の全てのデータと比較して、転記が終わってから次の処理に移りたい。 If s1.Cells(m, 1).Value = s2.Cells(n, 4).Value Then s1.Cells(row1, "C").Value = s2.Cells(n, "A").Value row1 = row1 + 1 End If Next Next End Sub
試したこと
補足情報(FW/ツールのバージョンなど)
・マスタは連番で採番されている
・棚卸結果は項番がバラバラ
・マスタ、棚卸結果、どちらも40万行ほど
マスタA列と、棚卸結果D列が一致したとき、マスタC,D列に棚卸結果A,B列を転記したいです。
また、要件が40万行と多いこともあり処理速度の向上についても助言いただきたく...
当方、業務でVBAを使用したことがないのですが必要だとのことで依頼されまして、
周りはVBAを使ったことがない方で解決にも至らず大変困っております...;;;
何卒よろしくお願い致します。
VBAではなくエクセルの関数ではダメなのでしょうか?
コメントありがとうございます!
要件が40万行ほどある事もあり、今後も使いたいのでVBAで、とのご依頼でして…;;
商品コードマスタのデータは固定で、棚卸のデータが可変として理解したので
その内容で話を進めます(そもそもの理解がずれていたらすいません)
商品コードのマスタを配列に入れます。(データ数固定の配列)
棚卸のデータも配列に入れいます(データ数変動の配列)
棚卸のデータをループを読み込んで、商品コードマスタとマッチングさせる
結果を配列に格納
全チェックが終わった時点で棚卸データの配列をセルに貼り付け
というような流れでコーディングを検討ください
一つ気になったのですが、一致したときに転記するマスタ側の行はm行目ではなくrow1行目なのですか?これだと仮に2行目該当なし→3行目該当番ありだった時に2行目に転記されると思うのですが仕様通りですか?
もう一点、棚卸結果の項番は被り無しですか?それとも、「同じ項番が複数あって最新のものを採用したい」ですか?どちらかで実装仕様が変わってきますね
マスタの項番は、間違いなく1からの連番で作成されていますか。(歯抜けなし)
もし、それが保証されているなら、検索処理を行う必要はありません。
棚卸データの項番の値+1が、マスタデータの対象行になります。
例
棚卸データの項番=10 →マスタの11行がマスタの項番=10
棚卸データの項番=15 →マスタの16行がマスタの項番=15
この方法が処理速度では圧倒的に速くなります。
1からの連番であることが、保証されないなら、使用出ません。
連番が保証されているなら、前のコメントの方法が高速でしょう。さらに、配列を使用するとより高速になります。
連番が保証されていない、抜けがあるなどなら、Dictionaryオブジェクトと配列を使うのが高速です。
皆様、お返事できておらず大変申し訳ございません。
突発的な出張が重なり本日帰宅いたしました。
今からいろいろと試してみますので今しばらくお待ちいただけると幸いです。。。
>okakemetalさん
理解あっております。
アドバイスありがとうございます!!
配列がいまいち理解できておらず絶賛勉強中でございまして...
とはいえ、流れはなんとなくですが理解できました!
ありがとうございます!
>pig_vbaさん
おっしゃる通りで、とんちんかんな場所に転記されており見逃しておりました(;´д`)トホホ
棚卸結果の項番は被り無しでございます。
>tatsu99さん
連番で作成されており、抜け無しです。
その発想は全くございませんでした...
アドバイスありがとうございます!
>hatena19さん
配列...やはり処理速度のことを考えると必須ですね...
項番に抜けがある場合のアドバイスについてもありがとうございます!
回答2件
あなたの回答
tips
プレビュー

