Precisa que a planilha seja exportada para PDF exatamente na mesma pasta do arquivo do Excel? Neste guia prático em VBA, você aprende a corrigir o envio para “Documentos”, tornar o processo robusto no Windows e no macOS e evitar armadilhas como nomes inválidos e sobrescritas.
Contexto e por que o PDF vai parar em “Documentos”
Ao usar ActiveSheet.ExportAsFixedFormat
apenas com o nome do arquivo (sem caminho completo), o Excel salva o PDF na pasta padrão do usuário (geralmente “Documentos”). Para garantir que o PDF seja criado ao lado do seu workbook, é imprescindível montar o caminho completo e informá-lo no parâmetro Filename
.
Solução direta e rápida
Se você só precisa resolver o problema imediato — salvar a planilha ativa como PDF na mesma pasta do arquivo de Excel — este macro minimalista basta:
Sub SaveAsPDF()
Dim saveLocation As String
saveLocation = ActiveWorkbook.Path & "\" & Range("B1").Value & ".pdf"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=saveLocation
End Sub
ActiveWorkbook.Path
devolve a pasta onde o arquivo atual do Excel está salvo.- Concatena-se uma barra invertida (
\
), o nome desejado (emB1
) e a extensão.pdf
. - Esse caminho completo vai para
Filename
. Resultado: o PDF nasce no mesmo local do workbook.
Entendendo cada parte do código
ActiveWorkbook, ThisWorkbook e a escolha correta
ActiveWorkbook é o arquivo atualmente ativo na janela do Excel. ThisWorkbook é o arquivo onde o código está gravado. Se o seu macro estiver em um suplemento (add-in) ou em um arquivo diferente do que você quer exportar, use ThisWorkbook.Path
para referir-se ao caminho do arquivo do código, e ActiveWorkbook.Path
para o caminho do arquivo em uso. A maioria dos cenários de “exportar a planilha aberta” funciona bem com ActiveWorkbook.Path
.
Por que usar caminho completo
Sem um caminho absoluto, o Excel escolhe a pasta padrão do usuário. Ao preencher Filename
com Caminho + Separador + Nome + extensão
, você elimina a ambiguidade e obriga o Excel a salvar onde você quer.
Versão robusta pronta para produção
A seguir, uma versão aprimorada que:
- funciona no Windows e no macOS (usa
Application.PathSeparator
), - aceita o nome do arquivo em
B1
ou usa o nome da planilha como reserva, - impede duplicação de
.pdf
e remove caracteres inválidos, - contorna o caso do workbook ainda não salvo (pede local ao usuário),
- evita sobrescrever um PDF existente (gera
nome (1).pdf
,nome (2).pdf
…), - permite configurar qualidade e respeito às áreas de impressão.
Option Explicit
Sub SaveActiveSheetAsPDF_Robusto()
On Error GoTo TrateErro
```
Dim baseName As String
Dim wbPath As String
Dim sep As String
Dim pdfPath As String
Dim ask As Variant
Application.ScreenUpdating = False
sep = Application.PathSeparator ' "\" no Windows, ":" no macOS antigo
wbPath = ActiveWorkbook.Path ' pasta do arquivo aberto
' Nome base em B1; se vazio, usa o nome da planilha
baseName = Trim$(CStr(ActiveSheet.Range("B1").Value))
If Len(baseName) = 0 Then baseName = ActiveSheet.Name
' Remove extensões duplicadas e caracteres inválidos
baseName = SanitizeFileName(baseName, "pdf")
If wbPath = "" Then
' Workbook novo / nunca salvo: peça ao usuário o local do PDF
ask = Application.GetSaveAsFilename( _
InitialFileName:=baseName & ".pdf", _
fileFilter:="PDF Files (*.pdf), *.pdf")
If ask = False Then GoTo Saia
pdfPath = CStr(ask)
Else
pdfPath = wbPath & sep & baseName & ".pdf"
pdfPath = EnsureUniqueFileName(pdfPath) ' evita sobrescrever
End If
' Exporte a planilha ativa como PDF
With ActiveSheet
.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=pdfPath, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
End With
MsgBox "PDF gerado em:" & vbCrLf & pdfPath, vbInformation, "Exportar para PDF"
```
Saia:
Application.ScreenUpdating = True
Exit Sub
TrateErro:
Application.ScreenUpdating = True
MsgBox "Falha ao exportar para PDF:" & vbCrLf & Err.Number & " - " & Err.Description, vbExclamation
End Sub
Private Function SanitizeFileName(ByVal name As String, Optional ByVal ext As String = "pdf") As String
' Remove extensão duplicada e caracteres inválidos para nome de arquivo seguro
Dim invalid As Variant, i As Long
```
' Remove ".pdf" final (independente de maiúsc./minúsc.)
If LCase$(Right$(name, Len(ext) + 1)) = "." & LCase$(ext) Then
name = Left$(name, Len(name) - (Len(ext) + 1))
End If
invalid = Array("/", "\", ":", "*", "?", """", "<", ">", "|")
For i = LBound(invalid) To UBound(invalid)
name = Replace$(name, invalid(i), " ")
Next i
' Espaços extras / pontos finais não são recomendados em Windows
name = Trim$(name)
Do While Right$(name, 1) = "."
name = Left$(name, Len(name) - 1)
Loop
If Len(name) = 0 Then name = "Arquivo"
SanitizeFileName = name
```
End Function
Private Function EnsureUniqueFileName(ByVal fullPath As String) As String
' Se o arquivo já existir, cria "nome (1).pdf", "nome (2).pdf", etc.
Dim sep As String, pos As Long, folder As String
Dim f As String, p As Long, base As String, extension As String
Dim n As Long, candidate As String
```
sep = Application.PathSeparator
pos = InStrRev(fullPath, sep)
If pos = 0 Then
EnsureUniqueFileName = fullPath
Exit Function
End If
folder = Left$(fullPath, pos - 1)
f = Mid$(fullPath, pos + 1)
p = InStrRev(f, ".")
If p > 0 Then
base = Left$(f, p - 1)
extension = Mid$(f, p) ' inclui o ponto
Else
base = f
extension = ""
End If
candidate = fullPath
Do While Dir$(candidate) <> ""
n = n + 1
candidate = folder & sep & base & " (" & n & ")" & extension
Loop
EnsureUniqueFileName = candidate
```
End Function
Explicando as escolhas do macro robusto
Application.PathSeparator
garante portabilidade (Windows usa\
; no macOS antigo,:
). Assim, o mesmo código funciona bem em ambos os sistemas.- Higienização do nome: remover caracteres inválidos elimina erros do sistema de arquivos e evita PDFs com nomes instáveis.
- Prevenção de sobrescrita: ao detectar um PDF existente, a função cria variantes numeradas.
- Fallback para workbook não salvo: se
ActiveWorkbook.Path
estiver vazio, o usuário escolhe onde salvar viaGetSaveAsFilename
. - Parâmetros do
ExportAsFixedFormat
ajustados para boa qualidade, preservando propriedades do documento e respeitando áreas de impressão definidas.
Tratando o workbook ainda não salvo
Se a pasta do arquivo ainda não existe (porque o arquivo nunca foi salvo), use um teste e peça ao usuário o local de destino:
If ActiveWorkbook.Path = "" Then
Dim v As Variant
v = Application.GetSaveAsFilename(Range("B1").Value & ".pdf", "PDF Files (.pdf), .pdf")
If v = False Then Exit Sub ' usuário cancelou
saveLocation = CStr(v)
Else
saveLocation = ActiveWorkbook.Path & Application.PathSeparator & Range("B1").Value & ".pdf"
End If
Evite confusão entre ActiveWorkbook e ThisWorkbook
Se o macro estiver em um suplemento ou em um arquivo diferente do que você deseja exportar, não use ActiveWorkbook.Path
às cegas. Algumas combinações comuns:
Situação | Recomendação | Observação |
---|---|---|
Macro dentro do próprio arquivo a exportar | ActiveWorkbook.Path | É o caso mais comum. |
Macro em suplemento (.xlam) exporta outro arquivo | ThisWorkbook.Path ou ActiveWorkbook.Path conforme o alvo | Escolha o caminho do arquivo que realmente será exportado. |
Janela com vários workbooks abertos | ActiveWorkbook.Path | Certifique-se de que o workbook certo está ativo. |
Garanta extensões corretas
Usuários às vezes digitam .pdf
em B1
. Para evitar nome.pdf.pdf
, limpe o texto e remova extensões duplicadas — como feito em SanitizeFileName
. Se preferir algo mais enxuto:
Dim s As String
s = CStr(Range("B1").Value)
If LCase$(Right$(s, 4)) = ".pdf" Then s = Left$(s, Len(s) - 4)
Opções úteis do ExportAsFixedFormat
Você pode refinar o comportamento da exportação passando parâmetros adicionais. Veja os principais:
Parâmetro | O que faz | Valores comuns | Recomendação |
---|---|---|---|
Type | Define o formato | xlTypePDF ou xlTypeXPS | Use xlTypePDF para compatibilidade ampla. |
Quality | Qualidade do PDF | xlQualityStandard , xlQualityMinimum | Padrão atende à maioria dos cenários. |
IncludeDocProperties | Insere propriedades do arquivo | True / False | Deixe True se você usa metadados. |
IgnorePrintAreas | Desconsidera as áreas de impressão | True / False | Mantenha False para respeitar o layout definido. |
OpenAfterPublish | Abre o PDF após gerar | True / False | Defina True se quiser validar visualmente. |
Preparando a página para caber bem no PDF
Se o PDF sai “quebrado” ou com a escala errada, ajuste o Page Setup da planilha antes de exportar:
With ActiveSheet.PageSetup
.Orientation = xlPortrait
.Zoom = False ' Desliga o zoom para usar FitToPages
.FitToPagesWide = 1
.FitToPagesTall = False ' Quantas páginas na vertical (False = automático)
.CenterHorizontally = True
.CenterVertically = False
.LeftMargin = Application.InchesToPoints(0.5)
.RightMargin = Application.InchesToPoints(0.5)
.TopMargin = Application.InchesToPoints(0.5)
.BottomMargin = Application.InchesToPoints(0.5)
End With
Variações úteis para o dia a dia
Exportar apenas um intervalo específico
ActiveSheet.PageSetup.PrintArea = "$A$1:$H$40"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=pdfPath, IgnorePrintAreas:=False
Exportar várias planilhas em um único PDF
Sheets(Array("Resumo", "Dados", "Gráficos")).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath
ActiveSheet.Select ' volta para seleção simples
Adicionar carimbo de data ao nome do arquivo
Dim stamp As String
stamp = Format(Now, "yyyymmdd_hhnnss")
baseName = baseName & "_" & stamp
Guia de implementação para o usuário final
- Abra o Editor do VBA (ALT + F11 no Windows, ⌥ Option + F11 no Mac).
- Insira um Module em VBAProject → Insert → Module.
- Cole um dos códigos acima (versão simples ou robusta).
- Na planilha, coloque o nome desejado do PDF em B1 (ou ajuste o código para outra célula).
- Execute o macro (F5) ou atribua-o a um botão na planilha.
Erros comuns e como resolver
Sintoma | Causa provável | Como corrigir |
---|---|---|
PDF salvo em “Documentos” | Filename foi definido sem caminho completo | Monte ActiveWorkbook.Path & Separador & Nome & ".pdf" . |
Erro de permissão | Pasta protegida ou sem acesso | Escolha outra pasta via GetSaveAsFilename ou obtenha permissão. |
Nome de arquivo inválido | Caracteres / \ : * ? " < > | no texto | Sanitize o nome (veja SanitizeFileName ). |
Sobrescrita indesejada | Arquivo existente com mesmo nome | Use EnsureUniqueFileName para numerar automaticamente. |
Exporta “tudo” em vez do intervalo | IgnorePrintAreas = True | Defina IgnorePrintAreas = False e ajuste PrintArea . |
FAQ rápido
Funciona no Mac? Sim. Use Application.PathSeparator
como no exemplo robusto para que o caminho seja montado corretamente em qualquer sistema.
Preciso instalar algo para gerar PDF? Não. O Excel moderno já inclui o recurso de exportação para PDF via ExportAsFixedFormat
.
Posso salvar em uma subpasta da pasta do arquivo? Pode. Monte o caminho com a subpasta e crie-a, se necessário. Exemplo:
Dim targetFolder As String
targetFolder = ActiveWorkbook.Path & Application.PathSeparator & "PDFs"
If Dir(targetFolder, vbDirectory) = "" Then MkDir targetFolder
pdfPath = targetFolder & Application.PathSeparator & baseName & ".pdf"
Como garantir que o PDF abra automaticamente ao final? Defina OpenAfterPublish:=True
no ExportAsFixedFormat
.
O que usar quando o arquivo nunca foi salvo? Chame Application.GetSaveAsFilename
para o usuário escolher a pasta e o nome (o exemplo robusto já faz isso).
Checklist de boas práticas
- Prefira caminho absoluto em
Filename
. - Use
Application.PathSeparator
para portabilidade. - Limpe o nome do arquivo e elimine extensões duplicadas.
- Evite sobrescrever com um verificador de existência.
- Ajuste Page Setup para um PDF com aparência profissional.
- Respeite PrintArea quando necessário (
IgnorePrintAreas:=False
).
Resumo final
O segredo para salvar o PDF na mesma pasta do Excel é simples: montar o caminho completo e passá-lo em ExportAsFixedFormat
. Com as melhorias sugeridas — separador portátil, higienização do nome, prevenção de sobrescrita, tratamento para arquivo não salvo e ajustes de layout — você terá uma automação confiável, repetível e amiga do usuário, independentemente de quem executa o processo e de onde o arquivo está armazenado.