電子書籍の厳選無料作品が豊富!

エクセルで、作った表の中の文字を検索して表示できるようなものを作ろうとしています。

「10月1日」
「第3病棟」

の様な診療日と病棟の両方が当てはまる項目を検索できるものを作成しようとして、いろいろ教えていただきました。
しかし、私のやり方がおかしいのか検索をしてもうまくいきません。

作った表にはB列に「診療日」、D列に「病棟」が全部で100近く入っています。
下記のものだと、検索し、当てはまるものが1つしか表示されません。
本当は当てはまる項目は複数あるのですが、それらがうまく表示されないのです。

わかる方がいらっしゃりましたら、教えてください。


Private Sub CommandButton1_Click()

'マクロ実行画面の凍結
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

A 回答 (2件)

テストの関係上、A,B列でフィルタする例に変えましたが


Private Sub CommandButton1_Click()

'マクロ実行画面の凍結
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("A1:B11").Select
Selection.AutoFilter
'診療日と病棟の2項目にフィルタ条件設定
Selection.AutoFilter Field:=1, Criteria1:="=*" & 診療日 & "*"
Selection.AutoFilter Field:=2, Criteria1:="=*" & 病棟 & "*"
End Sub
はどうですか。
    • good
    • 0

こんにちは。



とりあえず、そのままのスタイルを生かして、作り変えました。
できるなら、ExcelのVersionを出しておいたほうがよいと思います。これは、Versionによっても、微妙に違っていたような気がします。

Private Sub CommandButton1_Click()
Dim 診療日 As Variant
Dim 病棟 As String
Dim flg As Boolean
flg = False
With ActiveSheet
'すべてを出す。
If .FilterMode Then .ShowAllData
Do
診療日 = InputBox("診療日をいれてください", "診療日入力")
If 診療日 = Empty Then Exit Sub
 If Not IsDate(診療日) Then
    MsgBox "日付ではありません。"
 Else
  診療日 = DateValue(診療日)
  If Year(診療日) < 2000 Then
   MsgBox "日付が違うようです。"
  Else
   flg = True
  End If
 End If
Loop Until IsDate(診療日) And flg = True
'B6の書式に従って診療日の書式を変更させる。

診療日 = Format(診療日, .Range("B5").Offset(1).NumberFormatLocal)

病棟 = InputBox("病棟をいれてください", "病棟入力")
 If 病棟 = "" Then Exit Sub
Application.ScreenUpdating = False
'フィルタ設定
With .Range("B5").CurrentRegion
  .AutoFilter _
  Field:=1, Criteria1:="=" & CStr(診療日), Operator:=xlAnd
  .AutoFilter _
  Field:=3, Criteria1:="=" & 病棟 & "*", Operator:=xlAnd
End With
Application.ScreenUpdating = True
End With
End Sub

懸案としては、

「第3病棟」 ←3だけで検索できるかどうか、という
       こと。
       つまり、データの文字列が全角なら全
       角、半角なら半角の3を探すようにさ
       せ、Criterial1:="第"&病棟 &"*" に
       したほうがよいかもしれません。

なお、ご質問のコードは、No.1684363で、hana-hana3さんのもののようです。回答者どうしのコードに手を入れるのは、掲示板の回答の暗黙のルールに触れますから、もし、hana-hana3さんが読まれて気分を害していたら、私はお詫びいたします。

この Autofilterは、Versionによって違いがあるのか、バグっぽい動きがあるので、特にに日付式の検索検索などは、念入りに手を加えないと、うまくできません。VBAを良く知っている者でも、むつかしいもののひとつです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!