Como Criar uma Função Personalizada (UDF) em VBA no Excel

Para criar uma função personalizada (UDF, de User Defined Function) em VBA, abra o editor VBA (Alt+F11), insira um módulo e escreva um bloco Function NomeDaFuncao(parametros) As TipoDeRetorno ... End Function — o valor atribuído ao nome da função dentro do código é o que aparece na planilha quando você usa a função como qualquer outra fórmula do Excel.

Você já se deparou com um cálculo repetitivo que o Excel não tem pronto — uma regra de comissão com faixas diferentes, um cálculo específico do seu negócio — e teve que montar uma fórmula gigante, cheia de SE aninhados, só para reaproveitar em várias planilhas depois?

O problema dessas fórmulas longas é que elas ficam difíceis de entender e de manter: se a regra de cálculo mudar, você precisa localizar e editar a fórmula em cada célula onde ela foi copiada, correndo o risco de esquecer alguma e deixar dados desatualizados misturados com dados corretos.

Neste artigo iremos mostrar como criar sua própria função personalizada em VBA, com um exemplo completo de uma função de cálculo de comissão por faixas de valor, e explicar as regras básicas que toda função VBA (UDF) precisa seguir.

DOMINE EXCEL COMIGO

QUERO APRENDER EXCEL

Function x Sub: a diferença que importa para criar uma UDF

O VBA tem dois tipos principais de procedimento: Sub, que executa uma ação (uma macro comum, sem retornar valor para a planilha) e Function, que recebe parâmetros, processa algo e retorna um valor — é esse retorno que faz a Function poder ser usada como uma fórmula em qualquer célula da planilha, exatamente como o SOMA ou o PROCV.

A estrutura básica de uma função personalizada é:

Function NomeDaFuncao(parametro1 As Tipo, parametro2 As Tipo) As TipoDeRetorno
    ' código que calcula o resultado
    NomeDaFuncao = resultado
End Function

Repare que o valor de retorno é atribuído ao próprio nome da função, dentro do código — não existe um comando “return” separado como em outras linguagens. Tudo o que for atribuído a NomeDaFuncao antes do End Function é o que aparece na célula onde a função for usada.

Onde escrever o código: módulo, não na planilha

Para criar a função, pressione Alt+F11 para abrir o editor VBA, clique com o botão direito no projeto da sua pasta de trabalho no Explorador de Projetos, escolha Inserir > Módulo, e escreva o código da função na área em branco que aparece. Funções escritas dentro de um módulo comum (diferente do código de uma planilha ou do ThisWorkbook) ficam disponíveis para uso em qualquer célula da pasta de trabalho, com o mesmo nome usado no código.

Depois de salvar (é preciso salvar o arquivo com extensão .xlsm, já que arquivos .xlsx comuns não guardam código VBA), a função aparece disponível para uso normal nas células, com autocompletar inclusive, assim como qualquer fórmula nativa.

Exemplo prático: uma função de comissão por faixas de valor

Imagine uma regra de comissão de vendas onde a taxa aumenta conforme o valor vendido: 5% para vendas até R$ 10.000, 8% para vendas entre R$ 10.000,01 e R$ 30.000, e 12% para vendas acima de R$ 30.000. Fazer isso com fórmula nativa exigiria um SE aninhado como =SE(A2<=10000;A2*0,05;SE(A2<=30000;A2*0,08;A2*0,12)) — funciona, mas fica difícil de ler e de ajustar se as faixas mudarem.

Com uma função personalizada, a mesma regra fica encapsulada e reaproveitável em uma linha de fórmula. O código da função, escrito no módulo VBA:

Function Comissao(valorVenda As Double) As Double
    Select Case valorVenda
        Case Is <= 10000
            Comissao = valorVenda * 0.05
        Case Is <= 30000
            Comissao = valorVenda * 0.08
        Case Else
            Comissao = valorVenda * 0.12
    End Select
End Function

Depois de salvo, basta usar =Comissao(A2) em qualquer célula, passando o valor da venda como argumento. Veja o resultado com alguns valores de exemplo:

Vendedor Valor da Venda Fórmula Comissão
Ana R$ 8.000,00 =Comissao(B2) R$ 400,00
Bruno R$ 22.000,00 =Comissao(B3) R$ 1.760,00
Carla R$ 45.000,00 =Comissao(B4) R$ 5.400,00

Se a regra de faixas mudar no futuro, basta editar o código da função uma única vez no editor VBA — todas as células que usam =Comissao(...) recalculam automaticamente com a nova regra, sem precisar localizar e editar cada fórmula espalhada pela planilha.

Parâmetros opcionais e argumentos por valor

