Excelマクロでファイル間の値反映と比較を行う方法

このQ&Aのポイント
  • Excelマクロを使用して、複数のファイル間で特定の列の値を検索し、別の列に反映する方法について解説します。
  • また、反映する際に条件を指定して特定の値のみを反映する方法や、既存の値と比較して不一致の場合に別のシートに情報を表示する方法についても説明します。
  • この方法を使用することで、データの一元管理や自動更新ができるようになります。
回答を見る
  • ベストアンサー

空白セルへの値反映と既存値との比較について

お世話になります。関数(Vlookup)では処理(手間)に時間がかかり、マクロ(書籍やマクロの記録など)は知識不足で作る事ができませんでした。恐れ入りますが下記の内容でExcelマクロの作り方をご教示いただきたいです。マクロを勉強し始めようとしているため、全くの初心者です。お手数ですがマクロ自体の処理内容もコメント記述していただけると非常にありがたいです。 【内容】 ファイルAのA列(商品番号)をファイルBとCとDの3つのファイルから検索して合致したファイル(BかCかD)のC列とD列の値をファイルAのC列とD列へ反映したい。 ファイルB~DのC列とD列の値は、不定期に更新される。 【詳細】 (1)マクロでファイルB・C・Dを開く。 (2)ファイルAのC列とD列の空白部分へファイルB・C・DのC列とD列の値を反映。 【条件】(2)の反映をする際に、ファイルAのE列が「書籍」で、F列が「1」の場合、ファイルDのC列とD列の値を反映したい。(理由は、ファイルCとDには、同じ商品番号が存在することがあるので) (3)あと、既に入力されているファイルAのC列とD列の値が、ファイルB~Dの 値と不一致の場合、別シートへ不一致の商品番号をリストアップしたい。 可能であれば、どの様に値が違うかも表示させたい。 表示例、本文の最下部の「不一致シート」の様な形で。 ※不一致シートへ表示させるだけで、上書きをしない様にしたい。 ■ファイルAのファイル名: 管理ファイル ■ファイルAのシート名: 管理シート 商品番号  商品名    棚番号  棚段数   種類   中古フラグ G-1111   A      600   8   書籍 G-2222   B         書籍 G-3333   C      112 2  書籍 G-6666   R        部品 G-8888   S        書籍 G-S9S9   000S  書籍    1 G-4444   K      600 8  部品 G-YYYY   GHJK        書籍    1 G-ASDF   TT        部品 G-7K9P   MKM      500 4  部品 G-4RFV   8LO        書籍    1 G-7UJM   ZXCV      112 2  書籍    1 G-2525   25JJ      119 3  書籍 G-VVVV   V        部品 G-CGCG   85F0      105 5  部品 G-3636   S234        部品 ■ファイルBのファイル名: バイク部門ファイル ■ファイルBのシート名: バイク部門シート 商品番号  商品名  棚番号  棚段数 G-4444   K    600     8 G-6666   R    100     9 G-3636   S234    112     2 G-VVVV   V G-CGCG   P520    105     5 G-ASDF   TT G-7K9P   MKM    500     4 ■ファイルCのファイル名: 車部門ファイル ■ファイルCのシート名: 車部門シート 商品番号   商品名    棚番号  棚段数 G-1111    A       600    8 G-2222    B G-3333    C       112    2 G-8888    S       105    5 G-2525    25JJ      119    3 G-7UJM    ZXCV G-YYYY    GHJK      200    1 ■ファイルDのファイル名: 車(トラック含)部門ファイル ■ファイルDのシート名: 車(トラック含)部門シート 商品番号   商品名    棚番号   棚段数 G-S9S9    000S  600    8 G-4RFV    8LO G-7UJM    ZXCV  112    2 G-YYYY    GHJK  200    1 ■ファイルAのファイル名: 管理ファイル ■ファイルAのシート名: 不一致シート 商品番号  棚番号(既存)   棚段数(既存)  棚番号(不一致)  棚段数(不一致) G-????    600          8         700          3 G-???1    100          1         200          6 以上です。宜しくお願い致します

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

  • ベストアンサー
  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.1

