夜雨聆风学习资料网

ARTICLE · 1193489

Excel VBA编程-一键用 VBA 把表格导出成 PDF

Excel VBA编程-一键用 VBA 把表格导出成 PDF

你有没有过这种经历:月底把报表做好了,领导说“发我一份,我打印出来开会用”。你点“文件”→“另存为”→选 PDF→挑文件夹→改文件名……一张表还好,要是有十几张分表,每张都要手动存一遍,手都点酸了。其实,只要写一小段 VBA,选中表、按一下,整张表就变成 PDF 乖乖躺在电脑里,还能批量把十几张表一次性全转成 PDF。发给领导、发微信、直接打印,格式都不会乱。

今天我们从网络上整理了一批 Excel VBA“导出 PDF”的实用技巧(包括 Microsoft Learn 里 Excel 2010 的 ExportAsFixedFormat 标准写法、excelmacroclass 总结的“工作簿/工作表/选区都能导出”三种用法,以及 spreadsheetplanet、exceltip 实战里反复强调的“用 InputBox 让文件名运行时现填”“批量导出时把 OpenAfterPublish 设为 False 避免一下弹出十几个窗口”等经验),核心就一句话:一个方法 ExportAsFixedFormat,指定类型、文件名,Excel 自己把表格变成 PDF。

下面用 3 个由浅入深的案例,带你从“一键导出当前表”到“全工作簿批量出 PDF”。


案例一(简单):一键把当前工作表导出成 PDF

功能说明 先在 Excel 里切到你想要导出的那张表(就是你现在正看着的那张),运行这一段,它就把这张表变成一个名为「当前工作表.pdf」的文件,自动存到你这个 Excel 文件所在的文件夹里,导出完还会直接帮你打开预览。它用的是 ActiveSheet.ExportAsFixedFormat——ActiveSheet 就是“当前正在看的那张表”,Type:=xlTypePDF 表示导出成 PDF。如果文件还没保存过,它会先提醒你存一下,避免导出失败。

代码

Sub 一键导出当前表为PDF()    ' 把正在看的那张工作表,导出成一个 PDF 文件    Dim 文件路径 As String    ' 文件没保存过就没有“所在文件夹”,先提醒,避免报错    If ActiveWorkbook.Path = "" Then        MsgBox "请先把本 Excel 文件保存到电脑上,再导出 PDF。", vbExclamation        Exit Sub    End If    文件路径 = ActiveWorkbook.Path & "\当前工作表.pdf"    ActiveSheet.ExportAsFixedFormat _        Type:=xlTypePDF, _        Filename:=文件路径, _        Quality:=xlQualityStandard, _        IncludeDocProperties:=True, _        IgnorePrintAreas:=False, _        OpenAfterPublish:=True   ' 导出后自动打开给你看    MsgBox "已导出 PDF:" & 文件路径, vbInformationEnd Sub

操作步骤

  1. 按 Alt + F11 打开 VBA 编辑器,点菜单「插入」→「模块」。
  2. 把上面的代码整段粘进去。
  3. 回到 Excel,切到你想导出的那张表(随便哪张都行)。
  4. 按 Alt + F8,选中「一键导出当前表为PDF」,点「运行」。
  5. 文件所在文件夹里会多出一个「当前工作表.pdf」,并且自动打开预览;想换名字就改代码里的「当前工作表」四个字。

小提示:ActiveWorkbook.Path 是“这个 Excel 文件保存在电脑的哪个文件夹”。PDF 就存那儿,不用你手动挑位置。如果文件还没保存过(标题栏显示“工作簿1”之类),Excel 不知道存哪儿,所以代码会先提醒你保存。


案例二(中等):运行时输入文件名,导出当前表为 PDF

功能说明 案例一里文件名写死成了「当前工作表」。这个案例改成:运行后弹框让你输入想用的文件名(比如“销售月报_10月”),它就把当前表存成这个名字的 PDF,放在文件所在文件夹里。这样今天导“周报”、明天导“月报”,都不用改代码。为了不让窗口乱弹,这里把 OpenAfterPublish 设成了 False,导出后不自动打开,安安静静存好就行。

代码

Sub 一键导出PDF_自选文件名()    ' 运行时输入文件名,把当前工作表存成 PDF(放在本文件同文件夹)    Dim 文件名 As String    Dim 文件路径 As String    文件名 = InputBox("请输入 PDF 文件名(不用带 .pdf):", "导出 PDF")    If 文件名 = "" Then Exit Sub   ' 点取消就退出,不导出了    If ActiveWorkbook.Path = "" Then        MsgBox "请先把本 Excel 文件保存到电脑上,再导出 PDF。", vbExclamation        Exit Sub    End If    文件路径 = ActiveWorkbook.Path & "\" & 文件名 & ".pdf"    ActiveSheet.ExportAsFixedFormat _        Type:=xlTypePDF, _        Filename:=文件路径, _        Quality:=xlQualityStandard, _        IncludeDocProperties:=True, _        IgnorePrintAreas:=False, _        OpenAfterPublish:=False   ' 不自动打开,安静导出    MsgBox "PDF 已保存:" & 文件路径, vbInformationEnd Sub

操作步骤

  1. 同样把代码粘进一个模块(和案例一可以放在同一个模块里)。
  2. 回到 Excel,切到你想导出的那张表。
  3. 按 Alt + F8 运行「一键导出PDF_自选文件名」。
  4. 弹框里输入文件名(例如“销售月报_10月”),点「确定」。
  5. 文件所在文件夹里就多出了「销售月报_10月.pdf」;想换个名字,重新运行再输一次就行。

想存到别的文件夹?把代码里 ActiveWorkbook.Path & "\" 改成固定路径即可,例如 "C:\报表\" & 文件名 & ".pdf"(记得文件夹要真实存在,否则会报错)。


案例三(实用小案例):一键把工作簿里所有表批量导出成 PDF

功能说明 真实工作里常常一个文件里有十几张分表(各车间、各门店、各月份),你希望“一键把每张表都变成各自的 PDF”,集中放在一个文件夹里,方便统一发给领导或打印。这个案例用 For Each 遍历整个工作簿的每一张表,按“表名叫什么,PDF 就跟着叫什么”的规则,把每张有内容的表导出成同名 PDF;同时 OpenAfterPublish 设为 False,导完十几张也不会一下弹出十几个窗口(这是实战里非常重要的体验细节)。单张表万一出错也不会影响其他表。

代码

Sub 一键批量导出所有表为PDF()    ' 把工作簿里每张有内容的表,各导出成一个同名的 PDF,都放在本文件所在文件夹    Dim 工作表 As Worksheet    Dim 数量 As Long    Dim 文件夹 As String    If ActiveWorkbook.Path = "" Then        MsgBox "请先把本 Excel 文件保存到电脑上,再批量导出。", vbExclamation        Exit Sub    End If    文件夹 = ActiveWorkbook.Path & "\"    数量 = 0    For Each 工作表 In ActiveWorkbook.Worksheets        On Error Resume Next   ' 某张表导出失败也不影响其他表继续导出        ' 只导出“有内容”的表:不是只有 A1 一个空格的空表        If Not (工作表.UsedRange.Rows.Count = 1 And _                工作表.UsedRange.Columns.Count = 1 And _                IsEmpty(工作表.Range("A1").Value)) Then            工作表.ExportAsFixedFormat _                Type:=xlTypePDF, _                Filename:=文件夹 & 工作表.Name & ".pdf", _                Quality:=xlQualityStandard, _                IncludeDocProperties:=True, _                IgnorePrintAreas:=False, _                OpenAfterPublish:=False            数量 = 数量 + 1        End If        On Error GoTo 0      ' 恢复正常的报错提示    Next 工作表    MsgBox "批量导出完成!共导出 " & 数量 & " 个 PDF 到:" & 文件夹, vbInformationEnd Sub

操作步骤

  1. 把代码粘进模块(和前两个可以放在同一个模块里)。
  2. 回到 Excel,确认你的工作簿里有几张要导出的分表。
  3. 按 Alt + F8 运行「一键批量导出所有表为PDF」。
  4. 文件所在文件夹里会多出一堆 PDF,每张表一个,文件名和表名一一对应;空表会被自动跳过。
  5. 想只导出某几张?把 For Each 工作表 In ActiveWorkbook.Worksheets 换成只处理指定的表即可(后续进阶篇会讲按名字挑表)。

关键经验(来自网络实战总结):

  • 一个方法通吃三种对象:ExportAsFixedFormat 既能用在 ActiveSheet(整张表),也能用在 Selection(选中区域)、ActiveWorkbook(整个工作簿),写法几乎一样,换前面的对象就行。
  • 参数别死记:Type:=xlTypePDF 定格式、Filename:= 定存到哪叫什么、Quality:=xlQualityStandard 定清晰度,记住这三个就够用。
  • 批量记得关弹窗:批量导出时把 OpenAfterPublish 设 False,否则十几张 PDF 会一下全弹出来卡住你,这是几乎所有靠谱批量代码都会写的一步。
  • 批量别怕出错:For Each 遍历 + On Error Resume Next 兜单张表的异常,一张坏了也不会让整个宏卡住。
  • 保存工作簿一定要存成 .xlsm 格式,否则宏会丢失。

知识点小结

用 VBA 导出 PDF,本质上就是把“人手动点另存为”这件事,翻译成一行固定动作:指定对象 → 调 ExportAsFixedFormat → 给类型、给文件名。整套逻辑记住四句话就够了:

  1. 选对象 → ActiveSheet(当前表)/ Selection(选中区)/ ActiveWorkbook(整本),导出什么就写哪个;
  2. 调方法 → 对象.ExportAsFixedFormat Type:=xlTypePDF, Filename:=路径, Quality:=xlQualityStandard,三个核心参数定格式、定位置、定清晰度;
  3. 文件名自己拼 → 文件夹 & "名字" & ".pdf",用 & 把路径和名字连起来,想让用户现填就用 InputBox;
  4. 批量与体验 → For Each 遍历每张表 + OpenAfterPublish:=False 不弹窗 + On Error Resume Next 防卡死,就是一套完整的“报表转 PDF”自动化。

它和前面学的“条件格式自动标红”“自动生成图表”“保护工作表”是一套组合拳:图表管“趋势一眼懂”、条件格式管“哪里异常”、保护工作表管“能不能改”、PDF 导出管“怎么把成果稳稳交给领导和同事”。四样都用上,你的表格从做好、到报警、到出图、再到发出去,全程不用手动点一下。

【SVG 示意图】 


下一篇预告:表格会变成漂亮的 PDF 交出去了,但要是能直接“从 Excel 一键发到对方邮箱”,连打开文件夹都省了,是不是更爽?我们来讲一键用 VBA 自动发邮件(Outlook),把做好的报表直接塞进邮件发出去。

相关学习资料