[[20190201093846]] 『フィルターで見つからなかった時』(フィルター) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『フィルターで見つからなかった時』(フィルター)

こんにちわ。

下記のコードで指定の列(ここでは24列目)の指定の文字列でフィルターをかけているのですが。
その文字列が見つからなかった場合に、「見つかりません」のようなコメントを表示し、フィルターを実行されないようにしたいのですが、どのようにすればよいでしょうか。
見つかりませんの時にOKボタン等を押して消すような感じだとよいのですが。

宜しくお願い致します。

Private Sub CommandButton2_Click()
Dim myFld As String, myCri As String

    Dim myRow As Long
        myFld = 24
        myCri = InputBox("検索する文字列は?")
        Worksheets("Sheet1").Range("A1").AutoFilter Field:=myFld, Criteria1:=myCri

End Sub

< 使用 Excel:Excel2016、使用 OS:Windows10 >


また、現状だと、間違ってこのボタンを押した場合に、Xを押して閉じると変なフィルターがかかってしまうので、何もされないで閉じるようになるよにもしたいのですが。

宜しくお願い致します。
(フィルター) 2019/02/01(金) 09:48


 Sub Sumple()
    Dim MyCri As String
    MyCri = InputBox("検索する文字列は?")

    With ThisWorkbook.Sheets("Sheet1")
        If .Range("X:X").Find(MyCri, , , xlWhole) Is Nothing Then
            MsgBox "見つかりません", vbCritical
        Else
            .AutoFilterMode = False
            .Range("A1").AutoFilter 24, MyCri
        End If
    End With
 End Sub

(TAKA) 2019/02/01(金) 09:53


 Sub Sumple2()
    Dim MyCri As String
    MyCri = InputBox("検索する文字列は?")

    With ThisWorkbook.Sheets("Sheet1")
        .AutoFilterMode = False
        .Range("A1").AutoFilter 24, MyCri
        If WorksheetFunction.Subtotal(3, .Range("X:X")) < 2 Then
            MsgBox "見つかりません", vbCritical
            .AutoFilterMode = False
        End If
    End With
 End Sub

(TAKA) 2019/02/01(金) 09:57


Sumple
 先に【検索】をして、見つかった場合のみオートフィルタをかける方法

Sumple2

 オートフィルタをかけ、結果がなかった場合のみフィルタを元に戻す方法

参考にしてください、、
(TAKA) 2019/02/01(金) 09:59


テストしてないけどこんなのもありかなぁ
    Private Sub CommandButton2_Click()
        'Dim myFld As String ' ← 列"番号"が入るから[Integer]や[Long]のほうがよいでしょう
        Const myFld As Long = 24 '←固定なら定数とするのもあり

        Dim 範囲 As Range

        Dim myCri As String
        Dim myRow As Long  '←提示されたコードでは使ってないですね

        myCri = InputBox("検索する文字列は?")
        If myCri = "" Then Exit Sub 'キャンセルされたら「myCri」が空っぽのままなのを利用

        With Worksheets("Sheet1")

            '.Range("A1").AutoFilter を実行したときにフィルタがかかる範囲
            Set 範囲 = .Range("A1").ClearContents

            '範囲の24列目に対象データが何個あるか数える
            If Not Application.CountIf(myCri, 範囲.Columns(myFld)) Then
                'not 0 → not False → True  つまり0こだったら
                MsgBox myCri & " はありません"
                Exit Sub
            End If

            .Range("A1").AutoFilter Field:=myFld, Criteria1:=myCri
        End With
    End Sub

TAKAさんと同じで、要は、オートフィルタの操作をするまえに、データの有無をチェックしちゃえばよいって考え方です。
あと、個人的にはFindメソッド(通常操作の「検索」のこと)を使う場合、名前付き引数を省略するとわからなくなりそうなので、慣れないうちは名前付き引数を省略することはお勧めしてないです。
(分かるので気になりませんというのであれば問題ないです)

