エクセルvbaで2種の検索を行い一致する場合の値を返す方法

このQ&Aのポイント
  • エクセルvbaを使用して、2種類の検索を行い、一致する場合の値を返す方法について教えていただきたいです。
  • 具体的な課題は添付のエクセルファイルで確認してください。転機元のシートは売り上げデータであり、転機先のシートは年間実績です。
  • 売り上げデータシートの名前と年間実績シートの名前が一致する場合、売り上げデータの実績4月を年間実績シートの4月へ、予定を5月へ入力していきたいです。
回答を見る
  • ベストアンサー

2種の検索をかけて一致する場合にその値をかえす

エクセルvbaにおいて教えていただけないでしょうか。 課題は添付のようなものです。 転機元のシートは売り上げデータ 転機先のシートは年間実績です。 シート売り上げデータの項目1行目にかかれている 名前と一致した場合に、売り上げデータの実績4月を年間実績シートの4月へ、(赤枠)、予定は同様に5月へ(青枠) へ 入力していきたいのです。 <条件> ・売り上げデータシートのA列の名前と年間実績A列の名前が 一致した場合であり、なおかつ売り上げデータシートの「中間予想値」「実績値」の2項目を、年間実績シートの「本部設定値」「個人設定値」「中間予想値」「実績値」の4項目の中で検索させて「中間予想値」「実績値」それぞれ一致した行に入力する、という命令をさせたい。 例:田中さんの4月実績値5,500円・5月中間予想値4500円を、年間実績の田中とかかれた4月の「実績値」行と5月の「中間予想値」行とそれぞれに入力させたい。 ・年間実績シートには、営業1~2課、3~7課など、ランダムなくくりでSUM関数の入った小計がある。 ・転記先の列の指定はメッセージボックスをつかって「予定を入れたい月を指定してください」→4月入力、 「実績を入れたい月を指定してください」 →5月入力 という形でその都度自分で修正(指定)したい。 以上、難しい処理で申し訳ございません。 知恵をかしていただければ幸いです。 転機元シートはいくらでも編集できますので転機元シートをこのように編集してください、という条件は可能です。転機先シートは他人のファイルでいじることができません。 恐れ入りますがよろしくお願いします。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.4

No2の訂正です。 年間実績の月は右に3月まであるみたいなのを見逃してました。 一応R列までとして3月は実績だけを転記するようにしました。 途中小計項目とかあっても項目が1から12の数値でなければ飛ばして該当月に転記します。 必ず中間予想値より下に実績値があると考えてます。 Sub Test() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim mRange As Range, mRange2 As Range Dim i As Long, j As Long Dim mMonth As Long, mMonth2 As Long, tmp As Variant Set Ws1 = Sheets("売り上げデータ") Set Ws2 = Sheets("年間実績") tmp = InputBox("実績を入れたい月を指定してください" & vbCrLf & vbCrLf & "1~12の数値", "指定月入力") If tmp = "" Then MsgBox "未入力で終了します" Exit Sub End If If IsNumeric(tmp) Then mMonth = Val(tmp) Else MsgBox "数値以外が入力されました" Exit Sub End If If mMonth < 1 Or mMonth > 12 Then MsgBox "範囲外です" Exit Sub End If Set mRange = Ws2.Range("D2:R2").Find(mMonth, LookIn:=xlValues, LookAt:=xlWhole) If mRange Is Nothing Then MsgBox "指定した月の転記先がありません", vbCritical Exit Sub End If mMonth2 = Month(DateAdd("m", 1, Year(Date) & "/" & mMonth & "/" & 1)) Set mRange2 = Ws2.Range("D2:R2").Find(mMonth2, LookIn:=xlValues, LookAt:=xlWhole) If mRange2 Is Nothing Then MsgBox "指定した翌月の転記先がありません", vbCritical Exit Sub End If For i = 1 To Ws1.Cells(Rows.Count, "A").End(xlUp).Row For j = 1 To Ws2.Cells(Rows.Count, "A").End(xlUp).Row If Ws1.Cells(i, "A").Value = Ws2.Cells(j, "A").Value Then If Ws1.Cells(3, "D").Value = Ws2.Cells(j, "C").Value Then Ws2.Cells(j, mRange.Column).Value = Ws1.Cells(i, "D").Value Exit For ElseIf Ws1.Cells(3, "E").Value = Ws2.Cells(j, "C").Value And _ mMonth <> 3 Then Ws2.Cells(j, mRange2.Column).Value = Ws1.Cells(i, "E").Value End If End If Next Next Set Ws1 = Nothing Set Ws2 = Nothing End Sub

