Depuração VBA na contagem de células em branco em uma lista filtrada com código VBA

Depuração VBA na contagem de células em branco em uma lista filtrada com código VBA

Desculpas se a resposta for óbvia, estou usando VBA há apenas uma semana. Deseja filtrar as células em uma planilha separada e conte os espaços em branco deixados na lista filtrada. Eu obtive o básico do código a partir de respostas existentes, então não inventei sozinho e quase funciona, mas pensei em perguntar depois de olhar para isso por 3 horas e tentar coisas diferentes.

O código produz um resultado, é apenas 1 a mais do que o correto a cada vez, então há dois espaços em branco na lista filtrada, mas a saída é 3. Tentei todos os tipos de ajustes na lista, mas é sempre 1 a mais que o esperado. Tentarei anexar fotos da lista que estou filtrando.

Também tenho código para encontrar dinamicamente o final do intervalo e aplicar o filtro. Também adicionarei uma linha de código 'unfilter' assim que essa parte funcionar.

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

Agradecemos antecipadamente por qualquer ajuda.

imagem da lista não filtrada

Responder1

Para que você saiba por que isso retorna 3, é que atualmente você está procurando células visíveis que tenham conteúdo na Bcoluna. Portanto, inclui o cabeçalho E as duas células que possuem conteúdo após a aplicação do filtro.


Se o seu objetivo é retornar o número de células vazias com os critérios da coluna A, você também pode usar:

Sub Test()

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

End Sub

Nos seus dados de amostra, isso retorna 2.

informação relacionada