- ベストアンサー
エクセル VBA コンボボックスで検索
- エクセルVBA初心者のため、コンボボックスで工事番号を選択し、該当する行を表示する方法について教えてください。
- 工場名、作業者名、工事番号、作業時間などが記入されたエクセルシートで、特定の工事番号に一致する行だけを表示する方法を教えてください。
- 複数のエクセルシートで、コンボボックスで選択した工事番号に一致する行だけを表示するVBAコードを作成したいです。どのようなコードを書けば良いでしょうか。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>コンボボックスで検索 表題として「メイン」の課題を表してないでしょう。 コンボはあくまで項目を選択する道具。 本件はコードを作ってくださいという依頼で(質問ではない。丸投げ)になっているが基本は自分で作ること。 データの簡略実例も載せてないので回答者が作らないといけない。面倒を少しでもかけないこと。 >シート1行目には工場名、2行目に見出し、3行目からデータが記入されています。 2行目に見出しとして、A列には作業者名、B列に工事番号、C列から作業時間 など文章で書かず、シートの見た目で表現できないのか。 ーー 工場が複数あって、工場ごとに別シートになっているのかな。 >シート毎での検索・抽出をしたいと この表現はあいまい。 (1)指定工場のシート内だけの検索で該当リストを出すのか すると指定工場はどうして指定するのか (2)全工場を検索して該当をすべて出すのか 判りにくい。 ーー 結局は検索のコードが書けないということだろう。そこをはっきりさせて質問をすること。 コンボなんぞ、色々言っているが、カッコを重視するコントロールなどに目が移ってはいけない。 >してみたのですがうまくいきませんでした どう旨くいかないのか?それも書いてない。 検索や全体のロジックが書けないのが原因であると思うが、これはプログラムの経験不足に尽きる。 ブックのシートをすべてとらえる方法は Sub test01() For Each sh In Worksheets If sh.Name <> "結果" Then MsgBox sh.Name End If Next End Sub を実行してみて。 ここでは「結果」というシート以外の全シートを捉えていることを納得すること。 ーーー あと、検索はFind、Filter,SQL,など色々あるが初心者には難しいので将来の課題とし (やるならマクロの記録をとって勉強すること) 各シートの全行を探しまくる方法でやるしかなかろう。 Sub test01() Dim sh As Worksheet Dim k k = k + 2 For Each sh In Worksheets If sh.Name <> "結果" Then MsgBox sh.Name test02 sh, k End If Next End Sub Sub test02(sh, k) d = sh.Range("B65536").End(xlUp).Row MsgBox sh.Name & " " & d For i = 2 To d If sh.Cells(i, "B") = "123" Then Worksheets("結果").Cells(k, "B") = sh.Cells(i, "B") Worksheets("結果").Cells(k, "C") = sh.Cells(i, "C") k = k + 1 End If Next i End Sub ーー 例えばB列で123を検索。これはコンボなどからもってくる。そのやり方は質問者がやってみて。 例データ Sheet1 B2:C6 B列 C列 234 123 a 456 111 222 Sheet2以下略。C列データも一部略。 ーー 結果シート B2:C4 123 a <-Sheet1から 123 b <-Sheet2から 123 c <-Sheet3から 各シートで123は1つしかない例でやったため。
お礼
ご回答ありがとうございます。 いくつかご指摘いただきましたが、確かにその通りです。 シートの構成は以下のような感じです。シート名は工場名になっています。 A B C D E 1 工場名 2 作業者名 工事番号 客先名 開始時間 終了時間 3 山田太郎 3110025 (株)○○○ 4月6日8:00 4月6日17:00 4 伊藤一郎 3110028 ○○○(株) 4月6日8:00 4月6日17:00 全工場の集計をする必要はなく、集計するのは各工場毎です。 一覧表示したい行は、B列の工事番号を元に、該当する行だけを表示させたいのです。 教えていただいたことを参考に、もう少し自分で頑張ってみようと思います。 ありがとうございました。