mika1100
質問者

お礼

求めている動きをしてくれました。他のかたがいう、自分で作ることが大切、というのも承知なのですが、無償のレッスンをしてくださるkkk様には今回も本当にお世話になりました。またここから一つ一つの工程が何を意味するか調べていきます。 ありがとうございました。

その他の回答 (5)

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

コードを作ってくれ、という、丸投げではないか? まして、会社の仕事に関するものだろう。業者やシステム担当に教えてもらうのが筋。 画像がぼやケてみにくい。>転機元--転記先? ーー 深くは質問の状況を詮索してないが (データ例を少数テキストで作って説して、ほしい。) 「今月」シート 名前 項目1 項目2 佐藤 23 16 山本 123 41 今井 45 52 「年次」シート 名前 1月 1月 2月 2月・・ 佐藤 23 16 木村 近藤 山本 123 41 今井 45 52 コード Sub test01() Set sh1 = Worksheets("今月") Set sh2 = Worksheets("年次") For i = 2 To 4 x = sh1.Cells(i, "A") MsgBox x Set f = sh2.Range("a2:A1000").Find(x) 'MsgBox f.Row sh2.Cells(f.Row, "B") = sh1.Cells(i, "B") sh2.Cells(f.Row, "c") = sh1.Cells(i, "C") Next i End Sub のような簡単なことだろう。質問説明も雑で、小生勘違いや、見漏らしている点あるかもしれないが 、骨子はこういうものではないか? sh2.Cells(f.Row, "B")の列の部分は、毎月変わるかもしれないので、毎月指定か対策は必要。 VLOOKUPのおすすめの回答がでていて、色々言っているが、VBAではFindメソッドだ。どちらも2番目以後の該当は検索しない。MATCH関数も同じ。 自分独自の分派行動するとシステム部には褒められるよりも、睨まれるかもしれない。

mika1100
質問者

お礼

今回も厳しい意見ありがとうございます。まさに正論です。厳しいながらも今後のことを見越してわかるように教育いただいていることが、嬉しく思います。 はい、そのレッスンやってみます。

  • kon555
  • ベストアンサー率52% (1750/3356)
回答No.5

>> VLOOKUPでやりたいが〜〜VBAをなんとかくみたいのですが、やり方がわからず悩んで今に至ります。  なるほど。  何となくですが、どういう立場で苦労されているのか、お察しします。  ただ似たような立場も経験した者として、もしもこうした業務が頻繁にあるならば、いっそ貴方自身がvbaを習得する事をお勧めはします。  正直なところ、貴方の要望する機能を備えたvbaを組む事自体は結構簡単なのですが、複雑さとしては中々の物になるため、何かが変わるとすぐにエラーで使えなくなります。また類似作業にも対応できないモノになります。  一応参考になる解説系のページを紹介しておきますので、よろしければトライしてみて下さい。簡単なモノが自分で組めるようになるだけで、劇的に楽になります。 基礎的な事項について https://excel-ubara.com/excelvba1/ 条件処理について https://excel-ubara.com/excelvba1/EXCELVBA320.html 繰り返し処理について https://valmore.work/excel-vba-for/ 類似した案件の例 https://www.mutable.work/entry/search-by-loop

mika1100
質問者

お礼

