Я наконец нашел решение своей проблемы, используя некоторый код VBA и метод ExportAsFixedFormat
. По сути, эта функция экспортирует текущий диапазон с типом и именем файла. Ответ ниже, хотя и специфичен для моего случая, легко адаптируется к любой ситуации.
После некоторых размышлений и написания кода, я нашел решение, чтобы найти подходящие диапазоны - хотя оно далеко от совершенства. Я написал следующую функцию VBA (для использования только с Excel), которая возвращает диапазон между двумя горизонтальными разрывами страниц (вам нужно указать начальный и конечный столбцы):
' 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
Есть некоторые предостережения, в основном, для этого вам нужно определить горизонтальные разрывы страниц. В моем случае эта функция работала, но на каждой странице были графики. Всякий раз, когда я пытался использовать диапазон на одной странице, графики на последующих страницах по какой-то причине все обрезались, поэтому я написал следующую функцию, чтобы добавить каждую страницу как отдельный диапазон в строке:
Наконец, созданный диапазон был передан в функцию ExportAsFixedFormat
как подробно описано в верхней части моего ответа через следующую функцию (я только хотел экспортировать страницы 1-2 и 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
Обратите внимание, что мне нужно было добавлять диапазон для страниц с 12 по 17 по одному, иначе (как я уже говорил) мои графики были бы обрезаны. Я не знаю, почему я должен был это сделать, но в итоге это сработало. Надеюсь, что я разместил здесь достаточно, чтобы кто-то на правильном пути, используя код VBA для экспорта документа в виде файла PDF.
Если кто-то может найти лучшее решение в будущем, пожалуйста, опубликуйте его как ответ, и оно будет рассмотрено.