Excel VBAを使用して別シートの一致するセルに代入する方法

このQ&Aのポイント
  • Excel VBAを使用して、別のシートのセルを比較し、一致した場合に一方のセルに値を代入する方法を教えてください。
  • book1のsheet1には単価、メーカー、型番、および空白の列があり、約200行あります。book2のsheet1には単価、メーカー、型番があり、約4000行あります。
  • book1のB列とC列のメーカーと型番を一致するものを、book2のsheet1のB列とC列から検索し、一致した場合は、book1のsheet1のD列にbook2のsheet1のA列の値を入力します。
回答を見る
  • ベストアンサー

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

別シート同士のセルを比較して一致したらセルに代入をしたいと考えています。 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列の値を入れのです。 参考になるスクリプトを教えて頂けると大変助かります、 よろしくお願い致します。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.7

#6です。マスターに空欄があるというのは想定外でした。 コードの最初の部分を下記の通り置き換えれば良いでしょう。 With Workbooks("Book2.xls").Sheets("Sheet1") buf1 = .Range(.Range("A1"), .Range("A" & .Rows.Count).End(xlUp)).Resize(, 2) End With

pcguard55
質問者

お礼

おお神様、仏様、mitarashi様 おかげ様で思い通りの事が出来ました。 配列数式についてまだ理解が出来ていませんが、 シンプルなコードでこんな事が出来るのですね。 これを機会にもう少し掘り下げて勉強します。 ほんとに有難う御座いました!!

その他の回答 (6)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.6

#4,5です。 話は簡単で、#5のコードで、 If (buf1(j, 2) Like ("*" & buf2(i, 2) & "*")) * (buf1(j, 2) Like ("*" & buf2(i, 3) & "*")) Then buf2(i, 4) = buf1(j, 1) '一つめを見つけたら探索打ち切り Exit For End If と、一行変更すれば良いと思います。 ただし、型番だけでなく、メーカー名もAND条件としています。

pcguard55
質問者

お礼

mitarashi様 頂いたコードで出来ました! ただBook2のシートに空白行がまばらにあり、 空白行で停止してしまいます。 最下行まで検索して条件が合えば単価を 書き込む方法があればお教え頂きたいのですが....... たびたび条件を変えてしまい心苦しく思います、 なにかよきアドバイスを頂きたく存じます。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

#4です。ちょっと悪のりして... 配列数式でやっているのは結局こういう事なんだなと、やってみました。 Sub test() Dim buf1 As Variant, buf2 As Variant Dim myRange As Range Dim i As Long, j As Long buf1 = Workbooks("Book2.xls").Sheets("Sheet1").Range("A1").CurrentRegion With Workbooks("Book1.xls").Sheets("Sheet1") Set myRange = .Range(.Range("A1"), .Range("A" & .Rows.Count).End(xlUp)) End With Set myRange = myRange.Resize(, 4) buf2 = myRange For i = 1 To UBound(buf2, 1) For j = 1 To UBound(buf1, 1) If (buf2(i, 2) = buf1(j, 2)) * (buf2(i, 3) = buf1(j, 3)) Then buf2(i, 4) = buf1(j, 1) '一つめを見つけたら探索打ち切り Exit For End If Next j Next i myRange = buf2 End Sub

pcguard55
質問者

お礼

ご回答いただいている皆様 すばらしいご回答、誠に有難う御座います、 皆様のお知恵を借りながらやっているのですが 重大な事に気が付きました。 book2のsheet1なのですが、 B列の文字とC列の文字は別々のセルではなく、同一のセルでした、 ですのでC列は無く、B列にメーカーと型番が一つの文字列として記載されていました。 A列        B列    5225     XXXX XXXX 2200     NEC  VL100 5200     Sony  vaio-200 2684     XXXX XXXX 2566     XXXX XXXX 6000     東芝 letsnote 上記のようにB列にメーカと型番が1つの文字列として書かれていました。 型番に関しては、メーカーとか関係なく、唯一無二のものとして型番で検索すれば 重複は無いものとして、 Book1のsheet1のC列の文字を部分一致でbook2のC列から探さないと駄目なことに 気がつきました。 その場合の比較の仕方はどのようにすれば宜しいでしょうか?? この結果に皆様あきれられておられると思いますが、今一度お知恵拝借させて頂ければ 大変助かります。 何卒お願い申し上げます。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