自分でつくることが大切、たしかにそうです。 今簡単なVBAはここで質問させていただくことでできるようになってきました。 疑問がてできては、このOK webで質問し、勉強しています。 いただいたリンク、早速本日じっくりみてみます。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.3

No2の補足です。 年間実績シートのC列の 中間予想値 実績値 で必ず中間予想値より下に実績値があるのでしたら Ws2.Cells(j, mRange.Column).Value = Ws1.Cells(i, "D").Value のところを Ws2.Cells(j, mRange.Column).Value = Ws1.Cells(i, "D").Value Exit For にしてください。 >> 例:田中さんの4月実績値5,500円・5月中間予想値4500円を、年間実績の田中とかかれた4月の「実績値」行と5月の「中間予想値」行とそれぞれに入力させたい。 > > を売り上げデータシートの人数分実行します。 は、指定した月と翌月のセルに書き込むということです。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.2

> ・転記先の列の指定はメッセージボックスをつかって「予定を入れたい月を指定してください」→4月入力、 > 「実績を入れたい月を指定してください」 > →5月入力 この意味がいまひとつわからないので(売り上げデータシートには4月と5月しかないので)、実績を入れたい月だけ入力するようにしてます。 > 例:田中さんの4月実績値5,500円・5月中間予想値4500円を、年間実績の田中とかかれた4月の「実績値」行と5月の「中間予想値」行とそれぞれに入力させたい。 を売り上げデータシートの人数分実行します。 年間実績シートの月のセルには月は入れなくて数値だけにしてください。 以下で試してみてください。 Sub Test() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim mRange As Range Dim i As Long, j As Long Dim mMonth As Long, tmp As Variant Set Ws1 = Sheets("売り上げデータ") Set Ws2 = Sheets("年間実績") tmp = InputBox("実績を入れたい月を指定してください" & vbCrLf & vbCrLf & "1~12の数値", "指定月入力") If tmp = "" Then MsgBox "未入力で終了します" Exit Sub End If If IsNumeric(tmp) Then mMonth = Val(tmp) Else MsgBox "数値以外が入力されました" Exit Sub End If If mMonth < 1 Or mMonth > 12 Then MsgBox "範囲外です" Exit Sub End If Set mRange = Ws2.Range("D2:F2").Find(mMonth, LookIn:=xlValues, LookAt:=xlWhole) If mRange Is Nothing Then MsgBox "指定した月の転記先がありません", vbCritical Exit Sub End If For i = 1 To Ws1.Cells(Rows.Count, "A").End(xlUp).Row For j = 1 To Ws2.Cells(Rows.Count, "A").End(xlUp).Row If Ws1.Cells(i, "A").Value = Ws2.Cells(j, "A").Value Then If Ws1.Cells(3, "D").Value = Ws2.Cells(j, "C").Value Then Ws2.Cells(j, mRange.Column).Value = Ws1.Cells(i, "D").Value ElseIf Ws1.Cells(3, "E").Value = Ws2.Cells(j, "C").Value Then Ws2.Cells(j, mRange.Column + 1).Value = Ws1.Cells(i, "E").Value End If End If Next Next Set Ws1 = Nothing Set Ws2 = Nothing End Sub

  • kon555
  • ベストアンサー率52% (1750/3356)
回答No.1

 VBA不要です。VLOOKUP関数で対応できます。使い方は下記ページを参考にどうぞ。 https://www.pc-koubou.jp/magazine/39639  使い方はここ以外にも検索すれば大量に出てきますので、貴方にとって分かりやすいページを探してみても良いと思います。  ちなみに、データ数が大量などでVLOOKUP関数が重たい、などの場合であっても、VBAはお勧めしません。 「転記先シートは他人のファイルでいじることができません。」という事は、VBA側で作り込んだとしても転記先のレイアウトの変更やちょっとした文言変更で使えなくなる可能性が常にあります。  こうしたケースでは貴方自身が構築できる手法の方がいいです。また「その都度自分で修正(指定)したい」というのも関数であれば容易です。  またVLOOKUP関数は便利な機能なので、こうしたExcelでのデータ集計などが業務として存在するなら、この機会に覚えおいて損はないと思います。

