在Excel的同一张表格里面,如果存在多个客户的信息,那么,如何使用VBA,自动设置不同客户的打印区域和设置不同的标题行,实现自动打印?
下面我们先看下表:
上表中,存在不同地区的不同客户,有北京的、上海的、福建的……;每个地方的客户都是不相同的,并且,每个地球的客户信息,也是不相同的,并且,标题行也是不相同的。
在如此复杂的一个表格里面,我们如何才能动态灵活的设置不同客户的打印区域、给其设置对应的标题行,从而自动打印每个客户的数据?
一、问题分析
现在,我们来稍微总结一下:比如,TO:上海,也就是上海的这个客户,名称是小昆虫,下面的当然是他的客户信息了。我们要做的就是单独打印客户的信息,不能让多个客户信息打印到同一张纸上。
问题的难点:很多网友可能会说,通过“页面设置”可以设置,当然,无可厚非,这种办法是可行的。但是,如果一张表格里面有1万个客户,那么,您就得进行“页面设置”的操作一万次。还有,如果这个客户的数据很多,必须使用N张纸才能打印完;如果您通过手工操作,您就得分别设置不同客户的打印区域、设置其打印标题行,也得设置一万次。
万一单位要求您将每个客户的数据,单独打印到纸张上(不能和其它客户的数据混打),如果打印的页数超过一页,还得必须分别设置打印标题。
遇到如此复杂艰巨的打印任务,我们得使用VBA来完成。
二、解决办法
右键点击工作表名称,在弹出的快捷菜单中选择“查看代码”,弹出“Microsoft Visual Basic”;在该窗口中,找到工程里面的“ThisWorkbook”点击右键,在弹出的快捷菜单中,仍然选择“查看代码”,这样,就进入到VBA代码编写窗口了。
在代码编写窗口中,输入如下代码即可:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim MyArray() As String '数组下标从0开始
Dim iNum As Integer
Dim MyPrintArea As String
iNum = 0
Dim MyTop As String
Dim MyTitleRow As String
'以TO为参照对象,获取页面中TO的个数
MyTop = "TO"
For i = 1 To ActiveSheet.UsedRange.Rows.Count
If (Left(Trim(ActiveSheet.Cells(i, 1).Value), 2)) = "TO" Then
iNum = iNum + 1
End If
Next i
'重新定义数组的长度为TO的个数,用来保存每个TO所在的行号
ReDim Preserve MyArray(iNum) As String
iNum = 0 '数组步长从0开始
For i = 1 To ActiveSheet.UsedRange.Rows.Count
If (Left(Trim(ActiveSheet.Cells(i, 1).Value), 2)) = "TO" Then
MyArray(iNum) = i '把行号赋值给每个数组
iNum = iNum + 1 '逐渐增加数组步长
End If
Next i
MyArray(iNum) = ActiveSheet.UsedRange.Rows.Count '最后一个数组的值,是有效数据区域内的最后一行的行号
'以数组中的数组个数为参照对象,设置不同的打印区域和不同的标题行
For j = 0 To iNum - 1
'MsgBox MyArray(j)
'设置打印标题
MyTitleRow = "$" & MyArray(j) & ":$" & MyArray(j) + 2
ActiveSheet.PageSetup.PrintTitleRows = MyTitleRow
'设置打印区域
MyPrintArea = "$" & MyArray(j) & ":$" & MyArray(j + 1) - 1
ActiveSheet.PageSetup.PrintArea = MyPrintArea
'每个不同打印区域与不同标题行之打印预览与打印
'ActiveWindow.SelectedSheets.PrintPreview '打印预览
'ActiveSheet.PrintPreview'打印预览
'ActiveWindow.SelectedSheets.PrintOut '还是打印预览
ActiveWindow.SelectedSheets.PrintOut Preview:=False '直接打印
Next j
End Sub
输入完成后,关闭Microsoft Visual Basic窗口,返回到Excel窗口;然后,只需要您点击“文件”→“打印预览”,这样,您的工作薄中的被激活的任何一个工作表的不同客户的信息,会自动、分别打印或弹出打印预览窗口。
三、部分代码说明
Private Sub Workbook_BeforePrint(Cancel As Boolean) 指的是代码事件名称;该事件名称是打印前。意思就是说,在点击“打印预览”的时候,就会执行里面的代码。
'每个不同打印区域与不同标题行之打印预览与打印
'ActiveWindow.SelectedSheets.PrintPreview '打印预览
'ActiveSheet.PrintPreview'打印预览
'ActiveWindow.SelectedSheets.PrintOut '还是打印预览
ActiveWindow.SelectedSheets.PrintOut Preview:=False '直接打印
以上四行代码,前三行是打印预览功能,最后一行是不进行预览,直接打印;请根据需要修改并使用。
实现上述功能的原理是:因为每个客户的信息都是以“TO”开始的,这个TO就是一个很好的参照对象。我们以此来区分不同的客户信息。然后,确定好每个客户的信息,是从哪一行到哪一行;确定了客户的数据行范围之后,我们就动态的给其确定打印标题行和打印区域并打印出来。
再通过循环的操作,就可以将每个客户的信息,都分别自动单独的打印到纸张上。