Excel/VBA宏打印奇数偶数页并实现正反打印

!本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使用方面,本人不保证相应的兼容和可操作性。

大家都知道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
若无特别说明,本网站文章均为原创,原则上这些文章不允许转载,但是如果阁下是出于研究学习目的可以转载到阁下的个人博客或者主页,转载遵循创作共同性“署名-非商业性使用-相同方式共享”原则,请转载时注明作者出处谢绝商业性、非署名、采集站、垃圾站或者纯粹为了流量的转载。谢谢合作!
请稍后...

发表评论

电子邮件地址不会被公开。 必填项已用*标注