Você está na página 1de 4

VBA - Artigo 033 - Gerando arquivos PDF

via VBA
Postado Por: Pedro Martins Data: 14:00 / comentario : 3

Gerando arquivos PDF via VBA


Exportar sua planilha para o formato PDF (Portable Document Format, tipo de arquivo criado pela Adobe)
uma tarefa simples: entre no menu Arquivo, depois Exportar, da clique em Criar Documento PDF/XPS,
escolha o nome e local do arquivo e pronto, o arquivo gerado. XPS um tipo de arquivo criado pela
Microsoft para concorrer com o PDF, sem muita aceitao pelo mercado.

Quando voc s precisa exportar uma vez e a planilha est no formato apropriado para exportar, essa
soluo funciona basta. Porm, se a planilha for um relatrio e que precise de novas verses com uma
certa periodicidade, melhor considerar a automatizao dessa tarefa. Em um outro cenrio, se voc
precisar gerar um PDF diferente para vrias entidades diferentes em um curto perodo de tempo, um
cdigo para automatizar essencial.

Antes de mais nada, vamos usar o gravador de macros para ver o cdigo gerado pela exportao para
PDF:

Sub ExportarPDF()
'
' ExportarPDF Macro
'

'
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\Temp\Teste.pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False,
OpenAfterPublish:= _
True
End Sub

Em primeiro lugar, vemos que o objeto que est sendo utilizado o ActiveSheet e o mtodo
o ExportAsFixedFormat. Isto d a entender que s podemos exportar a partir de um objeto de planilha
(Worksheet). Usando o Pesquisador de Objeto (tecla F2 no editor de VBA), vemos que esse mtodo
tambm existe para os objetos pasta de trabalho (Workbook ), intervalo de clulas (Range) e grfico
(Chart).
Vemos que no cdigo gerado o mtodo ExportAsFixedFormat contm seis parmetros. Olhando no
pesquisador de objeto vemos que h mais alguns que no foram gerados na gravao. Vejamos a funo
de cada parmetro:

- Type: nico parmetro obrigatrio, define o formato do arquivo que ser gerado. Deve receber um valor
da enumerao XlFixedFormatType, cujos valores so os seguintes: xlTypePDF (exporta como PDF)
e xlTypeXPS(exporta como XPS);
- Filename: Como o prprio nome entrega, o nome do arquivo. Voc pode colocar o caminho completo
onde o arquivo ser gravado ou pode colocar apenas o nome do arquivo. Neste caso ele ser gravado na
pasta padro, que normalmente a pasta Documentos;
- Quality: Pode receber dois valores, xlQualityStandard (valor padro) e xlQualityMinimum. O primeiro
especifica qualidade normal, enquanto o segundo reduz a qualidade;
- IncludeDocProperties: Varivel booleana. Quando True indica que ir exportar tambm as propriedades
do documento, enquanto False diz para no exportar essas propriedades com o PDF;
- IgnorePrintAreas: Outra varivel booleana. Quando True indica para ignorar as reas de impresso
demarcadas no Excel, enquanto False diz para considerar as reas de impresso;
- OpenAfterPublish: Mais uma varivel booleana. Quando True indica para abrir o arquivo gerado,
enquanto Falseno abre o arquivo;
- From: Indica a partir de que pgina ser exportado. Quando no informado considera a partir do incio;
- To: Indica a at que pgina ser exportado. Quando no informado considera at o final.

Aps conhecer as funcionalidades, fica fcil perceber que mnimo para exportar um PDF o seguinte
cdigo:

Sub ExportarPDF()
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF
End Sub

Esse cdigo ir exportar a planilha ativa com o mesmo nome do arquivo do Excel, apenas alterando a
extenso para .pdf e ir gravar na pasta Documentos. Vamos fazer uma alterao nesse cdigo:

Sub ExportarPDF()
ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF
End Sub

Alterando de ActiveSheet para ActiveWorkbook altera o objeto que est sendo exportado. Neste caso ir
exportar todas as planilhas da pasta de trabalho ativa para o arquivo PDF. Se alterar o objeto para Range,
apenas o intervalo especificado ser exportado. Assim vemos diferentes possibilidades para diferentes
necessidades.

Em condies normais, voc usar tambm o parmetro Filename para especificar o caminho e o nome
do arquivo onde ser gravado, pois nem sempre voc quer obrigar o usurio a ir na pasta Documentos e
tambm pode querer alterar o nome do arquivo para algo mais apropriado ao que est sendo gerado.

Pode aparecer uma situao em que voc quer exportar mais de uma planilha, mas no quer exportar
toda a pasta de trabalho que est aberta. Com o que vimos at aqui s poderamos exportar cada planilha
em um arquivo separado. Mas h um macete: selecionando as planilhas desejadas:

Sub ExportarPDF()
Sheets(Array("Fornecedores", "Produtos")).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
ActiveWorkbook.Path & "\Fornecedores e produtos.pdf",
IgnorePrintAreas:=False
End Sub

Ao fazer isso, voc perceber que ambas as planilhas estaro selecionadas. No seu cdigo voc dever
deixar apenas uma selecionada antes de continuar o processamento.

Um caso onde bem interessante ter uma rotina para exportar para PDF quando voc precisa gerar
diversos arquivos personalizados. Uma rotina preenchen a planilha usando uma fonte de dados, que pode
ser outra planilha na mesma pasta de trabalho, sendo que a cada preenchimento completado dever
gerar o PDF com um nome especfico. Vejamos um procedimento bem simples para exemplificar:

