Funções COUNTIF e COUNTIFS no VBA
In this Article
Este tutorial irá lhe mostrar como você pode usar a função COUNT IF e COUNTIFS no VBA.
O VBA não te funções equivalentes às Funções do Excel COUNTIF ou COUNTIFS. No entanto, você pode chamá-las usando o objeto WorkSheetFunction.
COUNTIF WorksheetFunction
O objeto WorksheetFunction pode ser utilizado para chamar a maioria das funções internas do Excel que estão disponíveis na Caixa de Diálogo Inserir Função no Excel. A função COUNTIF é uma delas.
Sub TesteCountIf()
Range("D10") = Application.WorksheetFunction.CountIf(Range("D2:D9"), ">5")
End Sub
O procedimento acima irá contar somente as células no Intervalo Range(D2:D9) se eles tiverem um valor que seja igual ou maior que of 5. Perceba que, por estar usando o sinal > (maior que), o critério > 5 (maior que 5) precisa estar entre parênteses.
Atribuindo o Resultado da Função COUNTIF a uma Variável
Pode ser que você queira utilizar o resultado da sua fórmula em outro lugar no código ao invés de escrevê-lo diretamente em um intervalo no Excel. Se este for o caso, você pode atribuir o resultado a uma variável para usá-la posteriormente no seu código.
Sub AtribuirCountIfParaVariavel()
Dim resultado as Double
'Atribui a variável resultado
resultado = Application.WorksheetFunction.CountIf(Range("D2:D9"), ">5")
'Exibe o resultado
MsgBox "A contagem das células com valor maior que 5 é " & resultado
End Sub
Usando a Função COUNTIFS
A função COUNTIFS é similar a função COUNTIF do Excel mas ela lhe permite checar mais de um critério. No exemplo abaixo, a formula irá contar o número de células do intervalo D2 a D9 onde o Preço seja maior que 6 e o Custo seja menor que 5.
Sub UsandoCountIfs()
Range("D10") = WorksheetFunction.CountIfs(Range("C2:C9"), ">6", Range("E2:E9"), ">5")
End Sub
Usando COUNTIF com um Objeto Range
Você pode atribuir um grupo de células à um Objeto Range, e usar esse objeto Range com o objeto WorksheetFunction.
Sub TesteCountIFRange()
Dim rangeCount as Range
'Atribui um intervalo de células à variável rangeCount
Set rangeCount = Range("D2:D9")
'Usa o intervalo na fórmula
Range("D10") = WorksheetFunction.COUNTIF(rangeCount, ">5")
'Libera a memória utilizada pelo objeto Range
Set rangeCount = Nothing
End Sub
Usando a Função COUNTIFS em Múltiplos Objetos Range
De modo similar, você pode usar a função COUNTIFS em múltiplos Objetos Range.
Sub TesteContarMultiplosRanges()
Dim rangeCriterio1 As Range
Dim rangeCriterio2 as Range
'Atribui os intervalos às variáveis
Set rangeCriterio1 = Range("D2:D9")
Set rangeCriterio2 = Range("E2:E10")
'Usa os variáveis range na fórmula
Range("D10") = WorksheetFunction.CountIfs(rangeCriterio1, ">6", rangeCriterio2, ">5")
'Libera a memória utilizada pelos objetos range
Set rangeCriterio1 = Nothing
Set rangeCriterio2 = Nothing
End Sub
Fórmula COUNTIF
Quando você utilizada a função WorksheetFunction.COUNTIF para adicionar uma soma a um intervalo na sua planilha, um valor estático é retornado, não uma fórmula flexível. Na prática, isso significa que quando os valores no Excel mudarem, o valor que foi retornado pela WorksheetFunction não irá mudar.
No exemplo acima, o procedimento contou o total de células no intervalo Range(D2:D9) onde o Preço é maior que 6, e o resultado foi colocado na célula D10. Como você pode ver na barra de fórmula, este resultado é um valor e não uma fórmula.
Se qualquer um dos valores mudarem no intervalo Range (D2:D9), o resultado em D10 NÃO irá mudar.
Ao invés de usar o WorksheetFunction.COUNTIF, você pode usar o VBA para aplicar a função COUNTIF a uma célula usando os métodos Formula or FormulaR1C1.
Método Formula
O método Formula lhe permite apontar de forma específica para um intervalo de células, ou seja: D2:D9 como mostrado abaixo.
Sub TestCountIf()
Range("D10").Formula ="=COUNTIF(D2:D9, "">5"")"
End Sub
Método FormulaR1C1
O método FormulaR1C1 é mais flexível uma vez que ele não lhe restringe a um intervalo de células específico. O exemplo abaixo irá lhe dar a mesma resposta que o exemplo anteior.
Sub TestCountIf()
Range("D10").FormulaR1C1 = "=COUNTIF(R[-8]C:R[-1]C,"">5"")"
End Sub
No entanto, para deixar a fórmula ainda mais flexível, poderíamos alterar o código para ficar assim:
Sub TestCountIf()
ActiveCell.FormulaR1C1 = "=COUNTIF(R[-8]C:R[-1]C,"">5"")"
End Sub
Onde quer que você esteja na sua planilha, a fórmula irá contar as células diretamente acima que satisfazem o critério e colocar o resultado na sua ActiveCell. O intervalo Range dentro da função COUNTIF precisa ser referenciado usando a sintaxe de Linha (R) e Coluna (C).
Ambos os métodos lhe permitem usar Fórmulas Dinâmicas do Excel dentro do VBA.
Perceba que, no exemplo abaixo, haverá uma fórmula na célula D10, ao invés de um valor estático.