なお、引数自体の省略はもっとおすすめしないです。
名前付き引数を省略してもすぐにわかるくらいなら説明はいらないとおもいますが一応

 検索に失敗するとき(Findメソッドの引数省略時に起きる失敗)
https://www.moug.net/tech/exvba/0150111.html 

(もこな2) 2019/02/01(金) 11:29


TAKA様ありがとうございます。
検索してから解除せずに次の検索をする使用方法の為なのか、エラーになってしまいました。

もこな2さまありがとうございます。
そのまま貼り付けをしてテストしてみたところ、
Set 範囲 = .Range("A1").ClearContents
の部分でエラーを発してしまいました。
(フィルター) 2019/02/01(金) 11:51


 一応テスト済みですが、どうでしょう?
 些細なことなのですが、手作業のオートフィルターの検索と、若干結果が異なります。
 血液型の列があったとして、
  手作業の場合 a と入れると、A ABが出ますが
  下記の場合、a と入れると、Aのみになります。

    Private Sub CommandButton2_Click()
        Const myFld As Long = 24
        Dim myCri   As String
        Dim myRng   As Range
        Set myRng = Range("A1")
        myCri = InputBox("検索する文字列は?")
        If Me.FilterMode = True Then
            Me.ShowAllData
            myRng.AutoFilter
        End If
        Select Case True
            Case myCri = ""
                MsgBox "検索文字が入力されていません"

            Case Application.CountIf(myRng.Offset(, myFld - 1).EntireColumn, myCri) > 0
                myRng.AutoFilter Field:=myFld, Criteria1:=myCri

            Case Else
                MsgBox "検索対象がありません"
        End Select
    End Sub
(稲葉) 2019/02/01(金) 12:08

あっ。スゴいミスしてますね、ごめんなさい。

 誤
Set 範囲 = .Range("A1").ClearContents

 正
Set 範囲 = .Range("A1").CurrentRegion

スマホからなので、他にもミスってるかもですがとりあえず。

(もこな2) 2019/02/01(金) 12:30


 >検索してから解除せずに次の検索をする使用方法の為なのか、エラーになってしまいました。 
 解除って???
(TAKA) 2019/02/01(金) 13:33

 ・一行目を見出しとしてデータは二行目から始まってますか?
 ・A1 が表の始点(一番左上のセル)になってますか?
 ・A列からX列(24列目)までの間に、見出しも含めて全て空白の列は存在しないですか?
 ・表のA1を選択した状態で、Ctrl + *  を押したときに表全体が正しく選択されますか?
 ・X列には数式が入っていませんか?

 思いつくのはこれくらいかな、、
 エラーはどんなエラーなんでしょうか。

 一応、何も入力しなかった場合のことを考えるならこうですかね。

 Sub Sumple()
    Dim MyCri As String
    MyCri = InputBox("検索する文字列は?")

    If MyCri <> "" Then
        With ThisWorkbook.Sheets("Sheet1")
            If .Range("X:X").Find(MyCri, , , xlWhole) Is Nothing Then
                MsgBox "見つかりません", vbCritical
            Else
                .AutoFilterMode = False
                .Range("A1").AutoFilter 24, MyCri
            End If
        End With
    End If
 End Sub

(TAKA) 2019/02/01(金) 14:01


ああ、もしかして
あいまい検索だったりしますか?

 あいまい検索、元からシートにフィルタがかかってる場合
 を考慮するとこうなります

 Sub Sumple()
    Dim MyCri As String
    MyCri = InputBox("検索する文字列は?")

    If MyCri <> "" Then
        With ThisWorkbook.Sheets("Sheet1")
            .AutoFilterMode = False
            If .Range("X:X").Find("*" & MyCri & "*", , , xlWhole) Is Nothing Then
                MsgBox "見つかりません", vbCritical
            Else
                .Range("A1").AutoFilter 24, "*" & MyCri & "*"
            End If
        End With
    End If
 End Sub

(TAKA) 2019/02/01(金) 14:16


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.