保存多个工作表为 .pdf

36

我有一个报告电子表格,从数据库中获取一些数据并形成三个汇总报告信息表单。我希望能够从命令行自动运行电子表格,并将所有三个报告表单自动保存为PDF文件。

起初我以为可以通过工作表上的VBA宏来执行此操作,通过一系列“打印为PDF”,但这需要一个中介交互式对话框来指定输出文件名。然后我发现我只需另存为PDF,宏便可设置输出文件名。但是,这会创建三个单独的文件,我之后还需要在外部将它们合并在一起。

(奇怪的是,“另存为PDF”仅保存一个工作表,而其他保存模式似乎会保存整个工作簿。)

是的,之后有一些合并三个文件的工具,但我想知道是否有一些简单的方法可以让Excel将多个表单一起保存为一个PDF文件。

我现在通过一系列类似以下的步骤进行打印:

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, ...

我能不能用单个语句来实现类似下面的伪代码:

ThisWorkbook.Sheets(1,2,3,4).ExportAsFixedFormat Type:=xlTypePDF, ...
3个回答

92

开始选择您想要合并的表格:

ThisWorkbook.Sheets(Array("Sheet1", "Sheet2")).Select

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    "C:\tempo.pdf", Quality:= xlQualityStandard, IncludeDocProperties:=True, _
     IgnorePrintAreas:=False, OpenAfterPublish:=True

能够选择一系列的工作表非常棒。谢谢。 - CBC_NS
4
如果您使用 book.Windows(1).Visible = False 隐藏工作簿,那么 Sheets(..).Select() 将会失败。(针对 Python3.4 和 MS Office 2013) - Winand
9
如果您担心用户重命名工作表,您可以使用工作表的Name方法,例如 Thisworkbook.Sheets(Array(Sheet1.Name, Sheet2.Name)).Select,这样无论用户将工作表重命名为什么名称,宏仍然可以正常运行。要更改这种情况,您需要在VBA中编辑工作表属性。 - Pork
1
我发现这个函数似乎只是尝试(并失败)将整个工作簿导出(根据临时文件的大小猜测),而不考虑选定的工作表。也许是新版本的Excel/VBA造成的问题? - CJB
1
重要提示:请务必使用ActiveSheet.ExportAsFixedFormat ...而不是ThisWorkbook.ExportAsFixedFormat ...否则将导出所有工作表,而不仅仅是所选工作表。这有点违反直觉(或者对我来说是这样)。 - John Joseph
显示剩余7条评论

10

与Tim的答案类似-但是增加了对2007年的检查(默认情况下未安装PDF导出):

公共子过程subCreatePDF()
如果没有安装PDF库 Then '最好以用户窗体的形式展示,附上合适的链接: MsgBox "请安装插件以便导出PDF。您可以在 http://www.microsoft.com/downloads/details.aspx?familyid=4d951911-3e7e-4ae6-b059-a2e79ed87041 找到它。" 退出子过程 End If
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _ Filename:=ActiveWorkbook.Path & Application.PathSeparator & _ ActiveSheet.Name & " für " & Range("SelectedName").Value & ".pdf", _ Quality:=xlQualityStandard, IncludeDocProperties:=True, _ IgnorePrintAreas:=False, OpenAfterPublish:=True End Sub
私有函数IsPDFLibraryInstalled() As Boolean '鸣谢Ron DeBruin (http://www.rondebruin.nl/pdf.htm) IsPDFLibraryInstalled = _ (Dir(Environ("commonprogramfiles") & _ "\Microsoft Shared\OFFICE" & _ Format(Val(Application.Version), "00") & _ "\EXP_PDF.DLL") <> "") End Function

这个能在 Excel 2003 上运行吗?我的意思是,IsPDFLibraryInstalled 会返回 false 吗? - Anthony
这里的 IsPDFLibraryInstalled() 代码有一个错误。最后一个 "" 前面应该有一个 <> 符号,即在 End Function 之前的那一行应该是 "\EXP_PDF.DLL") <> "") - AnotherParker
1
我尝试编辑代码以修复<>错误和缺失的“ If”中的“ End If”,但我的编辑被拒绝了。 - AnotherParker
@AnotherParker 感谢您指出这个问题。实际上它在源代码中是存在的,但在转换为HTML时丢失了。现在已经修复了- 谢谢。 - Peter Albert

6
我建议在导出为PDF之后添加以下行:
ThisWorkbook.Sheets("Sheet1").Select

(其中,例如Sheet1是您之后要激活的单个工作表)

保留多个工作表处于选定状态可能会导致执行某些代码时出现问题。(例如,当多个工作表被同时选定时,取消保护函数无法正常运行。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接