ファイルは全て同じフォルダに有るものとする。 C列とD列両方とも空白のときのみ変更する。 ファイル名は次のとおりです。 バイク部門ファイル.xls 車部門ファイル.xls 車(トラック含)部門ファイル.xls シート名は次のとおりです。 管理 バイク部門 車部門 車トラック含部門 不一致 このマクロは、管理ファイルに書いてある。 E列が「書籍」で、F列が「1」の場合、前の値と違うときは、不一致に書き出すとともに   C列とD列両方とも空白でないときも、管理を書き換えています。 管理ファイルの中で、商品番号のダブりは無いものとします。 管理ファイルにない商品番号はない!として処理しています。 違うときは、補足願います。 Sub 値の転記()   Dim 配列 As Variant   Dim 不一致(1 To 1000, 1 To 6) As Variant '不一致は1000行まで確保   Dim i As Long, j As Long, k As Long   Dim Gyo As Long   Dim myDic As Object   Set myDic = CreateObject("Scripting.Dictionary")   With ThisWorkbook.Sheets("管理")     配列 = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Resize(, 6).Value     For i = 1 To UBound(配列)       myDic.Add 配列(i, 1), i     Next   End With      On Error Resume Next     Workbooks("バイク部門ファイル.xls").Activate     If Err.Number <> 0 Then       Workbooks.Open Filename:=ThisWorkbook.Path & "\" & "バイク部門ファイル.xls"     End If   On Error GoTo 0   With Workbooks("バイク部門ファイル.xls").Sheets("バイク部門")     For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row       j = myDic.Item(.Range("A" & i).Value)       If 配列(j, 3) = "" And 配列(j, 4) = "" Then         配列(j, 3) = .Range("C" & i).Value         配列(j, 4) = .Range("D" & i).Value       Else         If 配列(j, 3) <> .Range("C" & i).Value Or _           配列(j, 4) <> .Range("D" & i).Value Then           Gyo = Gyo + 1           不一致(Gyo, 1) = 配列(j, 1)           不一致(Gyo, 2) = 配列(j, 3)           不一致(Gyo, 3) = 配列(j, 4)           不一致(Gyo, 4) = .Range("C" & i).Value           不一致(Gyo, 5) = .Range("D" & i).Value           不一致(Gyo, 6) = "バイク部門"         End If       End If     Next i   End With 以下次の回答で

その他の回答 (2)

  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.3

続き 3   On Error Resume Next     Workbooks("車(トラック含)部門ファイル.xls").Activate     If Err.Number <> 0 Then       Workbooks.Open Filename:=ThisWorkbook.Path & "\" & "車(トラック含)部門ファイル.xls"     End If   On Error GoTo 0   With Workbooks("車(トラック含)部門ファイル.xls").Sheets("車トラック含部門")     For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row       j = myDic.Item(.Range("A" & i).Value)       If 配列(j, 3) = "" And 配列(j, 4) = "" Then         配列(j, 3) = .Range("C" & i).Value         配列(j, 4) = .Range("D" & i).Value       Else         If 配列(j, 3) <> .Range("C" & i).Value Or _           配列(j, 4) <> .Range("D" & i).Value Then           Gyo = Gyo + 1           不一致(Gyo, 1) = 配列(j, 1)           不一致(Gyo, 2) = 配列(j, 3)           不一致(Gyo, 3) = 配列(j, 4)           不一致(Gyo, 4) = .Range("C" & i).Value           不一致(Gyo, 5) = .Range("D" & i).Value           不一致(Gyo, 6) = "トラック含"         End If         If 配列(j, 5) = "書籍" And 配列(j, 6) = 1 Then           配列(j, 3) = .Range("C" & i).Value           配列(j, 4) = .Range("D" & i).Value         End If       End If     Next i   End With   With ThisWorkbook     .Sheets("管理").Range("A2", .Sheets("管理").Range("A" & Rows.Count).End(xlUp)).Resize(, 6).Value = 配列     .Sheets("不一致").Range("A2:F1001").ClearContents     .Sheets("不一致").Range("A2", .Sheets("不一致").Range("F" & Gyo + 1)).Value = 不一致   End With      Set myDic = Nothing End Sub