VBAでやる範疇に入らないかもしれませんが、最近配列数式に凝っています。ご参考まで。 別ブックにつけた名前を使っているので、汎用化するにはもう一工夫必要です。 また、条件を満足するものが複数有ると、足し算されてしまいます。 Sub test() Dim refRange As Range, targetRange As Range, myCell As Range Set refRange = Workbooks("Book2.xls").Sheets("Sheet1").Range("A1").CurrentRegion Workbooks("Book2.xls").Names.Add Name:="data", RefersTo:=refRange With Workbooks("Book1.xls").Sheets("Sheet1") Set targetRange = .Range(.Range("A1"), .Range("A" & .Rows.Count).End(xlUp)) End With Set targetRange = targetRange.Offset(0, 3) For Each myCell In targetRange.Cells myCell.FormulaArray = _ "=SUM((INDEX(Book2!data,,2)=Sheet1!RC[-2])*(INDEX(Book2!data,,3)=Sheet1!RC[-1])*(INDEX(Book2!data,,1)))" Next myCell targetRange.Value = targetRange.Value Workbooks("Book2.xls").Names("data").Delete End Sub

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

Book1のメーカーと型番から、メーカーと型番の2列が一致するものを探すのは、相当むずかしい。 結合した列を作ればVLOOKUP関数やFindメソドでで出来ると思う。 ーー 本当はAccessなどで使われるSQLなどのデータベース検索言語のお世話にならないとすなおな処理にならない。エクセルでもMsクエリと言うのがあるので使えるかもしれないが。 ーー Book2(元データ)を、メーカー+型番でソートしておけば、そのキーでユニークである保証があれば FindやVLOOKUP関数が使えるかも。メーカーの行郡の先頭行を見つけ、その行から下での最初に出現する型番のデータを持ってくるロジック。そのメーカでは、その型番がない場合もあるので、型番が見つかればそのメーカーが求めるものかチェックは必要。 ーー エクセルに「フィルタオプションの設定」がある。これをマクロの記録を採って改良し、使えるかもしれない。 ーーー もうひとつはBook1,Book2をメーカー+型番でソートし、両ファイルをメーカー+型番キーでマッチングさせて処理できる。しかしいまどきの人は、このロジックに慣れて居ないと思うので難しいかも。 判ればこれが一番処理も早い(ソート時間を除き)し処理も提携パターンで誤りが少ないと思うが。 ーー 質問者のVBAの技量がわからないので、どれが良いか決めかねる。初心者には、どれも判ってもらうのが難しい。

回答No.2

検証してないけどこんなかんじ! 数字を比較する場合は注意! 単純比較だとヒットしない場合がある! その場合は関数で型変換!(今回省略) 共にブックを開いていることが条件 Sub 比較() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim i As Long Dim k As Long Dim Endrow As Long Dim c As Range Set Ws1 = Workbooks("Book1.xls").Worksheets("Sheet1") Set Ws2 = Workbooks("Book2.xls").Worksheets("Sheet1") Endrow = Ws2.Range("a65536").End(xlUp).Row i = 2 Do Until Ws1.Cells(i, 1).Value = "" For Each c In Ws2.Range("a2:a" & Endrow) If Ws1.Cells(i, 2).Value = c.Offset(0, 1).Value Then If Ws1.Cells(i, 3).Value = c.Offset(0, 2).Value Then Ws1.Cells(i, 4).Value = c.Value End If End If Next Loop End Sub

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.1

もし、book2のほうに、 3000  NEC  VL100 4000  NEC  VL100 というように、NEC+VL100というデータが複数あって、単価が違う場合は、どのような処理をするのでしょうか? メーカーと型番が同じデータは重複することは絶対にない、とか、メーカーと型番が同じデータの単価は必ず同じ、とか、そういう制限はありますか?

pcguard55
質問者

補足

86ft3kr様 メーカーと型番が同じデータは無く、 同じメーカー、同じ型番で違う単価は無いものと想定します、 仮にあったとしたら、上書きでかまいません。