Assim como fórmulas nativas do Excel têm argumentos opcionais (como o terceiro argumento do PROCV), uma UDF também pode ter parâmetros opcionais, usando a palavra Optional e um valor padrão. O exemplo abaixo adiciona uma taxa extra opcional, que só é aplicada se o usuário informar esse segundo argumento:

Function Comissao(valorVenda As Double, Optional taxaExtra As Double = 0) As Double
    Dim base As Double
    Select Case valorVenda
        Case Is <= 10000
            base = valorVenda * 0.05
        Case Is <= 30000
            base = valorVenda * 0.08
        Case Else
            base = valorVenda * 0.12
    End Select
    Comissao = base + (valorVenda * taxaExtra)
End Function

Com essa versão, =Comissao(A2) continua funcionando exatamente como antes, mas agora também é possível usar =Comissao(A2;0,02) para somar 2% de taxa extra apenas nos casos em que isso for necessário.

Regras e limitações importantes de uma UDF

Uma função personalizada usada como fórmula de planilha tem uma limitação importante em relação a uma macro comum (Sub): ela não pode alterar o conteúdo ou a formatação de outras células, mover a seleção, exibir uma caixa de mensagem (MsgBox) ou executar qualquer ação que modifique o Excel além de calcular e devolver um valor para a própria célula onde foi digitada. Isso existe porque o Excel pode recalcular fórmulas em momentos e ordens que o próprio VBA não controla, e permitir que uma função “de fórmula” alterasse outras partes da planilha livremente causaria comportamento imprevisível.

Outro ponto de atenção: por padrão, uma UDF só recalcula quando algum dos argumentos passados para ela muda (assim como as fórmulas nativas). Se sua função depender de algo externo aos argumentos — como a hora atual ou o conteúdo de outra célula não passada como parâmetro —, é preciso declará-la como volátil com Application.Volatile logo no início do código, para forçar o recálculo a cada vez que a planilha inteira recalcula.

Disponibilidade

Funções personalizadas (UDF) em VBA estão disponíveis no Excel para Windows a partir da versão 2007, incluindo 2010, 2013, 2016, 2019, 2021 e Excel 365, e também no Excel para Mac. O arquivo precisa ser salvo em formato .xlsm ou .xlsb para preservar o código. O Excel Online não executa macros VBA, então uma UDF criada dessa forma não funciona na versão web. Como alternativa moderna sem VBA, o Excel 365 tem a função LAMBDA, que permite criar funções personalizadas nativas, inclusive nomeadas via Gerenciador de Nomes, funcionando também no Excel Online. O Google Sheets tem seu próprio recurso equivalente, funções personalizadas em Apps Script, com sintaxe baseada em JavaScript.

Perguntas frequentes

Por que minha função personalizada não aparece na lista de fórmulas do Excel?

O motivo mais comum é o arquivo estar salvo como .xlsx em vez de .xlsm — esse formato não guarda código VBA, então a função é perdida ao salvar e reabrir. Salve o arquivo como “Pasta de Trabalho Habilitada para Macro do Excel (*.xlsm)” pelo menu Arquivo > Salvar Como.

Uma função personalizada pode formatar a célula onde o resultado aparece, como mudar a cor de fundo?

Não diretamente. Uma UDF usada como fórmula só pode calcular e retornar um valor para a própria célula, sem alterar formatação, cor ou conteúdo de outras células. Para aplicar formatação condicionada ao resultado, combine a UDF com a Formatação Condicional do Excel usando fórmula, em vez de tentar formatar dentro do código VBA da função.

Qual a diferença entre criar uma UDF em VBA e usar a função LAMBDA do Excel 365?

A UDF em VBA funciona em qualquer versão do Excel desde 2007, mas exige salvar o arquivo com macros habilitadas (.xlsm) e não funciona no Excel Online. A LAMBDA é nativa do Excel 365, não precisa de VBA nem de macros habilitadas, e funciona também na versão web, mas só está disponível em assinaturas do Microsoft 365.

Veja também: Como Acessar o Editor VBA no Excel e Inserir um Módulo (o primeiro passo antes de criar qualquer função) e Como Criar uma Função Personalizada em VBA para Contar Células Coloridas no Excel (aquele artigo foca num exemplo específico, contar células por cor; este aqui explica as regras gerais de sintaxe e limitações de qualquer UDF, usando uma função de comissão por faixas como exemplo).

Compartilhe ou Comente

Se você curtiu esse artigo aonde mostramos como criar sua própria função personalizada (UDF) em VBA, usando a estrutura Function…End Function, com um exemplo completo de comissão calculada por faixas de valor, compartilhe com as suas redes sociais e não se esqueça de deixar um comentário aqui embaixo caso você tenha ficado com alguma dúvida.

Você já teve uma fórmula gigante de SE aninhados que poderia virar uma função personalizada? Que tipo de cálculo do seu trabalho você transformaria numa UDF? Conta para nós nos comentários!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *