- ベストアンサー
Excel VBAを使用して別シートの一致するセルに代入する方法
- Excel VBAを使用して、別のシートのセルを比較し、一致した場合に一方のセルに値を代入する方法を教えてください。
- book1のsheet1には単価、メーカー、型番、および空白の列があり、約200行あります。book2のsheet1には単価、メーカー、型番があり、約4000行あります。
- book1のB列とC列のメーカーと型番を一致するものを、book2のsheet1のB列とC列から検索し、一致した場合は、book1のsheet1のD列にbook2のsheet1のA列の値を入力します。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#6です。マスターに空欄があるというのは想定外でした。 コードの最初の部分を下記の通り置き換えれば良いでしょう。 With Workbooks("Book2.xls").Sheets("Sheet1") buf1 = .Range(.Range("A1"), .Range("A" & .Rows.Count).End(xlUp)).Resize(, 2) End With
その他の回答 (6)
- mitarashi
- ベストアンサー率59% (574/965)
#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条件としています。
お礼
mitarashi様 頂いたコードで出来ました! ただBook2のシートに空白行がまばらにあり、 空白行で停止してしまいます。 最下行まで検索して条件が合えば単価を 書き込む方法があればお教え頂きたいのですが....... たびたび条件を変えてしまい心苦しく思います、 なにかよきアドバイスを頂きたく存じます。
- mitarashi
- ベストアンサー率59% (574/965)
#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
お礼
ご回答いただいている皆様 すばらしいご回答、誠に有難う御座います、 皆様のお知恵を借りながらやっているのですが 重大な事に気が付きました。 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)
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/17069)
Book1のメーカーと型番から、メーカーと型番の2列が一致するものを探すのは、相当むずかしい。 結合した列を作ればVLOOKUP関数やFindメソドでで出来ると思う。 ーー 本当はAccessなどで使われるSQLなどのデータベース検索言語のお世話にならないとすなおな処理にならない。エクセルでもMsクエリと言うのがあるので使えるかもしれないが。 ーー Book2(元データ)を、メーカー+型番でソートしておけば、そのキーでユニークである保証があれば FindやVLOOKUP関数が使えるかも。メーカーの行郡の先頭行を見つけ、その行から下での最初に出現する型番のデータを持ってくるロジック。そのメーカでは、その型番がない場合もあるので、型番が見つかればそのメーカーが求めるものかチェックは必要。 ーー エクセルに「フィルタオプションの設定」がある。これをマクロの記録を採って改良し、使えるかもしれない。 ーーー もうひとつはBook1,Book2をメーカー+型番でソートし、両ファイルをメーカー+型番キーでマッチングさせて処理できる。しかしいまどきの人は、このロジックに慣れて居ないと思うので難しいかも。 判ればこれが一番処理も早い(ソート時間を除き)し処理も提携パターンで誤りが少ないと思うが。 ーー 質問者のVBAの技量がわからないので、どれが良いか決めかねる。初心者には、どれも判ってもらうのが難しい。
- aloha88600
- ベストアンサー率17% (10/58)
検証してないけどこんなかんじ! 数字を比較する場合は注意! 単純比較だとヒットしない場合がある! その場合は関数で型変換!(今回省略) 共にブックを開いていることが条件 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)
もし、book2のほうに、 3000 NEC VL100 4000 NEC VL100 というように、NEC+VL100というデータが複数あって、単価が違う場合は、どのような処理をするのでしょうか? メーカーと型番が同じデータは重複することは絶対にない、とか、メーカーと型番が同じデータの単価は必ず同じ、とか、そういう制限はありますか?
補足
86ft3kr様 メーカーと型番が同じデータは無く、 同じメーカー、同じ型番で違う単価は無いものと想定します、 仮にあったとしたら、上書きでかまいません。
お礼
おお神様、仏様、mitarashi様 おかげ様で思い通りの事が出来ました。 配列数式についてまだ理解が出来ていませんが、 シンプルなコードでこんな事が出来るのですね。 これを機会にもう少し掘り下げて勉強します。 ほんとに有難う御座いました!!