• ベストアンサー

エクセルマクロで検索ボタンの作り方

備品を管理するシステムを作ろうとしています。 下記項目のデータの入ったSheetが4つあります。(Sheet1~4) Sheet5は検索シートにしたいと思います。 学校名 区分 機能別分類 品目類 取得年月日 品名 規格等 購入単価 購入先 廃棄年月日 保管場所 取得区分 それぞれ検索したいものを選んで、検索ボタンを押すとSheet1~Sheet4までのそれぞれ該当するものがピックアップされるようにしたいと思います。(例)品名の『ノート』を選択し、検索を押すとSheet1~4までの『ノート』が検索シートに全て表示される。 教えて下さい。

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

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.14

もしかして、各シートを抽出した時に取得区分が空白になっていると言う事はないでしょうか? その場合は、検索シートに転記されないですね。 ただ、取得区分に値があるのに転記されないとすると・・・???です。 以下は、取得区分に空白があっても対応できるよう変更しました。 差し替えてみて下さい。 Private Sub CommandButton1_Click() Dim WS As Worksheet Dim r As Range Dim rr As Range, rs As Range Dim v As Variant, vv As Variant Dim i As Integer, j As Integer Set WS = Worksheets("検索シート") Set rr = WS.Range("B21") vv = WS.Range("D2:D14").Value For j = 1 To UBound(vv, 1) If Not IsEmpty(vv(j, 1)) Then GoTo nex: End If Next End nex: WS.Range("A20").CurrentRegion.ClearContents WS.Range("A20").Value = "学校名" WS.Range("B20").Resize(, 12).Value = _ Worksheets("A").Range("A2:L2").Value ' 上と下の"A","B","C","D"は実際のシート名(学校名)に変更願います。 For Each v In Array("A", "B", "C", "D") With Worksheets(v) Set r = .Range(.[A2], .Cells(Rows.Count, "L").End(xlUp)) r.AutoFilter r.AutoFilter Field:=j - 1, Criteria1:=vv(j, 1) Set rs = .Range(.[A3], .Cells(Rows.Count, "A").End(xlUp)).Resize(, 12).SpecialCells(xlCellTypeVisible) If rs.Item(1).Row <> 2 Then rs.Copy rr rr.Offset(, -1).Resize(rs.Cells.Count / 12).Value = v Set rr = rr.Cells(rs.Rows.Count, 1).Offset(1) End If r.AutoFilter End With Application.CutCopyMode = False Next End Sub PS.実際の検索には学校名と通し番号は使えないですけど。

noa8998
質問者

補足

できました!!学校名と通し番号の検索はできなくてもそんなに問題なかったので大丈夫です。この検索は、検索値が国語なら、国語の語句のあるSheetは抽出されます。ちなみに。区分が「国語」,機能別分類が「教材」というように複数の条件で、それに当てはまるものを検索するときはまたマクロを変えなくてはいけませんか? 【検索シート】   C      D 1 2学校名 3通し番号 4区分      国語 5機能別分類   教材 6品目類      7取得年月日 8品名 9規格等 10購入単価 11購入先 12廃棄年月日 13保管場所 14取得区分

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (15)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.16

