提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

大家都知道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