Excel/VBA宏打印奇数偶数页并实现正反打印
提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!
大家都知道Word里面有一项设置可以让我们选择打印奇数页还是偶数页,这样我们很容易就实现了Word的正反打印,Excel中貌似找不到这个选项,如果你的打印机支持的话,你可以通过页面设置,工作表选项卡,选项按钮,切换到完成方式,可能会有奇数偶数或者正反打印,当然这一切取决于你的打印机驱动是否支持,如果找不到,那该怎么办呢?难道只能手动打印吗?
其实我们可以利用VBA宏变通一下的,首先获取总页数,奇数页打印也就是从1开始,然后1、3、5、7、9,步长为2,利用VB语言可以描述如下:
' TotalPages就是总页数
' Step是计算步长,这里i每次加2
For i=1 To TotalPages Step 2
' 打印 i 页
Next i
这里很明显将打印1、3、5、7、9这样的奇数页,如果是2、4、6、8、10这样的偶数页该怎么办呢,可以看出步长依旧是2,只是起始从2开始了,那么i初始应该设置为2。
通过PrintOut方法就能进行打印了,这里我们默认打印选中的Sheet,所以使用ActiveWindow.SelectedSheets:
' TotalPages就是总页数
' Step是计算步长,这里i每次加2
' 打印奇数页
For i = 1 To TotalPages Step 2
ActiveWindow.SelectedSheets.PrintOut From:=i, To:=i
Next i
为了通用,我们将上面的方法封装成一个Sub过程:
' StartPage 要打印的起始页
' TotalPages 要打印的总页数
' SkipPages 每次打印跳过的页数
Sub PrintSheet(ByVal StartPage As Integer, _
ByVal TotalPages As Integer, _
ByVal SkipPages As Integer)
For i = StartPage To TotalPages Step SkipPages+1
ActiveWindow.SelectedSheets.PrintOut From:=i, To:=i
Next i
End Sub
这里步长为了便于理解被我改为SkipPages,跳过的页数,比如步长2,也就是说每次跳过1页。好,到这里基本上是万事俱备只欠东风了,这个东风也就是如何获取打印的总页数,其实我们可以通过Excel内置宏GET.DOCUMENT获取,其中参数是50,表明“当前设置下欲打印的总页数,其中包括注释,如果文件为图表,值为1”。调用内置宏,通过ExecuteExcel4Macro方式,也就是总页数如下:
TotalPages = ExecuteExcel4Macro("Get.Document(50)")
总页数有了,下面就是奇数页,偶数页打印的方法了:
' 奇数页
Sub PrintOddPages()
TotalPages = ExecuteExcel4Macro("Get.Document(50)")
PrintSheet 1, TotalPages, 1
End Sub
' 偶数页
Sub PrintEvenPages()
TotalPages = ExecuteExcel4Macro("Get.Document(50)")
PrintSheet 2, TotalPages, 1
End Sub
接下来就是如何打印正反面了,其实我们先让打印机打印正面,正面是1、3、5、7、9这样的奇数页,然后暂停打印,将纸张翻过来,再让打印机打印偶数页,看似没有什么问题,实际上,纸张翻过来打印偶数页时必须从大到小打印,也就是说类似于10、8、6、4、2这样的顺序,其实我们只需要设置起始页为总页数,结束页为2,步长为-2就可以了,将原来的PrintSheet函数修改一下:
' StartPage 要打印的起始页
' TotalPages 要打印的总页数
' SkipPages 每次打印跳过的页数
' Invert 是否逆序
Sub PrintSheet(ByVal StartPage As Integer, _
ByVal TotalPages As Integer, _
ByVal SkipPages As Integer, _
ByVal Invert As Boolean)
Dim s As Integer
s = IIF(Invert, -(SkipPages+1), SkipPages+1)
For i = StartPage To TotalPages Step s
ActiveWindow.SelectedSheets.PrintOut From:=i, To:=i
Next i
End Sub
我们增加了Invert是否逆序打印的参数,因为如果逆序的话,步长就应该是负数了。正反打印的过程如下:
Sub PrintPosAndNegPages()
TotalPages = ExecuteExcel4Macro("Get.Document(50)")
' 打印正面
PrintSheet 1, TotalPages, 1, False
' 暂停打印
MsgBox "请将打印出的纸张反向装入纸槽中", vbOKOnly, "打印另一面"
' 打印反面,从最后的TotalPages打印到第二页
' 判断总页数是否为奇数
Dim IsOdd As Boolean
IsOdd = CBool((TotalPages MOD 2)=1)
If IsOdd Then
' 奇数页,最后一页空白,需要手动取出
MsgBox "请将打印出的纸张最后一页取出,然后确定并继续", vbOKOnly, "打印另一面"
End If
' 向下取偶
FromPages = TotalPages - (TotalPages MOD 2)
PrintSheet FromPages, 2, 1, True
End Sub