Dzwebs.Net

撰写电脑技术杂文十余年

Excel使用VBA根据不同客户动态设置不同标题行和打印区域

Admin | 2010-5-9 8:09:20 | 被阅次数 | 16835

温馨提示!

如果未能解决您的问题,请点击搜索;登陆可复制文章,点击登陆

  在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就是一个很好的参照对象。我们以此来区分不同的客户信息。然后,确定好每个客户的信息,是从哪一行到哪一行;确定了客户的数据行范围之后,我们就动态的给其确定打印标题行和打印区域并打印出来。

  再通过循环的操作,就可以将每个客户的信息,都分别自动单独的打印到纸张上。


该杂文来自: Excel杂文

上一篇:禁止Excel使用打印和打印预览功能

下一篇:Excel电子表格INDEX函数的介绍及实例

网站备案号:

网站备案号:滇ICP备11001339号-7

版权属性:

Copyright 2007-2021-forever Inc. all Rights Reserved.

联系方式:

Email:dzwebs@126.com QQ:83539231 访问统计