VBA コードを使用してフィルターされたリスト内の空白セルをカウントする VBA デバッグ

VBA コードを使用してフィルターされたリスト内の空白セルをカウントする VBA デバッグ

答えが明白であれば申し訳ありません。VBA を使い始めてまだ 1 週間です。別のシートのセルをフィルター処理し、フィルターされたリストに残っている空白をカウントしたいです。既存の回答からコードの基本を入手したので、自分で作り上げたわけではなく、ほぼ機能していますが、これを 3 時間見つめてさまざまなことを試した後、質問しようと思いました。

コードは結果を生成しますが、毎回正しい数より 1 つだけ多いため、フィルタリングされたリストには 2 つの空白がありますが、出力は 3 です。リストに対してあらゆる種類の調整を試しましたが、常に予想より 1 つ多くなります。フィルタリングしているリストの写真を添付し​​てみます。

範囲の終わりを動的に見つけてフィルターを適用するコードもあります。この部分が機能するようになったら、「フィルター解除」コード行も追加します。

Sub BlankCheck()
    ' Find last free row
    Dim lRow As Long
        lRow = Worksheets(2).Cells.Find(What:="*", _
            After:=Range("A1"), _
            LookAt:=xlPart, _
            LookIn:=xlFormulas, _
            SearchOrder:=xlByRows, _
            SearchDirection:=xlPrevious, _
            MatchCase:=False).Row
    
    ' Filter
    Worksheets(2).UsedRange.AutoFilter Field:=1, Criteria1:="test"
    
    ' Count visible blanks
    Worksheets(1).Cells(1, 1) = Range(Worksheets(2).Cells(1, 2), Worksheets(2).Cells(lRow, 2)). _
    SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeConstants).Count
    
End Sub

ご協力いただければ幸いです。

フィルタリングされていないリストの画像

答え1

これが返される理由は3、現在、列にコンテンツがある表示可能なセルを探しているためですB。つまり、フィルターを適用した後、ヘッダーとコンテンツがある 2 つのセルが含まれます。


列 A の条件に一致する空のセルの数を返すことが目的の場合は、次の式も使用できます。

Sub Test()

With ThisWorkbook.Worksheets("Sheet1")
    Debug.Print Application.WorksheetFunction.CountIfs(.Range("A:A"), "test", .Range("B:B"), "")
End With

End Sub

サンプルデータでは、これは を返します2

関連情報