如何使用特定工作表顺序将工作表数组保存为PDF

时间:2013-03-27 00:38:54

标签: excel-vba pdf-generation vba excel

我有一个包含多个工作表的工作簿,我想选择它并转换为单个PDF文件。

我编写了以下代码,它可以正常工作并创建文件:

Sub Print_Project_Report_To_PDF

    Dim FilePathandName As String
    MyDate = Format(DateSerial(Year(Now), Month(Now) - 1, 1), "mmmm yyyy")
    MyPath = ThisWorkbook.Path & "\"
    MyFile = "Project Progress Report - " & MyDate & ".pdf"
    FilePathandName = MyPath & MyFile

    ThisWorkbook.Sheets(Array("PR_COVER_PAGE", "PR_SUMMARY", _
    "PR_PROJECT_DETAILS", "PR_INTERNAL RESOURCES", "PR_TIME", _
    "PR_REVENUE_FORECAST_SUMMARY", "PR_ORIGINAL_REVENUE_FORECAST", _
    "PR_ACTUAL_REVENUE_FORECAST", "PR_COSTS", "PR_ISSUES", "MONTHLY FINANCIAL    REPORT", _
    "PG-SC_COVER_LETTER", "PG-SC_CLAIM_SUMMARY", "PG-SC_TRADE", "PG-SC_HYDRAULICS", _
    "PG-SC_MECHANICAL", "PG-SC_MEDICAL_GASES", "PG-SC_ELECTRICAL", "PG-SC_VARIATION", _
    "PG-SC_MONTHLY_CASHFLOW", "PG-MH_COVER_LETTER", "PG-MH_CLAIM_SUMMARY", _
    "PG-MH_TRADE", "PG-MH_HYDRAULICS", "PG-MH_MECHANICAL", "PG-MH_MEDICAL_GASES", _
    "PG-MH_ELECTRICAL", "PG-MH_VARIATION", "PG-MH_MONTHLY_CASHFLOW", "CLIENT_COVER", _
    "CLIENT_SUMMARY", "CLIENT_ISSUES")).Select

    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=FilePathandName, _
    Quality:=xlQualityStandard, IncludeDocProperties:=True, _
    IgnorePrintAreas:=False, OpenAfterPublish:=True

    ThisWorkbook.Sheets("Dashboard").Select

End Sub

问题是PDF文件不是按照我在数组中指定的顺序创建的。它们按照它们在工作簿中出现的顺序(从左到右)。它正确地只包括我想要的纸张,但不是我想要的顺序。

我不想更改工作簿中工作表的顺序,因为它是以特定的渐进方式设置的。

任何人都可以帮我提供代码,这些代码可以让我在发布文档时具体说明工作表的顺序吗?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我同意@SiddharthRout在问题下面的第一个想法/评论。但是,在我打印复杂的PowerPoint演示文稿的情况非常相似的情况下我使用

PDFCreator application

在第一步,我运行该软件并设置'停止打印'选项。您可以将每个工作表单独发送到该软件(以您打印工作表的方式),这些工作表将是开头时以正确顺序堆叠在列表中的单独文档。使用特殊功能,您可以将它们匹配到一个文档然后打印它。这是非常有用且非常可靠的解决方案。

答案 1 :(得分:0)

以下是一些示例VBA代码,如何将当前工作簿复制到临时文件中并重新排序工作表列表。在打印之前使用这样的例程:

Sub CopyAndReorder()
    Dim wbCopy As Workbook
    ThisWorkbook.SaveCopyAs "C:\TEMP\XXXX.XLS"
    Set wbCopy = Workbooks.Open("C:\TEMP\XXXX.XLS")
    ReorderSheets wbCopy
End Sub

Sub ReorderSheets(wb As Workbook)
    Dim shNames As Variant, shName As Variant, sh As Worksheet
    shNames = Array("Table3", "Table2", "Table1")
    For Each shName In shNames
        Set sh = wb.Sheets(shName)
        sh.Move After:=wb.Sheets(wb.Sheets.Count)
    Next
End Sub

(您必须根据需要调整此代码段,当然,使用更好的临时文件名,之后删除新文件,提供外部表单等,但我认为您明白了)。