mika1100
質問者

補足

朝早くに早速のご返信ありがとうございます!! VLOOKUPをしたいところなのですが、本部通達と個人設定にはあらかじめはいっている値があることと、共有しているメンバーが数式を崩していつも修正をかけなければならないのです。更新が頻繁に入るために自分のPCほうで保管しておくことができません。 VBAをなんとかくみたいのですが、やり方がわからず悩んで今に至ります。

関連するQ&A

  • エクセル VBAで2つのデータを比較して、一致するものを検索したい

    以下のような事をしたいと思っています。 VBAは今まで使った事が殆どなく困っております。 仕事で作らなければならず、宜しくお願い致します。 エクセルVBAで、既存と新規という2つのシートから 2つの条件(A列とB列の完全一致)で行を検索して 一致したものを探し出します。 一致したら「新規シート」の該当した行の売上列のデータを 「既存シート」の該当月の列へコピーしたいと思っております。 また、「新規シート」には「既存シート」にないデータが 存在するので、一致から漏れた行は「既存シート」へ 新たに追加のデータとしてコピーしたいと思っています。 イメージ↓ 既存シート) 商品名 |製造地|6月(製造月の売上)|7月(製造月の売上) a     |あ   |¥150      | b     |い   |¥200      | (空白)  |(空白)|          | 新規シート) 商品名 |製造地 |7月(製造月の売上)| a     |あ   |¥300      | b     |い   |¥100      | c     |う   |¥250      | 上記の2シートで、商品名と製造地の2つが一致していれば 「新規シート」の7月の列のデータを「既存シート」の 7月の列にコピーし、「既存シート」に存在しない 「新規シート」の商品名”c”の行のデータを「既存シート」へ 新たに商品名”c”の行を作成しコピーしたいと思っています。 出来上がり後の(既存シート) 商品名 |製造地 |6月(製造月の売上)|7月(製造月の売上) a      |あ   |¥150      |¥300 b      |い   |¥200      |¥100 c      |う   |¥0        |¥250

  • 【Excel】一致するデータの検索

    Excel2003を使用しています。 Sheet1のB列の値がSheet2のA列に入力されている値と一致したら、Sheet1のC列とD列の値をSheet2のC列とD列に表示させたく、VLOOKUP関数を使用したところ、Sheet1のB列とSheet2のA列のデータの並び方(順序)が同じではないためか、VLOOKUP関数ではできませんでした。 こういう場合、マクロで処理することは可能でしょうか?可能であれば、どのようにコードを記述すればいいでしょうか? Sheet1のデータは4行目から、Sheet2のデータは6行目から入力されています。 よろしくお願いします。

  • 条件一致の別シートから、セルデータ抽出

    添付画像に於いて、予測シートの手配月(F2~F6)のデータを、実績シートから抽出する為のF2~F6に入力する関数をご教授下さい。 条件としては (1)予測シートの手配済?項目が”済”ならば、オーダ番号と一致するデータを実績シートから検索し、そのデータ行から手配月を抽出する。手配済?項目は"済"が入らない場合は必ず” ”となる。 (2)添付画像に於いてはオーダ番号が重複しているが、その場合、実績シートの若番の行のデータを抽出。 (3)予測シートのオーダ番号の並びはランダムであり、昇順降順には成らない。 (4)添付画像ではデータは5行だが、実際は3000~5000行はある。 私の方で、予測シートのF2セルに次の関数を入力しましたが、戻り値は#N/Aとなってしまいました。 =IF(D2="","",LOOKUP(A2,実績シート!A:A,実績シート!D:D)) 以上宜しくお願いします。

  • Excel2003 検索して値の参照

    お世話になります。 掲題の件で ご相談が御座います。 添付のような表がありまして、シートが2枚に分かれております。 数式を入れたいシート(表示用シート)に参照元シート(入力用シート)を図で貼り付けました。 ピンクの表が入力用シートになります。 入力用の「C列"エリア"」を「D列"更新日"」を参照して 日付が横並びになっている 表示用シートに各項目を反映させたいのですが、どのような数式を入れたら良いのか、 また そもそも表の作りに無理があるのか?と ちょっと煮詰まってしまっている状態です。 入力用シートは更新日と備考以外はプルダウンで選択するようにしています。 反映させたい表示用シートには「A列」に「エリア」が北海道~沖縄まであります。 日付は10月~3月まで用意されており 3行目、15行目、27行目、39行目、52行目に「月」が入っており、 4行目、16行目、28行目、40行目、53行目に「日」が入っております。 さすがに 2行にまたがった日付を参照するのは無理があるだろうと思い 1行目にフォントの色「白」で「2009/9/25」等 該当する列に日付を入れました。 しかし、その後に 入力用シートのC列D列を参照して どうやって 表示用シートに反映させたら良いかで困っております。 作業列を作るにしても どうやったら良いものやら、、 そもそも 全部横並びになっている所に無理があるのでしょうか? どなたか お分かりになる方がいらっしゃいましたら宜しくお願い致します。 説明不足等 御座いましたら何なりとお申し付けください。 宜しくお願い致します。

  • excelについて・・・

    こんばんは! excelのことがわからなくて質問させていただきました。 sheet1 表紙 日付=today() sheet2 sheet1の日にちを!で持ってきてます。          日にち MonthToDate         YearToDate (表)売り上げ、予算、実績     (表)売り上げ、予算、実績 sheet3 (表)月ごとの実績(列;月、行;項目10個くらい) (ここのsheet1のTodayの月を太い罫線で1列10行くらい当月を囲みたいです) sheet4 (表)月ごとの予算(列;月、行;項目10個くらい) (ここのsheet1のTodayの月を太い罫線で1列10行くらい当月を囲みたいです) ☆聞きたいこと1 sheet3とsheet4をsheet1で出た月(例えば4月)にMTDと表示させ列全体を太い罫線で縦で囲むにはどうしたらいいのでしょうか? ☆聞きたいこと2 聞きたいこと1ででた月をsheet2に列ごと表示させたいです。 初心者なのですが調べてもわからなくて・・・ 会社でわかる方が辞めてしまったらしく、 どうしても必要なのよろしくお願い致します。

  • Excel 2つのDatabaseから一致した結果

    結構な量のデータベースが2つあります。 例えば sheet2(データベース2)のJ2,P2,S2の3つ条件にあうものを sheet1(データベース1)の中から検索して 一致した場合は sheet2のY2に○か× を表示 ○の場合は一致した行の指定の列のセルをの sheet2のZ2 に表示させたいのですが どちらのデータベースにも完全に一致する列の紐づけデータがないのでVLOOKUPは使えず 重複データも沢山あるため複数検索のDGETを使っても検索条件を毎回 入力していかなければならないので大変な手間になってしまいます。 http://i.imgur.com/SFsX0Zq.jpg 二行目・三行目とオートフィルで全ての行に対応できる方法はないでしょうか? 表示されていない列は非表示にしてあります。 関数にはこだわりません。複雑になってしまってもいいです。 マクロでもいいです。 皆様お知恵をお貸しください。宜しくお願い致します。

  • Excel2003…クロス検索??

    …データ入力シート…   A  B  C  D  E 1    1  2  3  4  2 あ  0  0  1  2   3 い  0  1  2  0 4 う  1  1  0  0 ・ ・ ・ 1行目は1月、2月、3月… A列に項目 月ごとの各項目に対する数値を入力しています。 …帳票シート…   A  B  C  D  E 1    月 2 あ 3 い 4 う A1セルに「1」(月)と入力したら B2セルには「あ」の「1」月の数値0が入るようにしたいのです。データ入力シートと帳票シートの項目の並びは同じです。(項目もデータ入力シートからひっぱってもよいかなとも思っているのですが、今のところは帳票シートにも同じ項目が打ち込んであります)LOOKUP関数を使えばよいのだとおもいますが、検索値が2個になるので単純にはいきませんよね…? 頭が働かなくて方法が思いつきません…>_<… いつも説明が悪くてみなさんを困らせていますが(__;) 知恵を分けてください。よろしくお願いします。

  • エクセル(EXCEL) 2つの値が一致する行の参照

    エクセルで、以下のように「Sheet1」のA列に日付、B列には時刻が 入力されており、C列にはその時刻の為替レート(ドル)が入力され ています。 【Sheet1】      A     B     C 1 2009/3/1   7:00   99.56 2 2009/3/1   8:00   99.12 3 2009/3/1   9:00   96.12 以下続く この行が延々と数年間分入力されているとします。 そこで、例えば、「Sheet2」に毎日の7:00の為替レートのみを抜きだ して縦に並べたい(以下のように)とします。 【Sheet2】        A     B     C 1 2009/3/1   7:00   99.56 2 2009/3/2   7:00   98.39 3 2009/3/3   7:00   100.10 (要するに、毎日7:00の為替レートのみ時系列で見たい) この場合、「Sheet2」のC列にはどのような数式を入力すれば良いの でしょうか? 【Sheet1】から、「09年3月1日」且つ「7:00」の行のC列、 を拾ってきて、【Sheet2】のC列に返すということなのですが、 参照するところが2つ(日付と時刻)ある、場合の式の組み方がわかりません。 (もしひとつなら、VLOOKUP とか、INDEX + MATCH 関数で組めるのですが・・) 恐れ入りますが、おわかりになる方なにとぞご教示くださいませm(_ _)m。

  • エクセルで検索→抽出

    お願いします。 シート(1)に次のように入力されています。 A列 B列 C列 D列 E列 → Y列 番号 県 性別 年齢 来社 1行目   1 東京 男  45 09/21  2行目   2 京都 女  33 10/07  3行目   3 福島 女  49 10/25  4行目   4 京都 男  25 12/05  5行目   5 東京 女  30 12/30  ↓ 以上のようにY列まで項目と、1110人のデータが 入ったシート(1)があります。 シート(2)に検索したい文字を入れて抽出する方法を教えてください。 例えば京都出身の人を検索したい場合↓ シート(2)の1行目にはあらかじめシート(1)の項目をコピーしておく 検索したい『京都』は「県列」の項目だから B列の2行目に『京都』と入力する。(1行目には項目) 3行目以降に検索結果↓が表示される。 2 京都 女  33 10/07  スイカ 4 京都 男  25 12/05  モモ 8 京都 女  58 05/04  りんご 12 京都 女  12 06/20  オレンジ また、年齢10~35を検索したりなどもできれば… データを入力したり検索したりするのは、パソコンに不慣れな方ですので エクセルに詳しくない人でも簡単に使用できるよう作成できればと思います。 以上、 検索項目を入力し、下の行に抽出されるような関数はありますでしょうか・・・? なければ近いものでも構いませんので教えてください。 宜しくお願い申し上げます。

  • Excel 条件に一致する日付の求め方について

    こんにちは!初めて質問します。 Excel関数の使い方がわからずに困っています。 売上と在庫管理をそれぞれ別シートに入力しています。 売上が出た場合、在庫管理シートに売上日が表示されるようにしたいのです。 シートは、このような形で、それぞれデータを入力しています。 売上表シート A列  B列    C列      D列 日付  顧客名  商品コード  売上金額 在庫管理シート A列   B列     C列    D列    E列 入荷日 商品コード  商品名  売上日  売上金額 商品コードが一致する売上表シートの日付を、在庫管理シートの売上日に表示させたいのですが、 上手くいきません。 売上金額はSUMIF関数で処理することができました。 Excelに関する知識も乏しく、非常に困っています。 なにぶん初めての質問のために質問内容も的を得ず、わかりづらいかもしれませんが、 どなたかお分かりになる方、是非ご教示くださいませ。

専門家に質問してみよう