大家都知道Word里面有一项设置可以让我们选择打印奇数页还是偶数页,这样我们很容易就实现了Word的正反打印,Excel中貌似找不到这个选项,如果你的打印机支持的话,你可以通过页面设置,工作表选项卡,选项按钮,切换到完成方式,可能会有奇数偶数或者正反打印,当然这一切取决于你的打印机驱动是否支持,如果找不到,那该怎么办呢?难道只能手动打印吗?
其实我们可以利用VBA宏变通一下的,首先获取总页数,奇数页打印也就是从1开始,然后1、3、5、7、9,步长为2,利用VB语言可以描述如下:
1 2 3 4 5 | ' 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:
1 2 3 4 5 6 | ' TotalPages就是总页数 ' Step是计算步长,这里i每次加2 ' 打印奇数页 For i = 1 To TotalPages Step 2 ActiveWindow.SelectedSheets.PrintOut From:=i, To:=i Next i |
为了通用,我们将上面的方法封装成一个Sub过程:
1 2 3 4 5 6 7 8 9 10 | ' 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方式,也就是总页数如下:
1 | TotalPages = ExecuteExcel4Macro("Get.Document(50)") |
总页数有了,下面就是奇数页,偶数页打印的方法了:
1 2 3 4 5 6 7 8 9 10 | ' 奇数页 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函数修改一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ' 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是否逆序打印的参数,因为如果逆序的话,步长就应该是负数了。正反打印的过程如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 |