Como complemento do último post, que dava a possibilidade de efetuar operações matemáticas em células filtradas através do VBA, adiciono uma alternativa disponibilizada por um colega do fórum INFO.
Existe uma forma mais simples de fazer operações matemáticas em dados filtrados fazendo uso da função SUBTOTAL.
A descrição da Ajuda do Excel fala por si:
A função SUBTOTAL retorna um subtotal em uma lista ou em um banco de dados. É geralmente mais fácil criar uma lista com subtotais usando o comando Subtotais, grupo Contorno, na guia Dados. Assim que a lista de subtotais for criada, você poderá modificá-la editando a função SUBTOTAL.
Sintaxe
SUBTOTAL(núm_função, ref1, ref2, …)
Núm_função é o número de 1 a 11 (incluindo valores ocultos) ou 101 a 111 (ignorando valores ocultos) que especifica qual função usar no cálculo de subtotais dentro de uma lista.
Núm_função
(incluindo valores ocultos) |
Núm_função
(ignorando valores ocultos) |
Função |
| 1 |
101 |
MÉDIA |
| 2 |
102 |
CONTA |
| 3 |
103 |
CONT.VALORES |
| 4 |
104 |
MÁX |
| 5 |
105 |
MÍN |
| 6 |
106 |
MULT |
| 7 |
107 |
DESVPAD |
| 8 |
108 |
DESVPADP |
| 9 |
109 |
SOMA |
| 10 |
110 |
VAR |
| 11 |
111 |
VARP |
Ref1, ref2 são de 1 a 254 intervalos ou referências cujo subtotal você deseja.
Comentários
- Se existirem outros subtotais dentro de ref1; ref2,… (ou subtotais aninhados), esses subtotais aninhados serão ignorados para evitar dupla contagem.
- Para as constantes núm_função de 1 a 11, a função SUBTOTAL inclui os valores de linhas ocultas pelo comando Ocultar Linhas no submenu Ocultar e Exibir do comando Formato no grupo Células, na guia Início). Use essas constantes para subtotalizar números ocultos e não-ocultos em uma lista. Para as constantes núm_função de 101 a 111, a função SUBTOTAL ignora valores de linhas ocultos pelo comando Ocultar Linhas. Use essas constantes para subtotalizar somente números não-ocultos em uma lista.
- A função SUBTOTAL ignora as linhas não incluídas no resultado de um filtro, independentemente de qual valor de núm_função seja utilizado.
- A função SUBTOTAL foi projetada para colunas de dados ou intervalos verticais. Ela não foi projetada para linhas de dados nem intervalos horizontais. Por exemplo, quando você subtotaliza um intervalo horizontal usando uma núm_função de 101 ou maior, como SUBTOTAL(109,B2:G2), ocultar uma coluna não afeta o subtotal. Porém, ocultar uma linha em um subtotal de um intervalo vertical afeta o subtotal.
- Se qualquer uma das referências for uma referência 3D, a função SUBTOTAL retornará o valor de erro #VALOR!.
Exemplo
Portanto, considerando a mesma planilha do post anterior, cuja fórmula mencionada foi:
=Soma_Celulas_Visiveis(C2:C50)
pode ser substituída por:
=SUBTOTAL(9;C2:C50)
A vantagem óbvia é a simplicidade de uso e a dispensa do uso de macros. O post anterior mantém sua utilidade para execução de funções mais complexas em dados não filtrados.
Agradecimentos
Fica meu agradecimento ao usuário Avatar_2010 do fórum INFO de Excel sobre a dica colocada. Valeu garoto!
Bom proveito!
Dois dos recursos mais poderosos do Excel infelizmente não conseguem trabalhar bem juntos.
O problema reside no fato de que a função SOMA compreende um range de células e inclui em sua soma todo o intervalo. Por exemplo, você possui uma planilha que abrange da linha 2 a linha 50. Aplica uma fórmula SOMA, por exemplo, na coluna C, o que geraria o seguinte:
=SOMA(C2:C50)
Se aplicar um AutoFiltro nesta planilha, perceberá que sua fórmula continua considerando todas as linhas, mesmo as que não estão visíveis. Dependendo da situação, isso pode ser um problema. Não há funções tradicionais para resolvê-lo, porém, uma macro pode ajudar.
Copie e cole esta função personalizada em um módulo VBA.
Function Soma_Celulas_Visiveis(Cells_To_Sum As Object)
Application.Volatile
For Each cell In Cells_To_Sum
If cell.Rows.Hidden = False Then
If cell.Columns.Hidden = False Then
Total = Total + cell.Value
End If
End If
Next
Soma_Celulas_Visiveis = Total
End Function
Agora, substitua a função citada acima pela seguinte:
=Soma_Celulas_Visiveis(C2:C50)
Ou adapte ao range da sua planilha. Agora, aplique o autofiltro de forma que algumas linhas fiquem escondidas. Note que a função considera apenas as células que estão visíveis agora.
Explicando
O segredo da função acima está na seguinte linha:
If cell.Rows.Hidden = False Then
Essa linha verifica se a linha da célula corrente está oculta ou não (propriedade Hidden). Quando o filtro é aplicado, as linhas que não obedecem aos critérios do filtro ficam no estado de Hidden = True.
Espero que a dica seja de grande ajuda.
Bom proveito!
Download da Planilha de exemplo
http://www.tomasvasquez.com.br/downloads/Soma_Celulas_Visiveis.zip
Referências
http://support.microsoft.com/?scid=kb%3Ben-us%3B150363&x=10&y=14
Direto do meiobit
Opção interessante, principalmente para geeks, mais ainda para programadores. Opções de calculadores há de monte, mas essa tem um toque especial. A Console Calculator da zoesoft disponibiliza uma infertace console (Prompt do DOS ou Terminal se preferirem) para realização de cálculos utilizando uma sintaxe funcional. O visual é bem simpático:
A vantagem (para alguns) é a entrada das expressões diretamente no console. Mas, além disso, ela possui outras funcionalidades muito interessantes, como por exemplo:
- Criação de funções;
- Repetição das últimas entradas (“setinha para cima”);
- Fácil conversão de base (CTRL + 1, CTRL + 2 ou CTRL + 3);
- Precisão de 100 dígitos (nunca me dei ao trabalho de calcular o valor de PI até 3.141592653589793238462643383279502884197169399375105820974944592307…)!
- Conversão de unidades e por aí vai…
Com apenas 528kB, já entre meus programas mais usados. Vale a dica.
Download do Console Calculator
http://www.zoesoft.com/console-calculator/
Opinião do autor
Como bom programador, já está nos meus atalhos favoritos!
Há algum tempo, publiquei um exemplo de código VBA que permitia efetuar um filtro em uma lista de itens em um ListBox (UserForm), mas especificamente neste link:
http://www.tomasvasquez.com.br/blog/microsoft-office/vba-como-filtrar-dados-no-listbox
Bom, nas discussões no nosso fórum, acabamos por aperfeiçoar o código para algo mais abrangente. A boa notícia é que o código continua bem genérico, pode ser facilmente acoplado em qualquer planilha. A notícia ótima é que os critérios de filtro ficaram bem mais completos.
O código agora permite selecionar o campo no qual será aplicado o filtro, o valor do filtro e mostra todos as colunas da tabela. Abaixo segue como ficou a aparência do formulário:

O código VBA
Entrando um pouco em detalhes a respeito do funcionamento do código e como adaptá-lo a sua planilha, seguem algumas considerações.
Variáveis
Private Const NomePlanilha As String = “Fornecedores”
Private Const LinhaCabecalho As Integer = 1
NomePlanilha contempla o nome da planilha ao qual será aplicado o filtro. Altere para o nome da sua planilha.
LinhaCabecalho representa qual a linha da sua planilha contém o cabeçalho da tabela. É nele que se baseiam todos as outras funções.
Funções
PreencheCampos – Preenche o ComboBox com o nome dos cabeçalhos
PreencheCabecalho – Função auxiliar para colocar no ListBox de resultado o cabeçalho dos valores
PreencheLista – Preenche o ListBox de resultado considerando os valores de filtro
Download da planilha
Filtra_ListBox_VBA_Custom.zip
Bom proveito!