Blog

Postado em em 2 de julho de 2022

Função FILTRO sem Microsoft 365 – Funções Personalizadas no Excel

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á.

Função FILTRO sem Microsoft 365

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:

Utilizando a Function criada, teremos (exemplo: filtrando “RH”):

Função FILTRO sem Microsoft 365

Conclusão – Função FILTRO sem Microsoft 365

Nessa aula você lidou com os seguintes conceitos:

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?


Quer sair do zero no Python e virar uma referência na sua empresa? Inscreva-se agora mesmo no Python Impressionador