質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

VBAで A と B のブックを比較して、Bのある列の値をAに転記したいです。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 6,550

score 16

VBAについてです。

前提・実現したいこと

VBAで2つのブックを比較して、データの転記がしたいです。
Book1(sheet1) 転記するシート 
Book2(sheet1) 転記元のシート

このbook1とbook2のある列のデータを比較して、数値が同じならbook2のある列のデータをbook1の対応する列に転記するといった動作をやりたいです。

具体的には、
book1のD列の2行目のデータをbook2のD列から検索して、合致しているデータがあれば、
book2の合致した行にあるY列のデータをbook1の2行目のO列に転記する。
この動作をbook1のD列の3行目、4行目...最終行まで繰り返し処理をしたいです。

それぞれのbookのイメージとして、book1は売上伝票をまとめたようなもので、book2はユーザーのマスタのようなものです。

動きのイメージとしては関数のvlookupに近いと思います。

発生している問題・エラーメッセージ

book1のD2のデータをbook2のD列から検索して、検索が終わったら次のbook1のD3のデータを検索する、という動きがifやforなどを使えばできそうなのはなんとなくわかるのですが、具体的にどうすればいいのかわかりません。涙

該当のソースコード

    Public Sub ブック間転送()
'ループ用の変数
    Dim m As Long
    Dim n As Long
    Dim row1 As Long        'Book1 O列へ書き込む行番号
    Dim s1 As Worksheet
    Dim s2 As Worksheet

    Set s1 = Workbooks("book1.xlsx").Worksheets(1)
    Set s2 = Workbooks("book2.xlsx").Worksheets(1)
    row1 = 2
    'それぞれのシートの比較行を最終行までループ
    For m = 2 To s1.Cells(Rows.Count, 4).End(xlUp).Row
        For n = 2 To s2.Cells(Rows.Count, 4).End(xlUp).Row

            'book1とbook2のD列の比較 これだと列ごとに比較してしまうので
            'book1の(m,4)をbook2のD列の全てのデータと比較して、転記が終わってから次の処理に移りたいです。
            If s1.Cells(m, 4).Value = s2.Cells(n, 4).Value Then
                s1.Cells(row1, "O").Value = s2.Cells(n, "Y").Value
                row1 = row1 + 1
            End If
        Next
    Next
End Sub

試したこと

補足情報(FW/ツールのバージョンなど)

イメージ説明
左がbook1で右がbook2です。
book1のD列のd2をbook2のD列から検索して、Y列の1001という値をbook1のO列に転記したいです。
d1なら対応するO列に1000が入ります。これを1行ずつ繰り返すような処理です。

どうぞよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yama0131

    2019/09/18 19:47

    ご指摘ありがとうございます!
    確認して修正します!

    キャンセル

  • tatsu99

    2019/09/18 21:43 編集

    検索した結果、実際にO列に設定される値を記入していただけませんでしょうか。
    Book2のD列は重複した値はないのでしょうか。
    Book1はおよそ何行ありますか。
    Book2はおよそ何行ありますか。

    キャンセル

  • yama0131

    2019/09/18 22:12

    検索した結果は画像を差し替えたので確認お願いします!
    book2のD列には重複するデータはありません。顧客の名前や番号をリスト化したものになっています。
    book1は50行 book2は150行ほどになります。

    キャンセル

回答 4

checkベストアンサー

+2

あなたの提示されたソースに追加及び修正を加えました。

Public Sub ブック間転送()
'ループ用の変数
    Dim m As Long
    Dim n As Long
    Dim row1 As Long        'Book1 O列へ書き込む行番号
    Dim s1 As Worksheet
    Dim s2 As Worksheet

    Set s1 = Workbooks("book1.xlsx").Worksheets(1)
    Set s2 = Workbooks("book2.xlsx").Worksheets(1)
    row1 = 2
    'それぞれのシートの比較行を最終行までループ
    For m = 2 To s1.Cells(Rows.Count, 4).End(xlUp).Row
        For n = 2 To s2.Cells(Rows.Count, 4).End(xlUp).Row

            'book1とbook2のD列の比較 これだと列ごとに比較してしまうので
            'book1の(m,4)をbook2のD列の全てのデータと比較して、転記が終わってから次の処理に移りたいです。
            If s1.Cells(m, 4).Value = s2.Cells(n, 4).Value Then
                s1.Cells(row1, "O").Value = s2.Cells(n, "Y").Value
                row1 = row1 + 1
            End If
        Next
    Next
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/18 23:12

    できました!ありがとうございました!
    ただ、book2のY列にデータがなかった場合にbook1のO列に0を入れようと思ったのですが、
    その場合はIF文をデータがない場合といったように分岐させるのがいいでしょうか?

    キャンセル

+2

添付図の左側がBook1で右側がBook2です。
Y列のd2Y1,d2Y2,d3Y1(黄色のセル)がBook1のO列に並ぶかと思いますが、
どのように並べば良いのでしょうか。
O2=d2Y1
O3=d2Y2
O4=d3Y1
でよいのですか?
添付図

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/18 19:46

    その動きで間違いないです!

    キャンセル

  • 2019/09/18 21:31

    見間違えてしまって申し訳ないのですが、この場合だと O2 には何も入らないような形になります!
    補足情報に画像付きで説明を載せたので、また見て頂けると幸いです!

    キャンセル

+2

前回、回答者です。
>ただ、book2のY列にデータがなかった場合にbook1のO列に0を入れようと思ったのですが、
>その場合はIF文をデータがない場合といったように分岐させるのがいいでしょうか?
はい、そのようにします。以下サンプルです。

Public Sub ブック間転送()
'ループ用の変数
    Dim m As Long
    Dim n As Long
    Dim row1 As Long        'Book1 O列へ書き込む行番号
    Dim s1 As Worksheet
    Dim s2 As Worksheet

    Set s1 = Workbooks("book1.xlsx").Worksheets(1)
    Set s2 = Workbooks("book2.xlsx").Worksheets(1)
    'それぞれのシートの比較行を最終行までループ
    For m = 2 To s1.Cells(Rows.Count, 4).End(xlUp).Row
        s1.Cells(m, "O").Value = ""
        For n = 2 To s2.Cells(Rows.Count, 4).End(xlUp).Row

            'book1とbook2のD列の比較 これだと列ごとに比較してしまうので
            'book1の(m,4)をbook2のD列の全てのデータと比較して、転記が終わってから次の処理に移りたいです。
            If s1.Cells(m, 4).Value = s2.Cells(n, 4).Value Then
                If s2.Cells(n, "Y").Value = "" Then
                    s1.Cells(m, "O").Value = 0
                Else
                    s1.Cells(m, "O").Value = s2.Cells(n, "Y").Value
                End If
                Exit For
            End If
        Next
    Next
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/19 09:11

    IFを2つ使えばよかったんですね!
    いろいろとありがとうございました!
    もっと勉強します!

    キャンセル

0

Excelだけではなく
CSVでも出来ますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る