Синтаксис VBA для экспорта некоторых вкладок в PDF в произвольном порядке - PullRequest
0 голосов
/ 08 октября 2018

У меня есть макрос, который я могу использовать во многих книгах для экспорта определенных вкладок по имени в PDF, и это работает.Проблема в том, что именованные вкладки, которые мне нужно экспортировать, не всегда находятся в одном и том же порядке / в желаемом порядке.В приведенном ниже коде показаны имена вкладок, которые я экспортирую в PDF, но в Excel по умолчанию используется порядок экспорта именованных вкладок в том порядке, в котором они отображаются (слева направо).Мне было интересно, знает ли кто-нибудь из вас, как я могу определить порядок, в котором эти листы появляются в PDF, независимо от того, в каком порядке они появляются в моей книге?Я пытаюсь избежать макроса, который временно экспортировал бы мои листы в отдельную рабочую книгу.

Sub PDFActiveSheet()
'www.contextures.com
'for Excel 2010 and later
Dim wsA As Worksheet
Dim wbA As Workbook
Dim strTime As String
Dim strName As String
Dim strPath As String
Dim strFile As String
Dim strPathFile As String
Dim myFile As Variant
On Error GoTo errHandler

Set wbA = ActiveWorkbook
Set wsA = ActiveSheet
strTime = Format(Now(), "yyyymmdd\_hhmm")

'get active workbook folder, if saved
strPath = wbA.Path
If strPath = "" Then
strPath = Application.DefaultFilePath
End If
strPath = strPath & "\"

'replace spaces and periods in sheet name
strName = Replace(wsA.Name, " ", "")
strName = Replace(strName, ".", "_")

'create default name for savng file
strFile = strName & "_" & strTime & ".pdf"
strPathFile = strPath & strFile

'use can enter name and
' select folder for file
myFile = Application.GetSaveAsFilename _
(InitialFileName:=strPathFile, _
FileFilter:="PDF Files (*.pdf), *.pdf", _
Title:="Select Folder and FileName to save")

'export to PDF if a folder was selected
If myFile <> "False" Then
 wbA.Activate
wbA.Sheets(Array(wbA.Sheets(2).Name, wbA.Sheets(3).Name)).Select

**------------------------------ THis is where I imagine the code would go**
 ActiveSheet.ExportAsFixedFormat _
   Type:=xlTypePDF, Filename:=myFile, Quality:=xlQualityStandard, _
   IncludeDocProperties:=True, IgnorePrintAreas:=False, 
 OpenAfterPublish:=False
 'confirmation message with file info
  MsgBox "PDF file has been created: " _
  & vbCrLf _
   & myFile
  End If

  exitHandler:
  Exit Sub
 errHandler:
 MsgBox "Could not create PDF file"
 Resume exitHandler
 End Sub

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Проблема с экспортом выбранных листов в PDF заключается в том, что Excel сохранит их в одном файле, но только в том порядке, в котором они отображаются в книге.Это означает, что нам придется переупорядочивать рабочие листы в нужном порядке.В приведенном ниже коде используется подпрограмма PDFActiveSheet, опубликованная в OP, но добавляется логика для переупорядочения логики таблиц PLUS для восстановления исходного порядка после завершения экспорта.

Option Explicit

Public Sub SaveThem()
    SaveSheetsToPDF "Sheet3", "Sheet1", "Sheet2"
End Sub

