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操作步骤
按 Alt + F11打开 VBA 编辑器,点菜单「插入」→「模块」。把上面的代码整段粘进去。 回到 Excel,切到你想导出的那张表(随便哪张都行)。 按 Alt + F8,选中「一键导出当前表为PDF」,点「运行」。文件所在文件夹里会多出一个「当前工作表.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操作步骤
同样把代码粘进一个模块(和案例一可以放在同一个模块里)。 回到 Excel,切到你想导出的那张表。 按 Alt + F8运行「一键导出PDF_自选文件名」。弹框里输入文件名(例如“销售月报_10月”),点「确定」。 文件所在文件夹里就多出了「销售月报_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操作步骤
把代码粘进模块(和前两个可以放在同一个模块里)。 回到 Excel,确认你的工作簿里有几张要导出的分表。 按 Alt + F8运行「一键批量导出所有表为PDF」。文件所在文件夹里会多出一堆 PDF,每张表一个,文件名和表名一一对应;空表会被自动跳过。 想只导出某几张?把 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 → 给类型、给文件名。整套逻辑记住四句话就够了:
选对象 → ActiveSheet(当前表)/Selection(选中区)/ActiveWorkbook(整本),导出什么就写哪个;调方法 → 对象.ExportAsFixedFormat Type:=xlTypePDF, Filename:=路径, Quality:=xlQualityStandard,三个核心参数定格式、定位置、定清晰度;文件名自己拼 → 文件夹 & "名字" & ".pdf",用&把路径和名字连起来,想让用户现填就用InputBox;批量与体验 → For Each遍历每张表 +OpenAfterPublish:=False不弹窗 +On Error Resume Next防卡死,就是一套完整的“报表转 PDF”自动化。
它和前面学的“条件格式自动标红”“自动生成图表”“保护工作表”是一套组合拳:图表管“趋势一眼懂”、条件格式管“哪里异常”、保护工作表管“能不能改”、PDF 导出管“怎么把成果稳稳交给领导和同事”。四样都用上,你的表格从做好、到报警、到出图、再到发出去,全程不用手动点一下。
【SVG 示意图】
下一篇预告:表格会变成漂亮的 PDF 交出去了,但要是能直接“从 Excel 一键发到对方邮箱”,连打开文件夹都省了,是不是更爽?我们来讲一键用 VBA 自动发邮件(Outlook),把做好的报表直接塞进邮件发出去。















































