Sub GerarRelatorios()
Dim UltimaLinha As Long
Dim Linha As Long
plDados.Select
UltimaLinha = plDados.Cells.Find("*", LookIn:=xlFormulas, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
plRelatorio.Select
For Linha = 2 To UltimaLinha
plRelatorio.Range("Nome").Value = plDados.Cells(Linha, 1).Value
plRelatorio.Range("Cargo").Value = plDados.Cells(Linha, 2).Value
plRelatorio.Range("Meta").Value = plDados.Cells(Linha, 3).Value
plRelatorio.Range("Alcanado").Value = plDados.Cells(Linha, 4).Value
plRelatorio.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
ActiveWorkbook.Path & "\Relatrios\" & _
plRelatorio.Range("Nome").Value & ".pdf", _
IgnorePrintAreas:=False
Next
End Sub

Neste exemplo a planilha com os dados plDados e a planilha que ser usada para gerar PDF
plRelatorio. A estrutura de repetio percorre todas as linhas de plDados e preencher quatro campos
em plRelatorio: Nome, Cargo, Meta e Alcanado. Em seguida, exporta para PDF usando o
campo Nome como nome do arquivo, guardando em uma pasta Relatrios, que est junto pasta de
trabalho. Quando a necessidade fazer isso com dois ou trs casos, d pra fazer manualmente, mas
quando h dezenas ou centenas de casos, muito melhor fazer um processo automatizado. O cdigo
acima pode gerar mil arquivos em poucos minutos, enquanto um processo manual levaria dias para
completar.

Perceba que no temos como alterar os atributos de impresso, isso um processo parte. feito
utilizando o objeto PageSetup, que um sub-objeto de Worksheets, e tem dezenas de propriedades e
sub-objetos. Os mais importantes so os seguintes:

- Orientation: Propriedade que define a orientao da pgina, podendo ser xlPortrait (retrato)
ou xlLandscape(paisagem);
- PrintArea: Propriedade que define o intervalo que ser impresso;
- PaperSize: Propriedade que define o tamanho da folha;
- PrintGridlines: Propriedade booleana que define se as linhas de grades sero impressas ou no;
- PrintHeadings: Propriedade booleana que define se a barra de linhas e colunas da planilha sero
impressas ou no;
- PrintTitleRows: Propriedade que define linhas que sero repetidas no topo de cada pgina;
- PrintTitleColumns: Propriedade que define colunas que sero repetidas esquerda de cada pgina;
- CenterHorizontally e CenterVertically: Propriedades booleanas, especificam se a planilha ser
centralizada na horizontal e na vertical, respectivamente;
- FitToPagesTall: Define a quantidade de pginas na altura em que os dados impressos sero escalado;
- FitToPagesWide: Define a quantidade de pginas na largura em que os dados impressos sero
escalado;
- Zoom: Propriedade que define a escala em percentual em que a planilha ser redefinida para a
impresso;
- LeftHeader, CenterHeader e RightHeader: Propriedades que definem a seo esquerda, central e direita
do cabealho da pgina;
- LeftHeaderPicture, CenterHeaderPicture e RightHeaderPicture: Objetos semelhantes s propriedades
acima, mas usando figura. Estes objetos possuem diversas propriedades para definir os atributos da
imagem. Quando este objeto for utilizado, a propriedade equivalente acima dever ser definida com o
valor "&G";
- LeftFooter, CenterFooter e RightFooter: Definem a seo esquerda, central e direita do rodap da
pgina;
- LeftFooterPicture, CenterFooterPicture e RightFooterPicture: Objetos semelhantes s propriedades
acima, mas usando figura. Estes objetos possuem diversas propriedades para definir os atributos da
imagem. Quando este objeto for utilizado, a propriedade equivalente acima dever ser definida com o
valor "&G";
- TopMargin, BottomMargin, LeftMargin e RightMargin: Propriedades que definem a margem superior,
inferior, esquerda e direita, respectivamente;
- HeaderMargin: Propriedade que define o espao entre a margem superior e o cabealho;
- FooterMargin: Propriedade que define o espao entre a margem inferior e o rodap.

H muitas outras propriedades, mas as principais so essas listadas acima. No se pode esquecer que
as definies de pgina devem ser feitas antes de gerar o PDF (ou imprimir um documento), portanto no
exemplo anterior o cdigo deve ser colocado antes da estrutura de repetio. Se colocar dentro do
lao For... Next vai redefinir vrias vezes pelos mesmos valores sem necessidade, reduzindo o
desempenho do cdigo.
Suponha que voc queira exportar o intervalo A1 at D200, mantendo a linha de cabealho da tabela no
topo de cada pgina. A definio das propriedades seria assim:

With plRelatorio.PageSetup
.Orientation = xlPortrait
.PrintArea = "$A$1:$D$200"
.PrintTitleRows = "SA$1:$D$1"
.Zoom = False
.FitToPagesTall = False
.FitToPagesWide = 1
End With

No se pode esquecer que ao usar o mtodo ExportAsFixedFormat a propriedade IgnorePrintArea deve


ser definida como False, caso contrrio a rea definida para impresso ser ignorada e o resultado
provavelmente ser diferente do esperado.

Espero que este artigo lhe ajude a automatizar seus relatrios, anlises, boletins e afins, no importando
se ser gerado apenas um ou centenas de uma vez.