Número por Extenso no Excel: Como Criar uma Função Personalizada

Você já precisou preencher um cheque, um recibo ou um contrato e teve que escrever manualmente “trezentos e quarenta e dois reais” ao lado do número 342, torcendo pra não errar a concordância? Ou foi procurar uma função pronta no Excel pra fazer essa conversão e descobriu que ela simplesmente não existe?

Diferente de SOMA ou MÉDIA, converter número em texto por extenso não é uma operação matemática — é uma regra de idioma, cheia de exceções: “cem” em vez de “cento” quando o número é exatamente 100, “um real” no singular mas “dois reais” no plural, o “e” que aparece entre certas partes do número e não aparece em outras. Por isso o Excel nunca teve isso pronto: não existe uma fórmula nativa de uma linha só que resolva esse tipo de regra de idioma.

Neste artigo vamos mostrar como resolver isso com uma função personalizada em VBA, o caminho mais confiável para esse problema, com um código verificado que você pode adaptar.

Por que isso exige VBA (ou uma fórmula bem complexa)

Fórmulas de planilha são ótimas para cálculo, mas ruins para esse tipo de lógica condicional em cascata — dezenas de “SE” aninhados, tratando cada faixa de número de um jeito. Existem soluções feitas só com fórmulas (usando LAMBDA e LET no Excel 365), mas elas ficam extensas e difíceis de entender ou ajustar depois. Uma função personalizada em VBA, por outro lado, é código organizado, fácil de revisar e de estender.

DOMINE EXCEL COMIGO

QUERO APRENDER EXCEL

Criando a função personalizada

Abra o Editor VBA com Alt+F11, vá em Inserir > Módulo, e cole o código abaixo — uma função que converte números de 0 a 999 por extenso, o bloco fundamental sobre o qual dá para construir versões maiores:

Function Extenso999(ByVal n As Integer) As String
    Dim unidades As Variant, dez19 As Variant, dezenas As Variant, centenas As Variant
    unidades = Array("zero","um","dois","três","quatro","cinco","seis","sete","oito","nove")
    dez19 = Array("dez","onze","doze","treze","quatorze","quinze","dezesseis","dezessete","dezoito","dezenove")
    dezenas = Array("","dez","vinte","trinta","quarenta","cinquenta","sessenta","setenta","oitenta","noventa")
    centenas = Array("","cento","duzentos","trezentos","quatrocentos","quinhentos","seiscentos","setecentos","oitocentos","novecentos")

    If n = 0 Then
        Extenso999 = "zero"
        Exit Function
    End If

    Dim h As Integer, resto As Integer
    h = n \ 100
    resto = n Mod 100

    Dim partes As String
    partes = ""

    If h > 0 Then
        If h = 1 And resto = 0 Then
            partes = "cem"
        Else
            partes = centenas(h)
        End If
    End If

    If resto > 0 Then
        Dim parteResto As String
        If resto < 10 Then
            parteResto = unidades(resto)
        ElseIf resto < 20 Then
            parteResto = dez19(resto - 10)
        Else
            Dim d As Integer, u As Integer
            d = resto \ 10
            u = resto Mod 10
            If u > 0 Then
                parteResto = dezenas(d) & " e " & unidades(u)
            Else
                parteResto = dezenas(d)
            End If
        End If

        If partes <> "" Then
            partes = partes & " e " & parteResto
        Else
            partes = parteResto
        End If
    End If

    Extenso999 = partes
End Function

Depois de salvo, feche o editor e use como qualquer outra função, direto em uma célula:

=Extenso999(A1)

Tabela com números convertidos por extenso usando a função personalizada

Testando os casos que costumam quebrar

Vale testar especificamente os casos que mais geram erro em implementações apressadas: 100 (deve dar “cem”, não “cento”), números como 101 (“cento e um”), dezenas exatas como 120 (“cento e vinte”, sem “e” sobrando no final), e 999 (“novecentos e noventa e nove”). O código acima já trata esses casos corretamente.

Estendendo para milhares e para moeda

O código mostrado cobre até 999 — a base sobre a qual se constrói o resto. Para milhares, milhões e para formatar como valor em reais (com a regra de “um real” no singular e “dois reais” no plural, mais os centavos), a função precisa ficar consideravelmente maior, repetindo a mesma lógica para cada grandeza (milhar, milhão) e tratando a concordância de “real/reais” separadamente da conversão do número em si. Como esse código completo passa de duzentas linhas, vale buscar um template já pronto e testado especificamente para cheques e contratos — sites como Guia do Excel e Excel do Seu Jeito têm versões completas com essa funcionalidade, incluindo o tratamento de moeda.

VBA vs fórmula pura (LAMBDA)

✅ VBA é mais fácil de ler, testar e ajustar depois, principalmente para uma lógica com tantos casos especiais
❌ Se você não pode usar VBA no seu ambiente (por política de segurança da empresa, por exemplo, que bloqueia macros), a alternativa é uma fórmula LAMBDA — mais complexa de montar, mas que funciona sem habilitar macro nenhuma

Deixando a função disponível em todas as suas planilhas

Por padrão, uma função criada em VBA só funciona dentro do arquivo onde o código foi colado. Para usá-la em qualquer pasta de trabalho aberta no seu computador, sem copiar o código de novo toda vez, salve o módulo como um suplemento (Arquivo > Salvar Como > Suplemento do Excel, formato .xlam) e ative-o pela tela de Suplementos do Excel — o mesmo processo usado para ativar o Solver ou as Ferramentas de Análise. Depois disso, a função Extenso999 fica disponível em qualquer planilha aberta, sem precisar reabrir o editor VBA ou colar o código de novo.

Erro comum

O erro mais comum é esquecer de salvar o arquivo como .xlsm (pasta de trabalho habilitada para macro) em vez do .xlsx padrão — sem isso, o código VBA se perde ao fechar e reabrir o arquivo. Outro erro comum é copiar código de número por extenso da internet sem testar os casos de borda (100, números com dezena exata, números com zero no meio) — muita implementação encontrada por aí tem esses casos quebrados.

Disponibilidade

Funções personalizadas em VBA funcionam no Excel para Windows (365, 2021, 2019 e anteriores) e no Excel para Mac. Não funcionam no Excel Online, que não suporta VBA. O Google Sheets tem um recurso equivalente usando Apps Script, com uma linguagem e sintaxe diferentes.

Compartilhe ou Comente

Se você curtiu esse artigo aonde mostramos como criar uma função personalizada para escrever números por extenso no Excel, 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ê precisa disso para cheque, contrato, ou outro documento? Vai testar o código para estender até milhares e moeda? 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 *