Quer saber como criar a função FILTRO sem Microsoft 365? Então vem comigo que eu vou te mostrar o passo a passo!
Caso prefira esse conteúdo no formato de vídeo-aula, assista ao vídeo abaixo!
Para receber por e-mail o(s) arquivo(s) utilizados na aula, preencha:
Fala, Impressionadores! Na aula de hoje eu quero te mostrar como usar a função FILTRO sem Microsoft 365 (sem o Excel mais atual).
Para isso nós vamos fazer a criação de funções personalizadas utilizando o VBA, então vamos utilizar a função PROCX personalizada (que fizemos em outra aula).
Vamos utilizar matrizes no Excel (array no VBA) e a estrutura de repetição For Each. Com isso nós vamos conseguir criar a função FILTRO.
Essa função FILTRO está disponível na versão mais atual do Excel e te permite filtrar as informações de uma tabela de uma forma mais fácil.
Agora com a ferramenta do VBA você pode criar não só a função FILTRO, como a função PROCX que já criamos aqui no canal, como qualquer outra função que queira!
E aí, quer aprender a criar uma função personalizada no Excel? Então vamos pra aula que o conteúdo está irado!
Inserindo um Módulo no VBA
Para criar um código dentro de um módulo, precisamos primeiramente abrir o ambiente de VBA, a partir do atalho do teclado Alt(+Fn)+F11.
Como não temos nenhum módulo destinado ao tema da aula de hoje, e por questão de organização, vamos criar um módulo à parte.
Vamos na guia Inserir > Módulo, e uma caixa branca se abrirá.
Por padrão ele terá o nome de “Módulo 1”.
Colocaremos a seguinte Function dentro dele:
Function meuFILTRO(matriz As Variant, incluir As Variant, Optional se_vazia As Variant) As Variant
Dim matrizAux() As Variant
ReDim matrizAux(1 To 1) 'Redimensionando a matriz auxiliar para ter 1 valor, o valor que está no elemento 1
i = 1 'Contador para guardar em qual elemento da matriz 'incluir' estamos
c = 0 'Quantos elementos temos na matrizAux (matriz resposta)
For Each celula In incluir
If matriz(i).Value = "" Then Exit For
If celula Then
ultElem = UBound(matrizAux)
If c > 0 Then ReDim Preserve matrizAux(1 To ultElem + 1)
matrizAux(c + 1) = matriz(i).Value
c = c + 1
End If
i = i + 1
Next
If c > 0 Then
matrizAux = Application.Transpose(matrizAux)
Else
If IsMissing(se_vazia) Then
matrizAux(1) = "Nenhum valor encontrado"
Else
matrizAux(1) = se_vazia
End If
End If
nLinhas = Application.Caller.Rows.Count
If nLinhas > 1 Then
ReDim novaMatriz(1 To nLinhas, 1 To 1)
ultElem = UBound(matrizAux)
For i = 1 To nLinhas
If i = 1 And c = 0 Then
novaMatriz(i, 1) = matrizAux(1)
ElseIf i <= ultElem Then
novaMatriz(i, 1) = matrizAux(i, 1)
Else
novaMatriz(i, 1) = vbNullString
End If
Next
matrizAux = novaMatriz
End If
meuFILTRO = matrizAux
End Function
Explicação do código acima:
- Declarar a função meuFILTRO, que vai receber os argumentos:
- “matriz”, “incluir” e “se_vazia”, que serão variáveis do tipo Variant, que pode receber qualquer tipo de dado
- Vale ressaltar o fato de que a variável “se_vazia” será um argumento opcional na Function. Ou seja, ele pode ser ou não utilizado
- A Function terá como resultado também informação do tipo Variant
- Para entender melhor sobre os tipos de dados no VBA, visite esse link oficial
- Dimensionar a variável “matrizAux” como uma variável do tipo Variant, que pode receber qualquer tipo de dado
- Redimensionar a variável “matrizAux” como uma matriz de 1 linha e 1 coluna, que terá um único valor
- Armazenar na variável “i”o valor 1. A variável “i” vai representar o contador para guardar em qual elemento da matriz ‘incluir’ estamos
- Armazenar na variável “c”o valor 0. A variável “c” vai representar quantos elementos temos na “matrizAux” (matriz resposta)
- Utilizar de uma estrutura de repetição do tipo For Each, onde a variável “celula” será a “parte” considerada do conjunto de “partes” dada pela variável “incluir”. A estrutura de repetição vai:
- Utilizar de uma estrutura If para verificar o valor do elemento “i” da variável “matriz” (primeiro argumento da Function). Se o elemento “i” da “matriz” for vazio, a estrutura de repetição For Each será abortada pela instrução de saída Exit Sub, e o código seguirá logo abaixo da estrutura For Each em questão
- Armazenar na variável “ultItem” o que for resultante da Função UBound, que vai retornar pra gente o enésimo (último) termo da matriz “matrizAux”
- Se o valor presenta na variável “c” for maior que do que 0 (a matriz tem elementos, ou seja, é não-nula), vamos redimensionar a “matrizAux” preservando sua forma inicial, mas agora colocando 1 elemento a mais nela (agora ela irá de 1 até 1 + ultElem)
- O elemento representado por “c + 1” vai receber o valor que está na matriz, no seu elemento representado por “i”. Ou seja, o último “novo” elemento da “matrizAux” vai receber o elemento da matriz de posição “anterior” a ele
- Somar 1 na variável “c”, que vai receber a quantidade anterior + 1
- Encerra-se essa condicional
- Percorre-se o intervalo de “celulas” do conjunto incluir fazendo as ações acima, e seguimos o código
- Se o valor presenta na variável “c” for maior que do que 0 (a matriz tem elementos, ou seja, é não-nula), as seguintes ações vão ocorrer:
- A “matrizAux” vai ser transposta completamente pela função Transpose
- Se o valor presente de “c” não for maior que 0 (matriz nula), vamos testar o seguinte argumento:
- a variável “se_vazia” está vazia? Se sim, a resposta para o 1º elemento da “matrizAux” será “Nenhum valor encontrado”. Essa é de fato a resposta padrão da função para nada ser encontrado no filtro
- a variável “se_vazia” NÃO está vazia (ou seja, está preenchida)? Se tem algo preenchido para essa variável, a resposta para o 1º elemento da “matrizAux” será o que estiver na própria variável “se_vazia”. Essa é de fato a resposta programada pelo usuário para nada ser encontrado no filtro
Até aqui, os passos são suficientes para a Function funcionar no Office 365. A partir daqui, se você não tem o Office 365, os passos são fundamentais, criando uma nova matriz para nos ajudar nessa elaboração da Function. Seguiremos:
- Vamos armazenar na variável “nLinhas” quantas linhas forem contadas e chamadas pela aplicação para colocar uma fórmula matricial
- Se nLinhas for maior do que 1, ou seja, tiver mais do que 1 linha de dados (ou seja, for uma fórmula matricial), vamos:
- Redimensionar a variável “novaMatriz” como uma matriz que vai de 1 até “nLinhas”, e 1 coluna apenas.
- Armazenar na variável “ultElem” o último termo válido dessa matriz
- Utilizar de uma estrutura de repetição do tipo For, que vai realizar as seguintes operações, da variável “i” sendo 1 até “nLinhas”:
- Se i = 1 (primeiro elemento) e c = 0 (a matriz contém apenas 1 elemento), vamos preencher o único elemento (1ª linha (dada por “i”) e 1ª coluna) da “novaMatriz” como o elemento 1 da “matrizAux”
- Se “i” < “ultElem” (ou seja, temos vários elementos e estamos no 1ª em questão pela estrutura de repetição), vamos preencher o elemento “i” (e coluna 1) da “novaMatriz” o correspondente para ela na “matrizAux” (de mesma linha i, e coluna 1). Enquanto essa condição for verdadeira, preencheremos os valores
- Caso “i” seja maior do que “ultElem” (ou seja, já preenchemos com sucesso (no tópico acima) todos os elementos da “matrizAux”, e o resto não deveria ter valor), vamos preencher o resto da “novaMatriz” com valor nulo (constante vbNullString)
- Encerra-se a estrutura de repetição
- Finalmente a “matrizAux” vai receber a “novaMatriz” antes de sairmos dessa condicional onde “nLinhas” seria maior que 1 (fundamental para versões anteriores ao Office 365)
- Por fim, a Function “meuFILTRO” vai receber o resultado da “matrizAux”, objeto de toda a estrutura de código explicada acima
- Se encerra a Funcion que gera a nossa matriz resposta.
Outros posts que podem te auxiliar em alguns temas:
- Para entender melhor sobre atribuição de objetos e variáveis, visite essa outro post.
- Para entender melhor sobre Function, visite um post que temos dedicado a esse tema.
- Para entender melhor sobre matrizes no VBA (Array no VBA), visite esse outro post.
- Para entender melhor sobre a estrutura For de repetição, visite esse post.
Utilizando a Function criada, teremos (exemplo: filtrando “RH”):
Conclusão – Função FILTRO sem Microsoft 365
Nessa aula você lidou com os seguintes conceitos:
- Tipos de dados no VBA
- Variáveis no VBA
- Estrutura de repetição do tipo For
- Function
- Matrizes
- Como criar função personalizada
- Como usar função FILTRO no Excel
- Função PROCX personalizada
Até o próximo post! Fique ligado no nosso canal do Youtube para mais conteúdo de VBA! Um abraço!
Hashtag Treinamentos
Para acessar outras publicações de VBA, clique aqui!
Quer aprender mais sobre VBA com um Minicurso Gratuito?
Expert em VBA e Power BI da Hashtag Treinamentos. Auxilia no suporte aos alunos da Hashtag Treinamentos e na criação de conteúdos para os que acompanham nossos canais.