関連するQ&A

  • エクセルの比較一致を別シートに書き出し!

    エクセルで別々のシートで比較一致したシートを別のシートに自動で書き出しが出来るようにしたいのですがどうやって良いのか分からないので教えてください! まず、sheet1に下記の表があります。   A列 B列 C列 D列 E列 1行 部品1 c1 c2 c3 c4 2行 部品2 r1 r2 r3 次にsheet2は下記の表があります。   A列 1行 c1 2行 r1 3行 c2 4行 r2 5行 r3 6行 c3 7行 c4 このsheet1とsheet2と比較させて、一致した内容をsheet3を下記のように表示させることは、出来ますか?(部品1=c1,c2,c3,c4 部品2=r1,r2,r3)   A列 B列 1行 c1 部品1  2行 r1 部品2 3行 c2 部品1 4行 r2 部品2 5行 r3 部品1 6行 c3 部品1 7行 c4 部品1 以上、お手数ですがよろしくお願いします。

  • 一致するデータを複数シートから別のシートへ移動

    Sheet1~Sheet3を用いて、 Sheet1とSheet2でそれぞれのC列の項目が一致するデータを抽出し、 該当するデータの Sheet1B列⇒Sheet3D1 Sheet2A列⇒Sheet3A1 Sheet2B列⇒Sheet3B1 Sheet2C列⇒Sheet3C1 に移動するためのマクロを組みたいと思っています。 Sheet2からSheet1に検索をかけて、 Sheet2C列≠Sheet1C列であればSheet2のA1行を削除していき Sheet2C列=Sheet1C列であれば Sheet2A~C列をSheet3A~C列へ移動するところまでは出来ました。 ※なお、Sheet3のA1行に文字列があればセルを1行追加する設定にしています。 しかし、それはA1行の文字列をそのままコピペしているだけなので Sheet1B列の一致データをSheet3D1へ移動するやり方が思い浮かびません…。 Sheet2と同じくA1行を削除していこうとしてもうまくいきませんでした。 どんどんマクロも指示文ばかりが増えてわけが分からなくなってきてしまい、挫折しています。 シンプルにするにはどうすればいいでしょうか? また、マクロの内容を載せたいのですが 会社の業務端末で組んでいるため転記できません; 申し訳ありませんが、どうかご指導ください。

  • 比較して一致したら指定セルに貼り付け処理

    【Sheet1】の日付A1セルと【Sheet2】の日付A行を比較。 ※ 【Sheet1】の比較元はA1だけでいい 一致しなければ【Sheet2】のA行を一つ下げ、比較し直し、一致するまで比較 一致したら【Sheet1】のA列以降を全てコピーし【Sheet2】の一致した日付の隣B列に以下の様に貼り付けする 【Sheet1】            【Sheet2】     A        B   C       A 1 2008/1/2 0:45  72  99   1 2008/1/2 0:00 2 2008/1/2 1:00  76  84   2 2008/1/2 0:15 3 2008/1/2 1:15  19  45   3 2008/1/2 0:30 4 2008/1/2 1:30  30  78   4 2008/1/2 0:45 5 2008/1/2 1:45  56  33   5 2008/1/2 1:00 ↓『結果』 【Sheet2】    A          B 1 2008/1/2 0:00 2 2008/1/2 0:15 3 2008/1/2 0:30 4 2008/1/2 0:45  2008/1/2 0:45 72 99 5 2008/1/2 1:00  2008/1/2 1:00 76 84 6 2008/1/2 1:15  2008/1/2 1:15 19 45 7 2008/1/2 1:30  2008/1/2 1:30 30 78 8 2008/1/2 1:45  2008/1/2 1:45 56 33 -------------------------------------------------------------------------- Dim i As Integer Dim Com As Integer Dim s As Integer SheetName = "Sheet1" SheetName2 = "Sheet2" Do For Com = 1 To 20 ' Sheet1のA1とSheet2のA行セルが一致するまで比較 If StrComp(Worksheets(SheetName).Cells(1, 1), Worksheets(SheetName2).Cells(Com, 1), vbTextCompare) Then ' 一致したらA列をコピー Rows("1:1").Select Selection.Copy Else ' 一致しなければSheet2のAセルを一つ下げる WorkSheets(SheetName2).Cells(Com, 1).Offset(1, 0).Select End If Next ' 一致するまで比較 Loop Until StrComp(Cells(1, 1), Cells(s, 10)) -------------------------------------------------------------------------- Loop Untilの箇所で記述がおかしいせいかアプリケーション定義、またはオブジェクトエラーになってしまいます。 一致した時、Sheet1のA1列の情報をSheet2の指定箇所に格納する記述の仕方がどうしてもわかりません。 何かいい記述はないでしょうか? 質問が長くなってしまいましたが、どうか教えていただきたく思います。 よろしくお願いします。

  • エクセル関数(シートの比較)を教えて下さい

    A列にある部品の型番が入っており、同じ行のB列以降に詳細内容が入っています。 B列以降の数は型番によってバラバラです。 Sheet1,2で同じ型番同士で比較し、B列以降の詳細内容が異なるものを Sheet3に書き出したいのです。 たとえば、 Sheet1の内容が、 A列  B列   C列   D列   E列 5001  A1   B5    F3   Z4 5002  E6   C2    A7 5003  B9   M8 Sheet2の内容が、 5001  A1   B5     5002  E6   C1    A6 5004  B9   M8 結果として、 5001  F3   Z4     5002  C1   A6 5003  B9   M8 5004  B9   M8 このような場合、どうすればいいのでしょうか。 なるべくなら関数がいいのですが、無理ならばVBAでもかまいません。 Excel2000です。 よろしくお願いいたします。

  • ★EXCEL VBA★2つのシートで一致しているセルに値を代入したい

    表題の件で、苦戦しています。 まず2つのシートがありまして下記のようになっています。 1シート目 No 内容 1 おはよう 2 こんにちわ 3 こんばんわ (コントロール1:オプションボックス A or B or C) (コントロール2:実行ボタン) 2シート目(更新後) No グループ 内容 1 B     2 B     3 B     1 C   おはよう 2 C   こんにちわ 3 C   こんばんわ ★やりたいこと 1シート目でコントロール1を「C」としてコントロール2の実行ボタンをおした際、2シート目のグループを検索し一致した「No」&「グループ」の箇所にそれぞれの「内容」を代入する。 また「A」はALL扱いとして、グループは無視し、一致した「No」の箇所に それぞれ「内容」を代入する。 以上です。ぜひとも宜しくお願いします。

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

    二つのシートのセルを比較して、あるセルの値が一致した場合に、片方のセルの値を 別のシートに設定するには、どうしたらいいでしょうか? [シート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の関数あマクロは、どうしても分からなく質問させてもらいました。 申し訳ありませんが、ご教授宜しくお願い致します。

  • エクセル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 英 つたない説明で申し訳ありません。

  • シート内の一部のセルを別シートにコピー

    Excelのマクロ(VBA)の記載方法について お分かりになる箇所だけでも結構ですので、 どなたかご教授を願い致します。 シートX   A    B   C  1 data1 data2 data3 2 x   data7 data8 3 data4 data5 data6 4 data7 data8 data9 シート Y   A   B   C    D 1 length 3  (任意) (任意) 2 xxxx (任意) (任意) (任意) 3 zzz  (任意) (任意) (任意) 4 (空白)(任意) (任意) (任意) 上記のような2つのシート(同一Excelファイル内)があって、 シートXの一部のセルを次の条件(1~4)でシートYにコピーしたい場合 1.コピー元の列の数は、シートYの "length"と書かれたセルの右となりの数字   とする(上記では3なので、A,B,C列をコピー対象) 2.コピー元の行の数は、シートXの1~4行目までとするが、   シートXのA列のセルが"x"だったら、その行は全てコピーしない。 3.コピー先(Y)の列は、コピー元(X)の列と一つずれてコピー(BならCに、CならDに) 4.コピー先(Y)の行は、シートYのA列で1行からで始めて空白セルになった行からコピー開始。 (上記では、A列で空白セルのある4行目からコピー) 上記条件で、下記のシートYを作成したいのですが、 この場合どようなマクロ(VBA)で実現できますでしょうか。 コピー結果(シートY)  A     B   C   D 1 length  3  (任意) (任意) 2 xxxx  (任意) (任意) (任意) 3 zzz   (任意) (任意) (任意) 4 (空白) data1 data2 data3 5 (任意) data4 data5 data6 6 (任意) data7 data8 data9

  • 別シートのセルを3つ飛ばしで引用したいです

    初心者の為、説明不足になりましたらすいません。 Excel2007を使用しているのですが、別シートのセルを3つ飛ばしで引用したいのですが出来なくて困っています。 例えて言うと・・・ シート名:商品別      列A   列B  列C 行1   商品1  単価  2000 行2       販売数 20 行3       売上  40000 行4   商品2 単価  1000 行5       販売数 10 行6       売上  10000      ・      ・      ・ というシートの、売上の金額の部分だけ(例ではセルC3、C6・・・)別のシートに シート名:売上一覧      列A   列B 行1   商品1  40000 行2   商品2  10000 行3   商品3 25000      ・      ・      ・ というように列Bに引用したいのですが、3つ飛びなのでオートフィルでは =商品別!C3 =商品別!C4 =商品別!C5 ・・・ となってしまいます(泣) 手入力で =商品別!C3 =商品別!C6 =商品別!C9 ・・・ と入力すればよいのですが、引用しなきゃいけない行が1000行あるし 他のシートでも同様の事をしなければいけないので、関数を使用して 入力する方法があったら教えて欲しいです☆ どうかお知恵を貸して下さい☆ よろしくお願いします☆

  • 列の値と一致するシートを選び、指定セルをコピぺする

    マクロの勉強をしている初心者です。   タイトルにありますように、あらかじめ列に入力する値と一致するシートを検索し、そのシートの中の所定の場所にあるセルの値をひろう、というマクロをつくりたいのですがご教示頂けないでしょうか。 わかりづらいので例を画像を添付します。 (手書きですみません。) まず、左のbookと右のbookは別であり、右は読み込み用で、左bookに入力をしていくものです。 左bookの売上げ(赤塗)、目標(青塗)という部分に、右bookのというセルの場所の値をコピペすることを希望です。 毎回人の入れ替わりが頻繁にあるため、Aと同じ値のシートを選ばせるというところからプログラムさせたいです。左bookは上から田中、山下、と並んでいますが、その都度何行目に誰がくるかはかわります。 右bookのコピーしたいセルの場所(B列6行目、C列6行目)はどのシートも変わりません。 恐れ入りますがご教示の程宜しくお願いします。

専門家に質問してみよう