Private Sub SaveSheetsToPDF(ParamArray args())
    '--- inputs to this sub are the Worksheet names to save to a single
    '    PDF file, in the order given. Excel will save multiple
    '    worksheets to a single PDF, but only in the order they exist
    '    in the workbook. So we'll have to re-order them.
    Dim i As Long
    Dim ws As Worksheet
    Dim thisWB As Workbook
    Set thisWB = ThisWorkbook

    '--- initial error checking
    If UBound(args, 1) = -1 Then
        MsgBox "SaveSheetsToPDF called with no arguments!", _
               vbCritical + vbOKOnly
        Exit Sub
    Else
        '--- make sure the sheets exist before proceeding
        For i = LBound(args, 1) To UBound(args, 1)
            On Error Resume Next
            Set ws = thisWB.Sheets(args(i))
            If ws Is Nothing Then
                MsgBox "SaveSheetsToPDF called with an invalid sheet name!", _
                       vbCritical + vbOKOnly
                Exit Sub
            End If
            On Error GoTo 0
        Next i
    End If

    '--- save the existing worksheet order
    Dim numberOfWorksheetsInBook As Long
    numberOfWorksheetsInBook = thisWB.Sheets.Count

    Dim sheetsInOrder() As String
    ReDim sheetsInOrder(1 To numberOfWorksheetsInBook)
    For i = 1 To numberOfWorksheetsInBook
        sheetsInOrder(i) = thisWB.Sheets(i).name
        Debug.Print i & " = " & sheetsInOrder(i)
    Next i

    '--- move the given worksheets in the requested order after all the
    '    other worksheets
    With thisWB
        For i = LBound(args, 1) To UBound(args, 1)
            .Sheets(args(i)).Move After:=.Sheets(numberOfWorksheetsInBook)
        Next i
    End With

    '--- now save those worksheets to a PDF file
    thisWB.Sheets(args).Select
    PDFActiveSheet

    '--- restore the original order to the sheets
    Dim sheetName As Variant
    With thisWB
        For Each sheetName In sheetsInOrder
            .Sheets(sheetName).Move Before:=.Sheets(1)
        Next sheetName
    End With
End Sub

Sub PDFActiveSheet()
    'www.contextures.com
    'for Excel 2010 and later
    Dim wsA As Worksheet
    Dim wbA As Workbook
    Dim strTime As String
    Dim strName As String
    Dim strPath As String
    Dim strFile As String
    Dim strPathFile As String
    Dim myFile As Variant
    On Error GoTo errHandler

    Set wbA = ActiveWorkbook
    Set wsA = ActiveSheet
    strTime = Format(Now(), "yyyymmdd\_hhmm")

    'get active workbook folder, if saved
    strPath = wbA.path
    If strPath = "" Then
        strPath = Application.DefaultFilePath
    End If
    strPath = strPath & "\"

    'replace spaces and periods in sheet name
    strName = Replace(wsA.name, " ", "")
    strName = Replace(strName, ".", "_")

    'create default name for savng file
    strFile = strName & "_" & strTime & ".pdf"
    strPathFile = strPath & strFile

    'use can enter name and
    ' select folder for file
    myFile = Application.GetSaveAsFilename(InitialFileName:=strPathFile, _
                                           FileFilter:="PDF Files (*.pdf), *.pdf", _
                                           Title:="Select Folder and FileName to save")

    'export to PDF if a folder was selected
    If myFile <> "False" Then
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
                                        Filename:=myFile, _
                                        Quality:=xlQualityStandard, _
                                        IncludeDocProperties:=True, _
                                        IgnorePrintAreas:=False, _
                                        OpenAfterPublish:=False
        'confirmation message with file info
        MsgBox "PDF file has been created: " _
             & vbCrLf _
             & myFile
    End If

exitHandler:
    Exit Sub
errHandler:
    MsgBox "Could not create PDF file"
    Resume exitHandler
End Sub
0 голосов
/ 08 октября 2018

Подобно тому, что упоминал @ fabio.avigo, измените подпрограмму, которую вы опубликовали, следующим образом:

Sub PDFActiveSheet(ByRef wsA As Worksheet)

    ...

    '--- comment out this line
    'Dim wsA As Worksheet

    '--- and this one
    'Set wsA = ActiveSheet

    ...
End Sub

Затем создайте другую подпрограмму, чтобы вызывать ее с вашими таблицами в любом порядке, как вы хотите, например:

Public Sub PDFMySheets()
    PDFActiveSheet ThisWorkbook.Sheets("Sheet3")
    PDFActiveSheet ThisWorkbook.Sheets("Sheet2")
    PDFActiveSheet ThisWorkbook.Sheets("Sheet1")
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...