分享

利用VBA实现批量打印的思路

 VBA说 2020-04-07

这篇文章你将学到以下知识点:

录制宏并修改代码;instr函数;循环打开工作簿的通用写法;选择文件夹对话框。

我会认真写,希望看完文章后,能在遇到类似问题的某个瞬间能想到:好像我在哪个公众号见过类似的例子和知识点。再回来翻看这篇文章就行了。

▍问题引入

在知乎Excel有多厉害?这个回答中,大V何明科老师介绍过这个功能。今天我们就来说一下实现的步骤。

▷我自己随便下载了几个表格当做案例附件。

▍实现步骤:

录制宏,获取打印活动表格动作的代码。(没有真实打印机,以pdf虚拟打印机作为例子)

录制宏的到的代码

修改代码经过修改和补充,得到最终的代码(初学可以不修改录制宏得到的代码):

1Sub 批量打印()
2Application.ScreenUpdating = False
3    With Application.FileDialog(msoFileDialogFolderPicker)
4        If .Show = -1 Then fl = .SelectedItems(1) & "\"
5    End With
6    f = Dir(fl & "*.xls*")
7    Do While f <> ""
8        Workbooks.Open (fl & f)
9        For Each sht In ActiveWorkbook.Worksheets
10            If InStr(1, sht.Name, "标准表") > 0 Then
11                sht.Select
12                With ActiveSheet.PageSetup
13                    .PaperSize = xlPaperA4
14                    .Zoom = 80
15                End With
16                ActiveWindow.SelectedSheets.PrintOut IgnorePrintAreas:=False, _
17                printtofile:=True, prtofilename:=fl & ActiveWorkbook.Name & sht.Name & ".pdf"
18            End If
19        Next
20        ActiveWorkbook.Close False
21        f = Dir
22    Loop
23    Application.ScreenUpdating = True
24    MsgBox "完成"
25End Sub

代码超级详解:

1sub过程名
2
关闭屏幕刷新提高运行速度
3
弹出FileDialog对话框,提示用户选择文件夹作为路径
4如果选择了文件夹,则返回参数-1,如果点取消则返回参数0
5End With
6
利用DIR函数取出路径文件夹下的第一个工作簿,并赋值给变量f
7
只要能取出来工作簿名称,就做循环,直到取出的文件名为空停止循环
8
打开工作簿
9
for each函数对打开的活动工作簿中每个表格进行循环
10如果工作表名称中存在“标准表”字段,则进行以下循环
11
激活工作表,为下一步打印做准备
12使用pagesetup对象对打印页面进行设置
13
纸张大小为A4纸
14
缩放比例为80%
15End With
16
利用printout方法对打印过程进行设置
17
将表格打印到文件,全路径是活动工作簿的名字+工作表的名字+“.pdf”
18   End If
19   Next
20
关闭当前打开的工作簿,不保存
21
再次使用Dir函数,获取下一个工作簿,第二次使用可以直接写成f=Dir,省略参数
22Loop
23
开启屏幕刷新
24
MsgBox "完成"
25End Sub

运行代码,泡杯茶,等待自己打印完成。

▍知识点讲解:

instr函数

指定一字符串在另一字符串中最先出现的位置。

语法:

InStr([start, ]string1, string2[, compare])

参数解释:

start可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果指定了 compare 参数,则一定要有 start 参数。

string1    必要参数。接受搜索的字符串表达式。

string2    必要参数。被搜索的字符串表达式。

Compare可选参数。指定字符串比较。如果省略 compareOption Compare 的设置将决定比较的类型。(一般默认不写,特殊情况这里不叙述)



举个例子就很好理解了

InStr(1, sht.Name, "标准表"

这里就表示,在工作表的名字中搜索“标准表”字符串,如果包含这个字符串,他将会返回出现的位置。

InStr(1, “ABCD”, "C")   '这里结果会返回3
InStr(1, “ABCDC”, "C")   '这里结果仍然会返回3

选择文件夹对话框

如果要选择文件夹作为路径,参照我的写就可以,是个通用模式。

1选择文件夹
2Sub SelectFolder()  
3    '选择单一文件夹  
4    With Application.FileDialog(msoFileDialogFolderPicker)  
5        If .Show = -1 Then  
6        'FileDialog 对象的 Show 方法显示对话框,并且返回 -1(如果您按 OK)和 0(如果您按 Cancel)。  
7            MsgBox "您选择的文件夹是:" & .SelectedItems(1)  
8        End If  
9    End With  
10End Sub  

 FileDialog对象的更多应用:获取文件全路径(二)FileDialog对象

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多