AdvancedFilterでの一案。 C2~C14の項目をA5~M5に並べ替えて下さい。 注意は、C5~M5の項目名と各学校シートの項目名が一致している事。 検索値の入力は、6行目から10行目まで対応してます。 必ず上の行から入れて下さい。 例)国語 且つ 教材 6行目の該当項目に 国語 と 教材 を入力します。 例)国語 又は 理科 該当する項目に 6行目に 国語  7行目に理科 を入力して下さい 例)国語 又は 教材 6行目に 国語 7行目に 教材 です。 6行目の次に8行目に打ち込んだ場合、8行目は無視されます。 検索に有効だったものについては、薄緑色にセルが塗りつぶされます。 6行目を飛ばした場合は、その場で中断します。 新しくシートを作成して”検索シート2”として、コードに学校名を訂正し、 コマンドボタンを作成してから試してみて下さい。 Private Sub CommandButton1_Click() Dim WS As Worksheet Dim r As Range Dim rr As Range, rs As Range Dim kr As Range, kk As Range Dim v As Variant, vv As Variant Dim i As Integer, j As Integer Set WS = Worksheets("検索シート2") Set rr = WS.Range("B21") Set kr = WS.Range("C5") kr.Resize(6, 11).Interior.ColorIndex = 0 For Each kk In WS.Range("C6:C10") If WorksheetFunction.CountA(kk.Resize(, 11)) > 0 Then Set kr = Union(kr, kk) Else Exit For End If Next Set kr = kr.Resize(, 11) If kr.Cells.Count < 12 Then MsgBox "検索値の入力でミスがあります" & vbLf & _ "中止します" WS.Range("A20").CurrentRegion.ClearContents Exit Sub End If kr.Interior.ColorIndex = 35 WS.Range("A20").CurrentRegion.ClearContents WS.Range("A20").Value = "学校名" WS.Range("B20").Resize(, 12).Value = _ Worksheets("A").Range("A2:L2").Value ' 上と下の"A","B","C","D"は実際のシート名(学校名)に変更願います。 For Each v In Array("A", "B", "C", "D") With Worksheets(v) Set r = .Range(.[A2], .Cells(Rows.Count, "A").End(xlUp)).Resize(, 12) r.AdvancedFilter xlFilterInPlace, kr, , False Set rs = .Range(.[A3], .Cells(Rows.Count, "A").End(xlUp)).Resize(, 12).SpecialCells(xlCellTypeVisible) If rs.Item(1).Row <> 2 Then rs.Copy rr rr.Offset(, -1).Resize(rs.Cells.Count / 12).Value = v Set rr = rr.Cells(rs.Rows.Count, 1).Offset(1) End If .ShowAllData End With Application.CutCopyMode = False Next End Sub うまくいけばいいですが。

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.15

>複数の条件で、それに当てはまるものを検索するときはまたマクロを変えなくてはいけませんか? 複数の場合はもちろん変更は必要です。 ようは、いくつ条件を与えているかを判定し、その条件分だけ抽出しなければならないからです。 例えば、3つの条件までOKとしても、1つの時、2つの時、3つの時と、 判定し処理を行なわなければなりません。 或いは、オートフィルタではなくアドバンスドフィルタを用いて、 部分的に作り直しになるでしょうか。 そうゆう意味でも、ANo.4でお話ししたように、蓄積シートに対して オートフィルタをかける方がいいと思います。 1つめの項目で絞り込み、2つめの項目で更に絞り込む。 そのような事が楽に出来ますよ。 あとは、質問者さんの決断によりますね。

noa8998
質問者

お礼

たしかにオートフィルタをかけた方が楽ですよね・・・(汗) とりあえず検索ボタンを作ることはおかげ様で完成させることができました。本当にありがとうございます。 n-junさんのご指摘どおり、蓄積シートよりオートフィルタをかけるやり方でいきたいと思います。また質問をすると思いますが、その時はよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.13

>検索値を入れても項目(学校名,区分,機能別分類,品目類,取得年月日,品名,規格等,購入単価,購入先,廃棄年月日,保管場所,取得区分)しか表示されず >(希望する表示) A20:M20に 学校名,通し番号,区分,機能別分類,品目類,取得年月日,品名,規格等,購入単価,購入先,廃棄年月日,保管場所,取得区分 通し番号は書き漏れ?それともないの?

noa8998
質問者

補足

すみません、"通し番号"は書き漏れていました。 今、A20:M20に 学校名,通し番号,区分,機能別分類,品目類,取得年月日,品名,規格等,購入単価,購入先,廃棄年月日,保管場所,取得区分 が表示されています。しかし検索値があるのにもかかわらずA21:M21には何も表示されませんでした。 【検索シート】   C      D 1 2学校名 3通し番号 4区分     国語 5機能別分類 6品目類 7取得年月日 8品名 9規格等 10購入単価 11購入先 12廃棄年月日 13保管場所 14取得区分 と入れています。国語が検索値です。 A小学校には検索値があります。なのでA21:M21は A小学校,1,国語,教材,漢字スキル・・・・と表示させたいのですが・・

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.12

