Eu finalmente encontrei uma solução para o meu problema, usando algum código VBA e o ExportAsFixedFormat
method . Basicamente, essa função exportará o intervalo atual com um tipo e um nome de arquivo. A resposta abaixo, embora específica para o meu caso, é facilmente adaptada à situação de qualquer pessoa.
Após algumas deliberações e codificações, encontrei uma solução para encontrar os intervalos adequados - embora esteja longe de ser perfeito. Eu escrevi a seguinte função VBA (para uso somente com o Excel), que retorna o intervalo entre duas quebras de página horizontais (você precisa especificar as colunas inicial e final):
' Name: Get Range
' Desc: Returns a string representing a range (e.g. "A1:Z30"), which encompasses the specified page breaks.
' Args: startHPBreak - Used to determine which starting page break to use, from 0 up to the number of pagebreaks.
' endHPBreak - Used to determine the last page break to return up to.
Function GetRange(ByVal startHPBreak As Long, ByVal endHPBreak As Long) As String
Dim startCol, endCol As String ' First, we define our starting/ending columns.
startCol = "A"
endCol = "Z"
Dim numHPBreaks As Long ' Holds the total number of horizontal page breaks.
Dim startRow, endRow As Long ' Holds the starting/ending rows of the range.
' First, we get the total number of page breaks.
numHPBreaks = ActiveSheet.HPageBreaks.Count
' Then, we check to see the passed ranges are valid (returns a blank string if they are not).
If (startHPBreak < 0) Or (startHPBreak > numHPBreaks) Then Exit Function
If (endHPBreak <= startHPBreak) Or (endHPBreak > numHPBreaks) Then Exit Function
' Next, we build our string by obtaining our starting and ending rows.
If startHPBreak = 0 Then ' If we're starting at the 0th page break...
startRow = 1 ' Then start exporting at the first row.
Else ' Else, just get the starting page break row.
startRow = ActiveSheet.HPageBreaks(startHPBreak).Location.Row
End If
' Lastly, we get the ending page break row, build the range as a string, and return it.
endRow = ActiveSheet.HPageBreaks(endHPBreak).Location.Row - 1
GetRange = startCol & startRow & ":" & endCol & endRow
End Function
Existem algumas advertências, principalmente que você precisa ter quebras de página horizontais definidas para que isso funcione. No meu caso, essa função funcionou, mas havia gráficos em cada página. Sempre que eu tentei usar um intervalo em uma única página, os gráficos nas páginas subseqüentes seriam todos cortados por algum motivo, então eu escrevi a seguinte função para adicionar cada página como um intervalo diferente em uma string:
Finalmente, o intervalo criado foi passado para a função ExportAsFixedFormat
, conforme detalhado na parte superior da minha resposta, através da seguinte função (eu queria apenas exportar as páginas 1-2 e 12-17):
' Name: Export Pages
' Desc: Exports the specified pages/range in the function to the passed filename as a PDF.
' Args: outFileName - Full or relative file name (include the extension) to export the file as.
Sub ExportPages(outFileName As String)
Dim outputRange As String ' Used to build the output range.
Dim currPage As Byte ' Holds the current page we want to export.
' There are no graphs on the first two pages, so we can get that range all at once.
outputRange = GetRange(0, 2)
' Next, we loop through and add pages 12 to 17 to the range (since they have graphs).
For currPage = 12 To 17
' We build the range one page at a time, and seperate the ranges with commas.
outputRange = outputRange & "," & GetRange(currPage - 1, currPage)
Next currPage
' Finally, we use the outputRange string to specify the range, and export it as a PDF.
ActiveSheet.Range(outputRange).ExportAsFixedFormat _
Type := xlTypePDF, _
Filename := outFileName, _
Quality := xlQualityStandard, _
IncludeDocProperties := True, _
IgnorePrintAreas := False, _
OpenAfterPublish := True
End Sub
Note que eu tive que adicionar o intervalo para as páginas 12 a 17, uma por vez, caso contrário (como mencionei), meus gráficos seriam cortados. Eu não sei porque eu tive que fazer isso, mas funcionou no final. Espero que o que eu tenha postado aqui seja o suficiente para colocar alguém no caminho certo usando o código VBA para exportar um documento como um arquivo PDF.
Se alguém puder encontrar uma solução melhor no futuro, poste-a como resposta e ela será considerada.