goozy838
質問者

補足

ki-aaa様 ご教示いただきありがとう御座いました。 無事、実施したい事ができました。本当に感謝致します。 ご質問させていただきたいのですが、「管理シート」の「棚番号」と「棚段数」の列を移動したくて、下記のマクロの部分で、移動先の列番号に変更しました。 しかし、「棚番号」の列には反映されましたが、「棚段数」の列は全く反映されず空白のままになります。。 ※「棚番号」は、5列目(E列)へ移動し、「棚段数」は、8列目(H列)へ移動したい。 ※下記マクロの箇所が3回続くので、全て列番号は変更しました。 If 配列(j, 5) = "" And 配列(j, 8) = "" Then 配列(j, 5) = .Range("C" & i).Value 配列(j, 8) = .Range("D" & i).Value Else If 配列(j, 5) <> .Range("C" & i).Value Or _ 配列(j, 8) <> .Range("D" & i).Value Then Gyo = Gyo + 1 不一致(Gyo, 1) = 配列(j, 1) 不一致(Gyo, 2) = 配列(j, 5) 不一致(Gyo, 3) = 配列(j, 5) 不一致(Gyo, 4) = .Range("C" & i).Value 不一致(Gyo, 5) = .Range("D" & i).Value 不一致(Gyo, 6) = "バイク部門" End If 他の部署の依頼により今後も「棚番号」と「棚段数」の列を移動させる可能性がございます。 恐れ入りますが、移動させる場合のマクロの変更箇所と変更した箇所のマクロの意味をお教え頂けないでしょうか。 御手数おかけしており大変恐縮ですが、何卒、宜しくお願い致します。

  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.2

続き 2   On Error Resume Next     Workbooks("車部門ファイル.xls").Activate     If Err.Number <> 0 Then       Workbooks.Open Filename:=ThisWorkbook.Path & "\" & "車部門ファイル.xls"     End If   On Error GoTo 0   With Workbooks("車部門ファイル.xls").Sheets("車部門")     For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row       j = myDic.Item(.Range("A" & i).Value)       If 配列(j, 3) = "" And 配列(j, 4) = "" Then         配列(j, 3) = .Range("C" & i).Value         配列(j, 4) = .Range("D" & i).Value       Else         If 配列(j, 3) <> .Range("C" & i).Value Or _           配列(j, 4) <> .Range("D" & i).Value Then           Gyo = Gyo + 1           不一致(Gyo, 1) = 配列(j, 1)           不一致(Gyo, 2) = 配列(j, 3)           不一致(Gyo, 3) = 配列(j, 4)           不一致(Gyo, 4) = .Range("C" & i).Value           不一致(Gyo, 5) = .Range("D" & i).Value           不一致(Gyo, 6) = "車部門"         End If       End If     Next i   End With

goozy838
質問者

お礼

ki-aaa様 ご教授いただきありがとう御座いました。 不明点が多く戸惑ってばかりですが、 もっとマクロを勉強するように致します。 御手数おかけしました。