>検索値を入れても項目しか表示されず どこの項目に検索値を入れても表示されないのでしょうか? 或いは、特定の項目の時だけ起きるのでしょうか?

noa8998
質問者

補足

どこの項目に入れても表示されませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.11

>Private Sub CommandButton1_Click() >End Sub >の下に貼り付けるのはあっていますか? こちらでは問題なく実行できました。 >For Each v In Array("A小学校", "B小学校") ', "C小学校", "D小学校")であっていますでしょうか? こちらのミスです。 For Each v In Array("A小学校", "B小学校", "C小学校", "D小学校") この様にお願いします。

noa8998
質問者

補足

For Each v In Array("A小学校", "B小学校", "C小学校", "D小学校")に直しましたが、検索値を入れても項目(学校名,区分,機能別分類,品目類,取得年月日,品名,規格等,購入単価,購入先,廃棄年月日,保管場所,取得区分)しか表示されず、抽出されたデータが出ませんでした。No.8のマクロでは抽出されたデータが表示されたのですが・・・

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.10

こんな感じでしょうか? Sub Test31() Dim WS As Worksheet Dim r As Range Dim rr As Range, rs As Range Dim v As Variant, vv As Variant Dim i As Integer, j As Integer Set WS = Worksheets("検索シート") Set rr = WS.Range("B21") vv = WS.Range("D2:D14").Value For j = 1 To UBound(vv, 1) If Not IsEmpty(vv(j, 1)) Then GoTo nex: End If Next End nex: WS.Range("A20").CurrentRegion.ClearContents WS.Range("A20").Value = "学校名" WS.Range("B20").Resize(, 12).Value = _ Worksheets("A").Range("A2:L2").Value ' 上と下の"A","B","C","D"は実際のシート名(学校名)に変更願います。 For Each v In Array("A", "B") ', "C", "D") With Worksheets(v) Set r = .Range(.[A2], .Cells(Rows.Count, "L").End(xlUp)) r.AutoFilter r.AutoFilter Field:=j - 1, Criteria1:=vv(j, 1) Set rs = .Range(.[A3], .Cells(Rows.Count, "L").End(xlUp)).SpecialCells(xlCellTypeVisible) If rs.Item(1).Row <> 2 Then rs.Copy rr rr.Offset(, -1).Resize(rs.Cells.Count / 12).Value = v Set rr = rr.Cells(rs.Rows.Count, 1).Offset(1) End If r.AutoFilter End With Application.CutCopyMode = False Next End Sub

noa8998
質問者

補足

さっそくありがとうございます!! 貼り付けてみたのですが、項目は表示されましたが、検索値があるのに何も表示されませんでした。 Private Sub CommandButton1_Click() End Sub の下に貼り付けるのはあっていますか? ' 上と下の"A","B","C","D"は実際のシート名(学校名)に変更願います。→AはA小学校,BはB小学校,CはC小学校,DはD小学校です。 Worksheets("A小学校").Range("A2:L2").Value For Each v In Array("A小学校", "B小学校") ', "C小学校", "D小学校")であっていますでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.9

"検索シート","A","B","C","D"は実際のシート名に変更されたのでしょうか? >検索ボタンは検索シートに置いているのですが・・・うまくできませんでした。 どこの行で、どのようなエラーが出ているのかを提示して頂けないと、 回答は困難です。 或いは予定していない動き方をしているのか?など具体的に。 実際にはそちらのデータ形式にあわせて直す部分があると思います。 (条件形式等々) 1サンプルとして見て頂くしかないかも知れません。

noa8998
質問者

補足

