Salvar PDF na mesma pasta do Excel com VBA (ExportAsFixedFormat)

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.

Índice

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 (em B1) 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 &gt; 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) &lt;&gt; ""
    n = n + 1
    candidate = folder &amp; sep &amp; base &amp; " (" &amp; n &amp; ")" &amp; 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 via GetSaveAsFilename.
  • 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 &amp; ".pdf", "PDF Files (.pdf), .pdf")
    If v = False Then Exit Sub             ' usuário cancelou
    saveLocation = CStr(v)
Else
    saveLocation = ActiveWorkbook.Path &amp; Application.PathSeparator &amp; Range("B1").Value &amp; ".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çãoRecomendaçãoObservação
Macro dentro do próprio arquivo a exportarActiveWorkbook.PathÉ o caso mais comum.
Macro em suplemento (.xlam) exporta outro arquivoThisWorkbook.Path ou ActiveWorkbook.Path conforme o alvoEscolha o caminho do arquivo que realmente será exportado.
Janela com vários workbooks abertosActiveWorkbook.PathCertifique-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âmetroO que fazValores comunsRecomendação
TypeDefine o formatoxlTypePDF ou xlTypeXPSUse xlTypePDF para compatibilidade ampla.
QualityQualidade do PDFxlQualityStandard, xlQualityMinimumPadrão atende à maioria dos cenários.
IncludeDocPropertiesInsere propriedades do arquivoTrue / FalseDeixe True se você usa metadados.
IgnorePrintAreasDesconsidera as áreas de impressãoTrue / FalseMantenha False para respeitar o layout definido.
OpenAfterPublishAbre o PDF após gerarTrue / FalseDefina 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 &amp; "_" &amp; stamp

Guia de implementação para o usuário final

  1. Abra o Editor do VBA (ALT + F11 no Windows, ⌥ Option + F11 no Mac).
  2. Insira um Module em VBAProject → Insert → Module.
  3. Cole um dos códigos acima (versão simples ou robusta).
  4. Na planilha, coloque o nome desejado do PDF em B1 (ou ajuste o código para outra célula).
  5. Execute o macro (F5) ou atribua-o a um botão na planilha.

Erros comuns e como resolver

SintomaCausa provávelComo corrigir
PDF salvo em “Documentos”Filename foi definido sem caminho completoMonte ActiveWorkbook.Path & Separador & Nome & ".pdf".
Erro de permissãoPasta protegida ou sem acessoEscolha outra pasta via GetSaveAsFilename ou obtenha permissão.
Nome de arquivo inválidoCaracteres / \ : * ? " < > | no textoSanitize o nome (veja SanitizeFileName).
Sobrescrita indesejadaArquivo existente com mesmo nomeUse EnsureUniqueFileName para numerar automaticamente.
Exporta “tudo” em vez do intervaloIgnorePrintAreas = TrueDefina 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 &amp; Application.PathSeparator &amp; "PDFs"
If Dir(targetFolder, vbDirectory) = "" Then MkDir targetFolder
pdfPath = targetFolder &amp; Application.PathSeparator &amp; baseName &amp; ".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.

Índice