関連するQ&A

  • エクセルで既存の売上データに部門名を付け加えたい

    csvで書き出した売上データがあります。 エクセルで読み込みシート名を「売上リスト」としました。 列項目は、A列:商品番号、B列:商品名、C列:商品点数、D列:商品単価、E列:合計銀額です。 この売上リストに、F列:商品部門を後から付け加えたいと考えています。 別のシートに商品番号と商品部門が同じ行にある参照用データ「商品リスト」を用意しました。 商品リストも売上データ同様csvで書き出したもので、商品部門列が名称ではなく部門ID(数字)になっています。 そこで、A列:部門ID、B列:部門名の「部門リスト」を用意しました。 シート1:売上リスト(約400行) シート2:商品リスト(約600行) シート3:部門リスト(10行) 売上リストの各行に関連する部門名を付け加えるために、いくつか手順を踏まなくてはと推測できますが、どうしていいのかわかりません。 1.売上リストの商品番号を参照し商品リストの商品番号と一致する行の部門IDを呼び出す。 2.呼び出した部門IDを関連する名称に変更する。 のような感じになるのでしょうか。 初歩的な質問かもしれませんが、具体的にどうしたらいいのかさっぱりわかりません。 よろしくお願いします。

  • 別のファイルの条件にあう数値を反映させたい

    ファイルAはその日の発注個数 C列に順番がバラバラの商品名   O列に個数 のような表になってます ファイルBは一か月の発注個数 B1列に商品名  D1から1行ごとに個数が表示される表になってます ファイルBの商品名と同じ ファイルAの個数を ファイルBのD1に反映させるにはどうすればいいですか? ファイルBのD1に =('F:\発注\[1.xls]Sheet1'!$C$4:$C$43,B1,'F:\発注\[1.xls]Sheet1'!$O$4:$O$43) と自分なりにやってみたら#VALUE!の表記になりました 正しい数式を教えてください

  • Excelでの値の比較

    エクセルにおいて、sheet2のA列とB列をsheet1のA列とB列を比較して、一致した場合sheet2のD列に下記のような結果を示すようにしたいのですが、どうやってD列に関数を組めばよいのか分からないので教えてください! 【sheet1】 A列 B列 C列 1行 001 AAAA 部品1 2行 002 BBBB 部品2 3行 003 CCCC 部品3 4行 004 DDDD 部品4 5行 005 EEEE 部品5 6行 006 FFFF 部品6 7行 007 GGGG 部品7 【sheet2】 A列 B列 C列 D列←この列に関数で○か×をつける 1行 001 AAAA 部品1 ○←sheet1にあるので○ 2行 008 HHHH 部品8 ×←sheet1にないので× 3行 004 DDDD 部品4 ○ 4行 009 IIII 部品9 × 5行 005 EEEE 部品5 ○ 6行 002 BBBB 部品2 ○ 7行 010 HHHH 部品10 ×

  • 別シート同士のセルを比較して一致したらセルに代入をしたいと考えています

    別シート同士のセルを比較して一致したらセルに代入をしたいと考えています。 excelのVBAを使って行いたいのです book1のsheet1に A列     B列    C列       D列 2000     NEC   VL100 5000     Sony   vaio-200 3000     東芝     letsnote 単価、メーカー、型番、空き列があり 200行くらいです。 book2のsheet1に 同じく、単価、メーカー、型番がありますが 単価がsheet1とは異なり、違うメーカー型番の情報が 4000行くらいあります A列     B列    C列 5225     XXXX   XXXX 2200     NEC   VL100 5200     Sony   vaio-200 2684     XXXX   XXXX 2566     XXXX   XXXX 6000     東芝     letsnote ・・・・・・ ・・・・・・ そこで book1のB,C列のメーカーと型番が一致するものを book2のsheet1のB,C列から探し 一致したら、book1のsheet1のD列に book2 sheet1のA列の値を入れのです。 参考になるスクリプトを教えて頂けると大変助かります、 よろしくお願い致します。

  • セルの比較

    初投稿させていただきます。宜しくお願い致します。 office系のソフトは初心者で何とかならないものかと悩んでます。 excelで特定のセルのデータと行全体を比較して、一致する文字列を含んだセルを返してほしいのです。 それを各セルごとに行い、まとめて別のシートに出力させることは可能でしょうか? たとえば   A    B    C 1 あい  い   う 2 いか  う   えい 3 うみ  え   お 4 えい  お   か 5 うさ  か   き があって Cの各セルとA行全体を比較して結果を別に出力  ・・・ D 1    A3,A5 2    A4 3 4 5 ない場合は空白でも×でもいいのですが こんな感じにできないでしょうか。 実際のデータはファイルが別になっていてファイルAのC行とファイルBのB行のセル(200個くらい)との比較といった感じです。 いろいろ調べては見たのですが、うまくいかず・・・ 欲張った内容かも知れません。 すみませんがどなたかいい方法を教えて頂けませんか。

  • エクセルで空白以外のセルの値を取りたいのですが

    質問させていただきます。 エクセルで下記のようなデータがあるのですが、 A列が製品番号 B列が製品名 C列が分類名 D列からZ列までがC列に入れる名称がひとつだけあります。 2つ以上入ってることはありません。 教えていただきたいのは、D列からZ列までに値があれば自動でC列に反映させる関数です。 例えば、D2にPCとあればC2にPCと反映される。 Z3にTVとあればC3にTVと反映される。 という具合です。 この場合、E2からZ2、E3からY3までは空白になってます。 データの件数が3000件以上あり、週に2回くらいやる作業なのでなるべく作業効率を上げたいと思っております。 よろしくお願いいたします。

  • エクセル2つのセルを1つのデータとして一致

    エクセル初心者です。 (1)シートのA列には店舗名(A列には同じ店舗名が複数あります)とB列には数値を入力しています。(2)のシートには(1)シート同様のデータが入力されていますがCとD列に値があります。 (1)シートの同行内のAとB列を1つのデータとして(2)のシートのAとB列が一致したらCとD列の値を(1)シートに返す事は可能でしょうか? (1)シート A列    B列   C列   D列 ヤマダ   25 スズキ   10 ヤマダ   100 (2)シート A列    B列   C列   D列 ヤマダ   25    5    英 スズキ   10    6    独 ヤマダ   100    6 仏 さくら  20    8 英 つたない説明で申し訳ありません。

  • 二つのシートのセルを比較して、あるセルの値が一致した場合に、片方のセル

    二つのシートのセルを比較して、あるセルの値が一致した場合に、片方のセルの値を 別のシートに設定するには、どうしたらいいでしょうか? [シート1] --|A---B---C---D---E --+---+---+---+---+--- 01|A1 ??? 02|A2 yyy 03|B1 ??? 04|C1 sss [シート2] --|A---B---C---D---E --+---+---+---+---+--- 01|A1 aaa 02|A3 bbb 03|B0 xxx 04|B1 ccc 05|C1 sss シート1 [Aのセル]とシート2の[Aのセル] を比較し、同じ値だった場合に、 シート2の [B] の値を シート1の[C]に設定するための関数はどのようにしたら良いでしょうか? 最終的に、シート1が --|A---B---C---D---E --+---+---+---+---+--- 01|A1 ??? aaa 02|A2 yyy 03|B1 ??? ccc 04|C1 sss sss となります。 Excelの関数あマクロは、どうしても分からなく質問させてもらいました。 申し訳ありませんが、ご教授宜しくお願い致します。

  • エクセル:セルを参照して計算

    お世話になります。 A列にコード番号が、B列に数値が入っています。 A列のコード番号は順不同で重複もあります。 C列にはコード番号の一覧が入っています。(重複なし) C列と一致するコード番号をA列から探し、対応するB列の合計をD列に表示する。 A列に一致するコード番号がないときは0と表示させる。 この場合、D列にはどのような計算式を入力されておけばよいのでしょうか。 例) A1にA、A2にB、A3にC、A4にA、A5にB、A6にD B1に10、B2に20、B3に30、B4に15、B5に20、B6に50 C1にA、C2にB、C3にC、C4にD、C5にE・・・・ この場合 D1には10+15なので25、D2には20+20なので40、D3には30、D4には50、 D5には0を入力する。 よろしくお願いします。

  • 他のシートのセルの値を引用したい

    EXCEL2007でマクロ作成中の初心者です。今困っています。お助けください。 シートのA列に名前が書いてあります。 その名前の横B列に番号を入れたいのです。      A       B     1 佐藤   2 伊東   3 加藤   4 以下つづく 横B列の番号は他のシートにあります。現状では以下の番号になります。     A          B     1 佐藤        1   2 伊東        3   3 加藤        5   4 以下つづく 他のシートに以下の表があります。これは可変の表で、名前は次の列は空白です。 名前のあるセルのみ上の番号を表示したいです。 、       A    B    C    D    E     F   G  →以下つづく    1     2 番号    1     2    3     4    5    6   7   →以下つづく    3 名前   佐藤        伊東       加藤      田中  →以下つづく わかりにくいかもしれませんがよろしくお願いします。

専門家に質問してみよう