毎回すみません。コントロールツールボックスでボタンを作りVisual Basicで Private Sub CommandButton1_Click() End Sub の下に貼り付けています。"検索シート","A","B","C","D"は実際のシート名に変更しました。ツールバー→実行→sub/ユーザーフォームの実行をクリックしました。検索結果はあっていたのですが、各シートの項目まで出てしまいます。検索値が無いシートには項目のみ出ています。検索値が無いシート、検索値の有るシートどちらも『項目』は表示したくないのですが、マクロのどこをどう変えればよいでしょうか。どうか教えて下さい。 (現在の表示)A20:M20に 学校名,通し番号,区分,機能別分類,品目類,取得年月日,品名,規格等,購入単価,購入先,廃棄年月日,保管場所,取得区分 A21:M21に ABC学校,通し番号,区分,機能別分類,品目類,取得年月日,品名,規格等,購入単価,購入先,廃棄年月日,保管場所,取得区分 A22:M22に ABC学校,1,国語,教材,漢字スキル・・・・と表示されました。 検索値の無い学校は『DEF学校,通し番号,区分,機能別分類,品目類,取得年月日,品名,規格等,購入単価,購入先,廃棄年月日,保管場所,取得区分』と、項目のみ表示されました。 (希望する表示) A20:M20に 学校名,通し番号,区分,機能別分類,品目類,取得年月日,品名,規格等,購入単価,購入先,廃棄年月日,保管場所,取得区分 A21:M21に ABC学校,1,国語,教材,漢字スキル・・・・ 検索値の無い学校は表示なし。にしたいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.8

細かな点は実際の環境に合わせて下さい。 Sub Test3() Dim WS As Worksheet Dim r As Range Dim rr As Range, rs As Range Dim v As Variant, vv As Variant Dim i As Integer, j As Integer Set WS = Worksheets("検索シート") Set rr = WS.Range("B21") vv = WS.Range("D2:D14").Value For j = 1 To UBound(vv, 1) If Not IsEmpty(vv(j, 1)) Then GoTo nex: End If Next End nex: WS.Range("A20").Value = "学校名" WS.Range("B20").Resize(, 12).Value = _ Worksheets("A").Range("A2:L2").Value ' 上と下の"A","B","C","D"は実際のシート名(学校名)に変更願います。 For Each v In Array("A", "B", "C", "D") With Worksheets(v) Set r = .Range(.[A2], .Cells(Rows.Count, "L").End(xlUp)) r.AutoFilter r.AutoFilter Field:=j - 1, Criteria1:=vv(j, 1) Set rs = .Range(.[A3], .Cells(Rows.Count, "L").End(xlUp)).SpecialCells(xlCellTypeVisible) rs.Copy rr r.AutoFilter End With rr.Offset(, -1).Resize(rs.Cells.Count / 12).Value = v Set rr = rr.Cells(rs.Rows.Count, 1).Offset(1) Application.CutCopyMode = False Next End Sub ご参考になれば。

noa8998
質問者

補足

検索ボタンは検索シートに置いているのですが・・・うまくできませんでした。上記のマクロをコピーして貼り付けているのですが・・

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.7

ところで、 >この備品台帳の第1案では、Sheet1~4の全てのデータを蓄積シートに集め、 >そこからオートフィルタで検索するという形式でした。 エクセルでSheetからSheetへの飛ばし方 http://okwave.jp/qa3341952.html ⇒こちらは、なしになったの?

noa8998
質問者

補足

どちらの案も考え中です。まぎらわしくてすみません・・・ とりあえず2パターン作ろうと思っています。

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.6

>検索シートにはC2:14にシート名(学校名),通し番号,区分,機能別,分類,品目類,取得年月日, >品名,規格等,購入単価,購入先,廃棄年月日,保管場所,取得区分の項目名を入れています。 C列に項目名があることと、 >品名の『ノート』を選択し、 のつながりが見えないのですが、 『ノート』どこに表示されているのですか? 例えば、D列に打ち込むのですか? 或いはD列以降にすでに検索値は入っているのですか? それとC2~C14までデータがあれば、抽出されたデータはどこから 表示するのでしょう? 15行目? 20行目とか??

noa8998
質問者

補足

