• ベストアンサー

エクセル 複数項目の検索

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)の「診療日」のところが「病棟」に変わっているだけです。

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

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

下記でいかがでしょうか? 下記を標準モジュールに貼り付けてテストしてみて下さい。 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

noname#132207
質問者

補足

お答え本当にありがとうございます。 大変助かっております。 しかし、教えていただいたものだと、該当するものが1つしか表示されません。 「10月1日」 「第2病棟」 の2つの項目に該当するものが、表に複数あるのですが、1つしか表示されないのです。 教えていただいたものを、コピーして貼り付けましたので、打ち間違えはないと思うのですが・・・。すいません。 ここまでいくと、私には、これのどこが間違っているのかわからず、修正もできません。 よろしければ、再度教えていただいてもよろしいでしょうか。

その他の回答 (2)

  • Xen
  • ベストアンサー率75% (15/20)
回答No.3

日付が文字なのかとかが色々分からない&フィルターで制御するやり方ではないのですが。 検索対象以外を非表示にする(正確には検索対象を表示する)マクロです。ボタンは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)
回答No.1

>(2)は(1)の「診療日」のところが「病棟」に変わっているだけです。 という事は、一つのセルに「10月1日 第3病棟」と入っているのでしょうか? それなら、データの入力方法としては不適切な方法です。 「日付」と「病棟」を分割するのが適切です。 そうでないなら、Selection.AutoFilter の Field:=1 や Criteria1 に違う値が入っているかと思いますが・・・。 本当に全く同じなら、診療日や病棟の入力(Inputbox)で「10月1日 第3病棟」と入れるだけで検索されると思います。

noname#132207
質問者

補足

すいません。素人なので、許してください。 そこは1ではなく、3です。 B列に「診療日」、D列に「病棟」が入っています。 いかがでしょうか。 <ボタン3> Selection.AutoFilter Field:=3, _ Criteria1:="=*" & 病棟 & "*", Operator:=xlAnd

関連するQ&A