- ベストアンサー
エクセル 複数項目の検索
2つのボタンがあります。 (1)日付をいれて、診療日を検索するボタン (2)病棟をいれて、病棟を検索するボタン 教えて頂きたいのは、「10月1日 第3病棟」の様な診療日と病棟の両方が当てはまる項目を検索できるボタンです。 また、診療日を検索している(1)ですが、 「10月1日 10月7日」 など、複数の項目も検索できるボタンにしたいとも思っています。 検索の「and」みたいなものです。 おわかりになる方は、教えて下さい。 あまりVBAは詳しくありませんので、宜しくお願い致します。 <1> Private Sub CommandButton1_Click() 'マクロ実行画面の凍結 Application.ScreenUpdating = False '変数宣言 Dim 診療日 As Variant '抽出キーの入力指示 診療日 = InputBox 'キャンセルした場合の処理 If 診療日 = Empty Then Exit Sub End If 'オートフィルタがかかっていなかったらかける 'かかっていたら念の為一度解除し再設定 If ActiveSheet.AutoFilterMode = False Then Range("B5:E5").Select Selection.AutoFilter Else Selection.AutoFilter Range("B5:E5").Select Selection.AutoFilter End If Range("B3").Select '「診療日」の列(2列目)で、抽出キーを含むものを抽出 Selection.AutoFilter Field:=1, _ Criteria1:="=*" & 診療日 & "*", Operator:=xlAnd End Sub <2> (2)は(1)の「診療日」のところが「病棟」に変わっているだけです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
下記でいかがでしょうか? 下記を標準モジュールに貼り付けてテストしてみて下さい。 Private Sub test() 'マクロ実行画面の凍結 Application.ScreenUpdating = False '変数宣言 Dim 診療日 As Variant Dim 病棟 As Variant '抽出キーの入力指示 診療日 = InputBox("診療日をいれてください", "診療日入力") 'キャンセルした場合の処理 If 診療日 = Empty Then Exit Sub 病棟 = InputBox("病棟をいれてください", "病棟入力") 'キャンセルした場合の処理 If 病棟 = Empty Then Exit Sub 'オートフィルタがかかっていたら解除 If ActiveSheet.AutoFilterMode Then Selection.AutoFilter 'フィルタ設定 Range("B5:E5").AutoFilter Range("B3").Select '診療日と病棟の2項目にフィルタ条件設定 Selection.AutoFilter Field:=1, _ Criteria1:="=*" & 診療日 & "*", Operator:=xlAnd Selection.AutoFilter Field:=3, _ Criteria1:="=*" & 病棟 & "*", Operator:=xlAnd End Sub
その他の回答 (2)
- Xen
- ベストアンサー率75% (15/20)
日付が文字なのかとかが色々分からない&フィルターで制御するやり方ではないのですが。 検索対象以外を非表示にする(正確には検索対象を表示する)マクロです。ボタンは1つで良いです。 日付のみ複数はOR条件、病棟のみ複数もOR条件です。 日付と病棟はAND条件になります。 Sub Search_Rows() Dim Search1 As String Dim Search2 As String Dim S1() As String Dim S2() As String Dim SV1 As Variant Dim SV2 As Variant Dim HFlg As Boolean Cells.Select Selection.EntireRow.Hidden = True Range("B1").Select Selection.EntireRow.Hidden = False Range("B2").Select Search1 = InputBox("検索日(複数可)を入力" & vbNewLine & "(指定しない場合はキャンセル押下)", "条件入力") Search2 = InputBox("検病棟(複数可)を入力" & vbNewLine & "(指定しない場合はキャンセル押下)", "条件入力") If (Search1 & Search2) = "" Then MsgBox "検索はキャンセルされました。", vbInformation Cells.Select Selection.EntireRow.Hidden = False Range("B1").Select Exit Sub End If S1 = Split(StrConv(Search1, vbNarrow), " ") S2 = Split(Search2, " ") Do While ActiveCell.Text <> "" If Search1 <> "" Then For Each SV1 In S1 If ActiveCell.Text = SV1 Then If Search2 <> "" Then For Each SV2 In S2 If ActiveCell.Offset(0, 2).Text = SV2 Then Selection.EntireRow.Hidden = False Exit For End If Next Else Selection.EntireRow.Hidden = False End If Exit For End If Next Else For Each SV2 In S2 If ActiveCell.Offset(0, 2).Text = SV2 Then Selection.EntireRow.Hidden = False Exit For End If Next End If ActiveCell.Offset(1, 0).Activate Loop MsgBox "検索が終了しました。", vbInformation End Sub 補足 ちょっと時間がなかったのでコードはかなり粗いです。 ご希望の物とは違いますが参考までに。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>(2)は(1)の「診療日」のところが「病棟」に変わっているだけです。 という事は、一つのセルに「10月1日 第3病棟」と入っているのでしょうか? それなら、データの入力方法としては不適切な方法です。 「日付」と「病棟」を分割するのが適切です。 そうでないなら、Selection.AutoFilter の Field:=1 や Criteria1 に違う値が入っているかと思いますが・・・。 本当に全く同じなら、診療日や病棟の入力(Inputbox)で「10月1日 第3病棟」と入れるだけで検索されると思います。
補足
すいません。素人なので、許してください。 そこは1ではなく、3です。 B列に「診療日」、D列に「病棟」が入っています。 いかがでしょうか。 <ボタン3> Selection.AutoFilter Field:=3, _ Criteria1:="=*" & 病棟 & "*", Operator:=xlAnd
補足
お答え本当にありがとうございます。 大変助かっております。 しかし、教えていただいたものだと、該当するものが1つしか表示されません。 「10月1日」 「第2病棟」 の2つの項目に該当するものが、表に複数あるのですが、1つしか表示されないのです。 教えていただいたものを、コピーして貼り付けましたので、打ち間違えはないと思うのですが・・・。すいません。 ここまでいくと、私には、これのどこが間違っているのかわからず、修正もできません。 よろしければ、再度教えていただいてもよろしいでしょうか。