検索したい項目はC列、検索値はD列です。 例えば、Sheet1~4の中の『ノート』という品名を探す時・・・    C       D シート名(学校名) 通し番号 区分 機能別分類 品目        ノート 類取得年月日 品名 規格等 購入単価 購入先 廃棄年月日 保管場所 取得区分 D列に検索値を入力します。 検索結果を表示させるのは20行目から表示させたいです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excelで

    Excelでシート1、納品書です、A1に品名B1単価、C1合計です、シート2にA1品名B1に単価が作成された表が有ります50品目、シート1の納品書A1に品名を入れると単価が自動的に入力される方法お願いします。

  • エクセルでデータを簡単に登録したい。

    エクセルでデータを呼び出して誰でも簡単に、見栄えよく修正後再登録したいのですが。 知恵をおかしください データシートには横列で品目コード、品名、規格、使用場所、在庫、使用回数となっており 登録シートには縦列に品目コード、品名、規格、使用場所、在庫、使用回数となっています。 出来れば品目コードで呼び出しも出来、使用場所でも呼出し出来る様にしたいです。 項目データ変更後、更新し、新規登録も出来、在庫がラスト1になると 赤表示になりデータシートに反映され、登録シートに警告表示、される様に 月ごとの使用回数が集計され専用シートに登録し、検索した時に表示されればと思いますがどこかに項目、シート追加はOKです。よろしくお願いします。 なお、エクセルしかありませんので、よろしくお願いします

  • エクセルでデータを簡単に登録したい。

    エクセルでデータを呼び出して誰でも簡単に、見栄えよく修正後再登録したいのですが。 知恵をおかしください データシートには横列で品目コード、品名、規格、使用場所、在庫、使用回数となっており 登録シートには縦列に品目コード、品名、規格、使用場所、在庫、使用回数となっています。 出来れば品目コードで呼び出しも出来、使用場所でも呼出し出来る様にしたいです。 項目データ変更後、更新し、新規登録も出来、在庫がラスト1になると 赤表示になりデータシートに反映され、登録シートに警告表示、される様に 月ごとの使用回数が集計され専用シートに登録し、検索した時に表示されればと思いますがどこかに項目、シート追加はOKです。会社でそのまま使用したいので よろしくお願いします。 なお、エクセルしかありませんので、よろしくお願いします。

  • エクセル2000で見積書作成したいのです

    初心者ですがお願いします。 シート1に見積もり明細を作って、その明細の品名のセルをクリックすると、シート2に作ってある商品データの一覧が表示されて選択した品名・規格や単価等を見積もり明細に転記させたいのですが、どのようにすれば実現できますか?品名は200程度あります 宜しくお願いします。

  • Excel マクロで同じワークシート内で複数の条件が一致するものを

    Excel マクロで同じワークシート内で複数の条件が一致するものを 抽出する方法がありますか。具体的にはワークシート構成は|31日| 30日|29日|・・・|2日|1日|7月集計|品目別集計|となっています。 例として11日シートのC29にバナナ(品目)、E29に国産(規格)、F29 に20(数量)とあった場合に搬入品目別集計シートの同じ行にあるB 列(品目)、E列(規格)の一致するものを検索して該当する行より下 の最初のA列の空白に平成22年7月11日(搬入日)、同じく最初のB列 の空白(搬入日と同じ行になる)には20(数量)を出力する。12日シー トにC29バナナ、E29国産、F29に16とあれば搬入品目別集計シート に出力(平成22年7月11日の下にくるように)するという具合にする ことは可能でしょうか。品目もバナナ・メロンなど複数あり、規格 も国産・台湾産などと複数あるので11日シート(12日シートも同じ) のC29~C58、E29~E58の中で同じ行にあるものを品目別集計シー トのB列(品目)F列(規格)の同じ行にあるものを検索して出力させる。 うまく表現できませんが11日シートなどに日毎に搬入したものを入 力したときに、搬入品目別シート(先に必要な分の品目・規格を入力 した表を先に作成してある)のなかを検索して一致するものを品目毎 ・搬入日順に搬入数量を出力させる作業を手作業ではなく自動的に行 いたいのですが可能でしょうか。長文になりましたが初心者なので 具体的に教えていただきたいのですがどなたか宜しくお願い致します。

  • エクセルでデータ登録したい

    はじめまして、エクセルは最近使い始めた初心者です。 登録シート、データシートとあり、登録シートでデータシートより 品目コードでデータを呼出し在庫数など入力し直し、データシートに 登録したいのですが?何か良い知恵が有ればおかし願います。 例 品目コード____ 品名   ____ 規格  ____ 使用場所____ 在庫____ 登録 ボタンで登録出来る様にしたいのですがよろしくお願いします

  • エクセルファイルについて

    日々の管理として シート名「管理」に作成、 この「管理」は 上部には「1月」(月が変わると変更する)、いちばん左側に日にちを付ける(固定) 品名A、B・・・・・ にそれぞれ 原価、売値、数量、利益の4項目(項目を増やす品目あり) 日々、品名A、B・・・・に原価・・・・利益に入力されないときもある。 このシート名「管理」からシート名「日報」に日々の報告書を作りたい。 「管理」に入力すると自動で年月日、品名、原価など入力した数値などをとばした。 もし、品名「A」に原価、利益など入力されていない時は、その品目「A」を表示させず(とばさない) 原価、利益など入力したいる「品名」のみを表示させる(とばす) 宜しくお願いします。

  • エクセルで検索した場所へ自動でジャンプする方法

    エクセルで検索した場所へ自動でジャンプする方法はありますか?また、項目ごとに保存する方法は有りますか? 1、このシートは、コードを矢印の所に入力すると、規格一覧シートのデータを各項目に表示出来る様にしました。 で、修正したい項目セルを指定した時に、規格一覧シートを選択した場合同データセルにジャンプ出来る方法とか有るのでしょうか?また、VBAのボタンで検索とかで同じように検索出来る方法は有りますか? 2、このシートは項目にデータを表示させる様に関数を入れましたが、VBAで検索ボタンにコードを登録し、各項目にデータ表示 させ登録ボタンで規格一覧シートに登録させる方法は有りますか?なお規格一覧シートはこのようになっています。 ........A......... B....... C 1 コード 品目 規格 2 1234 いちご 果物 3 3456 キャベツ 野菜 よろしくお願いします。

  • VBAによる在庫管理について

    Sheet1のA1セルからE1セルまで「品名」、「単価」、「単位」、「在庫数量」、「備考欄」が記入されております。10000品目の在庫管理に使用しております。 Sheet2においてinputboxを使用し品名を入れるとSheet1のA1セルを起点とした表のA列「品名」から部分一致で検索し、検索結果のA列からE列までのデータをSheet3に表示するという構文を教えていただけると幸いです。 宜しくお願い致します。

  • エクセル 複数列を検索し左3列目を返す

    よろしくお願いします。 シート1の5列(E,J,O,T,Y)の中から,該当するセルを検索,該当セルの左隣3列目のセルを返す関数を考えています。検索条件の重複はありません。 検索結果を表示するシートをシート1とは別に作成します。 A列に検索条件を入力し,B列に結果を返したいです。 例シート1   A  B   C   D   E    F  G   H    I     J   ・・・・・   ID 品名 項目 単価 1年目 ID2 2品名 2項目 3単価 2年目 ・・・・・ 1 1  a   b   c    1-1   e    f    g   h   1-11 2 2  i    j   k     2-2  m    n    o   p   2-22  検索結果   A   B 1 1-1  a 2 2-22  n このような感じのファイルになっています。IFやLOOKUPなどを試しましたが,複数列をうまく検索する関数を作成することができませんでした。 また,検索対象となるシートが複数になる可能性もあり,その際にも対応できるとありがたいです。 よろしくお願いいたします。

このQ&Aのポイント
  • Roland HP-145電子ピアノを破棄する方法について教えてください。
  • また、この電子ピアノにはピアノ線が入っているのか教えていただきたいです。
  • ローランド製品やボス製品についての質問です。
回答を見る

専門家に質問してみよう