【问题标题】:Exporting multiple sheets to .pdf via VBA code通过 VBA 代码将多张工作表导出为 .pdf
【发布时间】:2017-05-14 17:13:59
【问题描述】:

我已经看到了这个问题,但它并没有完全回答我的问题 - excel vba not exporting pagesetup to pdf correctly

在使用代码创建 .pdf 输出时,我遇到了相同的问题,即每个工作表中的指定范围没有被导出。每个工作表上的所有内容都被导出,因此每个工作表都分布在两个或多个页面上。每张纸的打印范围设置为将指定区域打印到一张纸上。

我已尝试调整链接中的代码,但它似乎不适用于多张工作表。

我试图以未经调整的形式使用的代码

Sub ClientPDFOutput()

If Sheets("File Data").Range("FD_FileName") = "" Then
'   MsgBox ("Save the file before exporting to a .pdf fomrat"), vbInformation, "Save File"

'   Exit Sub
   Else
End If

ActiveSheet.Unprotect Password:=strPassword

Range("UI_Status") = "Creating client PDF output - Please wait"

SelectSheets

Application.ScreenUpdating = False

Sheets(arrSheets).Select

strFilename = "Test"

Selection.ExportAsFixedFormat _
   Type:=xlTypePDF, _
   filename:=ActiveWorkbook.Path & "\" & strFilename & ".pdf", _
   Quality:=xlQualityStandard, _
   IncludeDocProperties:=True, _
   IgnorePrintAreas:=True, _
   OpenAfterPublish:=False

Sheets("User Input").Select

Range("UI_Status") = "Client .pdf output created and saved"

ActiveSheet.Protect Password:=strPassword

Application.ScreenUpdating = True

MsgBox ("The client output in .pdf format has been created and saved"), vbInformation, ".pdf Created"

End Sub

Sub SelectSheets()

Dim rngSheets As Range

Set rngSheets = Sheets("File Data").Range("D_OutputSheets")

If rngSheets.Count = 1 Then
   arrSheets = rngSheets.Value2
   Else
   arrSheets = Application.Transpose(rngSheets.Value2)
End If

End Sub

经过更多试验后,我确定我在每一页上的打印范围都已关闭,因此更正了这些。

我添加了代码以在所有工作表都被选为工作表数组的一部分之前选择每个工作表的打印范围,但是数组的第一个工作表中的打印范围在所有工作表中都被复制。因此,如果工作表 1 中的范围是 B4:P61,工作表 2 的打印范围是 B4:M48,那么当工作表数组被选中时,工作表 2 将选择 B4:P61。

这会打印出所选范围,这对于工作表 1 是正确的,但对于其余工作表是错误的。

当我通过选择所有工作表、文件、导出手动执行此操作时,所有工作表打印范围都会被导出,那么为什么当它被记录并放入例程时它被忽略了?

【问题讨论】:

    标签: excel vba pdf-generation


    【解决方案1】:

    请尝试更改IgnorePrintAreas 属性。

    Selection.ExportAsFixedFormat _
       Type:=xlTypePDF, _
       filename:=ActiveWorkbook.Path & "\" & strFilename & ".pdf", _
       Quality:=xlQualityStandard, _
       IncludeDocProperties:=True, _
       IgnorePrintAreas:=False, _
       OpenAfterPublish:=False
    

    【讨论】:

      【解决方案2】:

      我建议使用以下方法来确保您的页面设置将其修复为单个页面:

      With ActiveSheet.PageSetup
       .FitToPagesWide = 1
       .FitToPagesTall = 1
      End With
      

      删除 with 语句中的第一行或第二行以满足您的喜好,或保留两者。

      我还看到你有selection.ExportAsFixedFormat。确保您选择的区域正确或使用固定范围。您可能还想动态确定最远的行/列并将其添加到变量PrintRangeGetting the actual usedrange。 设置IgnorePrintAreas:=False

      Dim PrintRange As Range
      
      Set PrintRange = Range("A1:XX100")
      
      PrintRange.ExportAsFixedFormat Type:=xlTypePDF, _
                                      Filename:=Filename, _
                                      Quality:=xlQualityStandard, _
                                      IncludeDocProperties:=True, _
                                      IgnorePrintAreas:=False, _
                                      OpenAfterPublish:=False
      

      【讨论】:

        【解决方案3】:

        尝试添加一个“对于 activeworkbook 中的每个工作表”(它对我有用):

        Sub Extract_pdfs()
        
        Dim wb As Workbook
        Dim sh As Worksheet
        
        Set wb = ThisWorkbook
        
        For Each sh In wb.Worksheets
        
            sh.Select
        
            pdf_name = sh.Name & ".pdf"
        
            ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
                Filename:=ActiveWorkbook.Path & pdf_name, _
                Quality:=xlQualityStandard, _
                IncludeDocProperties:=True, _
                IgnorePrintAreas:=False, _
                OpenAfterPublish:=True
        
        Next
        
        End Sub
        

        【讨论】:

          【解决方案4】:

          如果您尝试将多张纸上的多个范围打印到一个 pdf 中,您可以尝试使用联合函数来组合它们,但是我没有任何运气使用联合,所以我做了一些更长的方法那。本质上,我创建了一个新页面并将范围复制到其中(以我想要的格式)我确保在之后删除该页面,因为它使再次运行宏变得更加容易。

          t= 1
          ThisWorkbook.Sheets.Add.Name = "Print"
          
          set rowcount = range(tocopy).row.count
          
          Range(tocopy).SpecialCells(xlCellTypeVisible).Copy
          With Sheets("Print").Cells(t, 1)
          .PasteSpecial xlPasteColumnWidths
          .PasteSpecial xlPasteFormats
          .PasteSpecial xlPasteValuesAndNumberFormats
          End With
          t = t + rowcount
          
          'keep doing for all ranges
          
          Sheets("Print").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
          "Name.pdf", Quality:=xlQualityStandard, _
          IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
          

          然后我继续这样做,直到我在页面上拥有所有范围并将页面导出为 pdf。然后删除工作表“打印”。

          但是,如果您只是想在单独的页面上打印每个,您可以尝试

          dim printing() as string
          
          printing(1) = "Range1"
          printing(2) = "Range2"
          
          for each section in printing
          Range(section).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
          "Name.pdf", Quality:=xlQualityStandard, _
          IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
          next section
          

          正如我上面提到的,你可以尝试为它设置一个联合函数(如果你的运气比我好的话)

          dim printing as range 
          
          printing = union(range1,range2,range3)
          
          printing.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
          "Name.pdf", Quality:=xlQualityStandard, _
          IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
          

          祝你好运!希望这会有所帮助,还要注意代码可能不完全正确,因为它未经测试!

          【讨论】:

            猜你喜欢
            • 2016-08-04
            • 1970-01-01
            • 2016-12-06
            • 2010-09-18
            • 1970-01-01
            • 1970-01-01
            • 2021-04-22
            • 1970-01-01
            • 2014-01-12
            相关资源
            最近更新 更多