答えが明白であれば申し訳ありません。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
。