Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Usando Funções Internas | Fundamentos de VBA
VBA do Excel para Automação Empresarial

Usando Funções Internas

Deslize para mostrar o menu

O VBA vem com várias centenas de funções integradas, e você provavelmente nunca usará a maioria delas. As funções abaixo aparecem com frequência em automação de negócios — limpeza de texto, manipulação de datas e conversão de tipos.

Funções de Data

Debug.Print Now()                    ' current date and time
Debug.Print Date                     ' today's date only
Debug.Print DateAdd("d", 30, Date)   ' 30 days from today
Debug.Print DateDiff("d", #01/09/2023#, Date)  ' days since hire date
Debug.Print Format(Date, "dd/mm/yyyy")

Now() e Date parecem semelhantes, mas respondem a perguntas diferentes — Now() inclui a hora atual até o segundo (útil para registrar quando uma macro foi executada), enquanto Date retorna apenas o dia do calendário, que é o ideal para tudo que envolve prazos ou idades. DateAdd e DateDiff são funções complementares: DateAdd projeta uma data para frente ou para trás por uma unidade específica ("d" para dias, mas "m" para meses e "yyyy" para anos também funcionam), enquanto DateDiff mede o intervalo entre duas datas existentes.

Note
Nota

Literais de data no VBA — qualquer coisa escrita entre símbolos #, como #01/09/2023# — sempre usam a ordem MM/DD/YYYY internamente, independentemente das configurações regionais do Windows ou do sistema. Portanto, #01/09/2023# significa 9 de janeiro de 2023, não 1º de setembro, mesmo para quem utiliza o formato DD/MM/YYYY no dia a dia. Isso é diferente de como as datas são digitadas em células de planilha, onde as configurações regionais se aplicam — o formato literal #...# é uma regra específica do VBA que permanece fixa, não importa onde o código seja executado.

Funções de Texto

Debug.Print UCase("wireless mouse")     ' WIRELESS MOUSE
Debug.Print LCase("WIRELESS MOUSE")     ' wireless mouse
Debug.Print Left("P001", 1)             ' P
Debug.Print Right("P001", 3)            ' 001
Debug.Print Mid("P001", 2, 3)           ' 001
Debug.Print Trim("  Keyboard  ")        ' Keyboard
Debug.Print Len("Laptop Stand")         ' 12
Debug.Print InStr("Wireless Mouse", "Mouse")  ' 10 (position found)

UCase e LCase são usadas para tornar comparações insensíveis a maiúsculas e minúsculas, por exemplo, If UCase(category) = UCase("electronics") Then funciona independentemente de como a categoria foi digitada originalmente. Left, Right e Mid extraem partes de uma string, diferindo apenas no ponto de início: Left e Right contam a partir das extremidades, enquanto Mid recebe uma posição inicial e um comprimento, por isso Mid("P001", 2, 3) e Right("P001", 3) retornam o mesmo resultado aqui — "P001" só tem um caractere de prefixo, então "a partir da posição 2" e "os últimos 3 caracteres" resultam na mesma substring. Trim remove silenciosamente espaços no início e no fim — uma função simples que salva tempo quando dados foram copiados de fontes com espaçamento inconsistente. InStr procura uma string dentro de outra e retorna a posição onde foi encontrada (ou 0 se não encontrar), o que permite testar "este nome de produto contém a palavra Mouse?" sem exigir correspondência exata.

Funções Numéricas

Debug.Print Round(24.996, 2)   ' 25
Debug.Print Abs(-15)           ' 15
Debug.Print Int(7.9)           ' 7

Round e Int reduzem um número, mas de formas diferentes — Round(24.996, 2) arredonda para o valor mais próximo com 2 casas decimais (25,00, exibido como 25), enquanto Int(7.9) sempre trunca para baixo em direção a zero, independentemente de quão próximo o decimal esteja de arredondar para cima, retornando 7 em vez de 8. Confundir essas funções é uma fonte comum de erros em preços: arredondar um valor para o centavo mais próximo deve quase sempre usar Round, não Int, ou você acabará cobrando menos do que deveria em cada transação.

Conversão de Tipos

Essencial ao extrair valores de uma planilha, já que os valores das células geralmente chegam como Variant:

Dim priceText As String
priceText = "39.50"
Dim price As Double
price = CDbl(priceText)     ' text → number
 
Dim stockValue As Variant
stockValue = "44"
Dim stockCount As Integer
stockCount = CInt(stockValue)

CDbl converte para Double, CInt para Integer, CStr converte para String e CDate converte para um valor de Date propriamente dito.

Por que não deixar o VBA converter automaticamente quando necessário? Ele geralmente faz isso, mas confiar nisso é arriscado: uma célula que parece um número, mas foi digitada ou importada como texto, pode fazer uma comparação If ou uma operação aritmética falhar ou se comportar de forma inesperada, e a conversão explícita identifica o problema cedo, com erro exatamente na linha onde o dado ruim está, em vez de três etapas depois.

Tarefa

  1. Escrever uma linha que extraia apenas a parte numérica de "P003" usando Mid (dica: comece na posição 2).
  2. Escrever uma linha que converta esse texto extraído em um número real com CInt ou CLng.
  3. Usar DateDiff para calcular quantos dias atrás Emma Davis foi contratada (15/03/2020) em relação a hoje.
Dica
expand arrow

1. Extraindo a parte numérica

  • Mid recebe três elementos: a própria string, onde começar a contar e quantos caracteres pegar.
  • "P003" tem uma letra seguida de três dígitos — é necessário pular o "P" e pegar tudo depois dele.
  • A posição inicial 2 significa "começar no 2º caractere" — conte "P003" nos dedos para confirmar que a posição 2 é o primeiro "0".

2. Convertendo para um número real

  • O que Mid retorna ainda é texto, mesmo que pareça um número.
  • Envolva toda a expressão Mid(...) dentro de CInt(...) ou CLng(...) — você está convertendo o resultado de uma função usando outra.
  • Lembrete do início do capítulo: CInt/CLng convertem texto em número inteiro; use CLng se não tiver certeza se o número pode ser grande.

3. Dias desde a data de contratação

  • DateDiff precisa de três coisas: qual unidade medir ("d" para dias), uma data inicial e uma data final.
  • O detalhe está em escrever uma data literal no VBA — coloque entre símbolos #, como #03/15/2020#. Dentro de #...#, o VBA sempre espera o formato mês/dia/ano, independentemente das configurações regionais — então 15 de março é #03/15/2020#, não #15/03/2020#.
  • Para "hoje", não é necessário digitar uma data — existe uma palavra-chave da seção 2.3 que sempre retorna a data atual.
  • Coloque essas duas datas no DateDiff na ordem correta — a data mais antiga primeiro — ou o resultado será um número negativo.
Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 3

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Seção 2. Capítulo 3
some-alt