ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 30316|回复: 43

[原创] 打印底注行(底端标题行)完美版

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2016-7-7 20:54 | 显示全部楼层 |阅读模式
本帖最后由 cbtaja 于 2016-7-8 17:02 编辑

功能完整、且简单易用的打印底注行(底端标题行)工具

EXCEL页面设置中包含了“打印标题”(PrintTitle)的设置,这为避免重复输入顶端标题行带来了很大方便。
但是,表格中除了打印“标题行”之外,往往还需要在每页底部附加“签字栏”等这样相对类似于“标题行”而存在的“底注行”。
而美中不足的是,EXCEL并没有内置该项页面设置功能。因此,强大的坛友们中编写了很多类似的“底端标题行”工具。
本人也来编写一个。虽然本工具颇有特色,但标题中号称“完美”,其实只是为了抛砖引玉而已。
下一步将添加用户菜单功能,请大家测试和提出修改意见。

打印底注行(底端标题行).rar (89.52 KB, 下载次数: 2606) 插入底注、删除重复底注.gif

  1. '------------------------------------------------------------------------------
  2. ' 程序名称  :     PrintAnnotationsRows
  3. ' 中文名称  :     设置打印底注行
  4. ' 修改时间  :     2016-7-7 12:00
  5. '------------------------------------------------------------------------------
  6. ' 作者      :     cbtaja(极速蜗牛)
  7. ' Email     :     dengsch@foxmail.com
  8. '------------------------------------------------------------------------------
  9. ' 使用环境  :     Excel 2003及以上版本。
  10. ' 程序功能  :     为EXCEL补充“打印底注”功能(相对于系统内置的“打印标题”功能)
  11. ' 程序原理  :     首先,把“打印底注行”合并到“打印标题行”中,
  12. '                 以便借用系统来完成自动分页;
  13. '                 然后,把“底注行”复制到各分页处,;
  14. '                 最后,删除标题行中的“底注行”,完成目标。
  15. ' 程序特色  :     1、分页准确无误(因由系统实现自动分页,无计算误差);
  16. '                 2、适应EXCEL2003以上全系列版本;
  17. '                 3、适应所有工作表的格式:
  18. '                   不对原表格格式作任何限制,即可以设置任意行数的标题行和底注行,
  19. '                   且不限制标题行的起始行号;可一键复原;
  20. '                 4、功能完善,无需任何其它第三方软件辅助;
  21. '                 5、可一次预览所有打印页,不仅避免仅逐页预览的麻烦,
  22. '                   还避免逐页预览不能在页眉、页脚显示总页码的错误;
  23. '                 5、简单易用,人性化的交互功能,使得点击鼠标3次即可完成操作;
  24. '                 6、单文件,代码简单、且不含“用户窗体”,使用和移植都方便;
  25. '                 7、免费、开源;
  26. '------------------------------------------------------------------------------


  27. Option Explicit
  28. Sub PrintAnnotationsRows() '设置打印底注行
  29.     Dim PrintAnnotationsRows As Range, rCount&, rNums&()
  30.     Dim PAnttRowsCount&, endRow As Range, PtRows As Range
  31.     Dim PtRowsAddress$, PTRowsCount&, i&, t#, iEndCellRow&
  32.    
  33.     If MsgBox("是否自动复制到新表中处理?", vbYesNo) = vbYes Then _
  34.     ActiveSheet.Copy after:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
  35.     ActiveSheet.Columns.Find("*", , xlValues, , , 2).EntireRow.Cells(1).Select
  36.     On Error Resume Next
  37.     Set PrintAnnotationsRows = Application.InputBox("请指定底端附注行:", _
  38.         "设置底端标题", Type:=8).EntireRow
  39.     If Err.Number Then Exit Sub
  40.    
  41.     PAnttRowsCount = PrintAnnotationsRows.Rows.Count
  42.     Set endRow = PrintAnnotationsRows.Offset(-1).Resize(1)
  43.    
  44.     t = Timer
  45.     '首先,把底端附注行剪切至顶端标题行之上,并把该行加入到顶端标题行中
  46.     PrintAnnotationsRows.Cut
  47.     With PrintAnnotationsRows.Parent
  48.         PtRowsAddress = .PageSetup.PrintTitleRows '顶端标题行
  49.         If Len(PtRowsAddress) = 0 Then
  50.             Set PtRows = .Rows(1)
  51.             PTRowsCount = 0
  52.            Else
  53.             Set PtRows = .Rows(PtRowsAddress)
  54.             PTRowsCount = PtRows.Rows.Count
  55.         End If
  56.         PtRows.Insert Shift:=xlDown
  57.         .PageSetup.PrintTitleRows = PrintAnnotationsRows.Resize(PAnttRowsCount + _
  58.             PTRowsCount).Address
  59.         Application.ScreenUpdating = False
  60.         
  61.         '然后,根据系统自动分页结果,把包含水平分页符的行号记录以数组中
  62.         iEndCellRow = .Cells.Find("*", , xlValues, , , 2).Row
  63.         For i = 1 To iEndCellRow
  64.             If Rows(i).PageBreak <> xlNone Then
  65.                 rCount = rCount + 1
  66.                 ReDim Preserve rNums(1 To rCount)
  67.                 rNums(rCount) = i
  68.             End If
  69.         Next
  70.         
  71. '       由下向上,在每个水平分页符下面添加底注行
  72.         PrintAnnotationsRows.Copy
  73.         endRow.Offset(1).Insert Shift:=xlUp
  74.         For i = rCount To 1 Step -1
  75.             PrintAnnotationsRows.Copy
  76.             .Rows(rNums(i)).Insert Shift:=xlDown
  77.         Next
  78.         
  79.         '最后,从顶端标题行中删除原本除属于底注的行
  80.         PrintAnnotationsRows.Delete
  81.         
  82.         Application.CutCopyMode = False
  83.         Application.ScreenUpdating = True
  84.         .Cells(1).Select
  85.     End With
  86.     t = Timer - t
  87.     MsgBox Format(t, "用时0.0秒!")
  88.     Call PrintPreview
  89. End Sub

  90. Private Sub PrintPreview() '打印预览
  91.     ActiveWindow.SelectedSheets.PrintOut , , , True
  92. End Sub

  93. Sub RemoveDuplicateAnnotation() '删除重复的底注或标题行(表格复原功能)
  94.     Dim PrintAnnotationsRows As Range '
  95.     Dim ss As Worksheet, j&, s$, i&, s0$, arr, nPARowsCount&, iPARow&
  96.     On Error Resume Next
  97.     ActiveWorkbook.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Select
  98.     Set PrintAnnotationsRows = Application.InputBox("请指定底端附注行区域:", _
  99.         "设置底端标题", Type:=8).EntireRow
  100.     If Err.Number Then Exit Sub
  101.     Application.ScreenUpdating = False
  102.     Set ss = PrintAnnotationsRows.Parent
  103.     arr = PrintAnnotationsRows.Resize(1, 12)
  104.     For j = 1 To 12
  105.         s = s & arr(1, j)
  106.     Next
  107.     nPARowsCount = PrintAnnotationsRows.Rows.Count
  108.     With ss
  109.         iPARow = PrintAnnotationsRows.Offset(-1).Cells(1).Row
  110.         For i = iPARow To 1 Step -1
  111.             arr = .Cells(i, 1).Resize(1, 12)
  112.             s0 = ""
  113.             For j = 1 To 12
  114.                 s0 = s0 & arr(1, j)
  115.             Next
  116.             If s = s0 Then .Rows(i).Resize(nPARowsCount).Delete
  117.         Next
  118.         Application.ScreenUpdating = True
  119.         .Cells(1).Select
  120.     End With
  121. End Sub
复制代码



评分

5

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-7-8 09:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-7-8 09:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
测试了一下,用时都在10秒以上

TA的精华主题

TA的得分主题

发表于 2016-9-2 23:49 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-1-18 22:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-5-26 16:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-6-20 16:46 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-8-15 16:07 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-9-15 10:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
很不错的功能!

TA的精华主题

TA的得分主题

发表于 2018-5-20 16:05 | 显示全部楼层
帮楼主优化一下代码,效率提高4倍!
  1. '------------------------------------------------------------------------------
  2. ' 程序名称  :     PrintAnnotationsRows
  3. ' 中文名称  :     设置打印底注行
  4. ' 修改时间  :     2016-7-7 12:00
  5. '------------------------------------------------------------------------------
  6. ' 作者      :     cbtaja(极速蜗牛)
  7. ' Email     :     dengsch@foxmail.com
  8. '------------------------------------------------------------------------------
  9. ' 使用环境  :     Excel 2003及以上版本。
  10. ' 程序功能  :     为EXCEL补充“打印底注”功能(相对于系统内置的“打印标题”功能)
  11. ' 程序原理  :     首先,把“打印底注行”合并到“打印标题行”中,
  12. '                 以便借用系统来完成自动分页;
  13. '                 然后,把“底注行”复制到各分页处,;
  14. '                 最后,删除标题行中的“底注行”,完成目标。
  15. ' 程序特色  :     1、分页准确无误(因由系统实现自动分页,无计算误差);
  16. '                 2、适应EXCEL2003以上全系列版本;
  17. '                 3、适应所有工作表的格式:
  18. '                   不对原表格格式作任何限制,即可以设置任意行数的标题行和底注行,
  19. '                   且不限制标题行的起始行号;可一键复原;
  20. '                 4、功能完善,无需任何其它第三方软件辅助;
  21. '                 5、可一次预览所有打印页,不仅避免仅逐页预览的麻烦,
  22. '                   还避免逐页预览不能在页眉、页脚显示总页码的错误;
  23. '                 5、简单易用,人性化的交互功能,使得点击鼠标3次即可完成操作;
  24. '                 6、单文件,代码简单、且不含“用户窗体”,使用和移植都方便;
  25. '                 7、免费、开源;
  26. '------------------------------------------------------------------------------


  27. Option Explicit
  28. Sub PrintAnnotationsRows() '设置打印底注行
  29.     Dim PrintAnnotationsRows As Range, rCount&, rNums&()
  30.     Dim PAnttRowsCount&, endRow As Range, PtRows As Range
  31.     Dim PtRowsAddress$, PTRowsCount&, i&, t#, iEndCellRow&

  32.     If MsgBox("是否自动复制到新表中处理?", vbYesNo) = vbYes Then _
  33.     ActiveSheet.Copy after:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
  34.     ActiveSheet.Columns.Find("*", , xlValues, , , 2).EntireRow.Cells(1).Select
  35.     On Error Resume Next
  36.     Set PrintAnnotationsRows = Application.InputBox("请指定底端附注行:", _
  37.         "设置底端标题", Type:=8).EntireRow
  38.     If Err.Number Then Exit Sub

  39.     PAnttRowsCount = PrintAnnotationsRows.Rows.Count
  40.     Set endRow = PrintAnnotationsRows.Offset(-1).Resize(1)

  41.     t = Timer
  42.     '首先,把底端附注行剪切至顶端标题行之上,并把该行加入到顶端标题行中
  43.     PrintAnnotationsRows.Cut
  44.     With PrintAnnotationsRows.Parent
  45.         PtRowsAddress = .PageSetup.PrintTitleRows '顶端标题行
  46.         If Len(PtRowsAddress) = 0 Then
  47.             Set PtRows = .Rows(1)
  48.             PTRowsCount = 0
  49.            Else
  50.             Set PtRows = .Rows(PtRowsAddress)
  51.             PTRowsCount = PtRows.Rows.Count
  52.         End If
  53.         PtRows.Insert Shift:=xlDown
  54.         .PageSetup.PrintTitleRows = PrintAnnotationsRows.Resize(PAnttRowsCount + _
  55.             PTRowsCount).Address
  56.         Application.ScreenUpdating = False

  57.         Dim HPB As HPageBreak
  58.         For Each HPB In .HPageBreaks
  59.             rCount = rCount + 1
  60.             ReDim Preserve rNums(1 To rCount)
  61.             rNums(rCount) = HPB.Location.Row
  62.         Next



  63. '       由下向上,在每个水平分页符下面添加底注行
  64.         PrintAnnotationsRows.Copy
  65.         endRow.Offset(1).Insert Shift:=xlUp
  66.         For i = rCount To 1 Step -1
  67.             PrintAnnotationsRows.Copy
  68.             .Rows(rNums(i)).Insert Shift:=xlDown
  69.         Next

  70.         '最后,从顶端标题行中删除原本除属于底注的行
  71.         PrintAnnotationsRows.Delete

  72.         Application.CutCopyMode = False
  73.         Application.ScreenUpdating = True
  74.         .Cells(1).Select
  75.     End With
  76.     t = Timer - t
  77.     MsgBox Format(t, "用时0.0秒!")
  78.     Call PrintPreview
  79. End Sub

  80. Sub PrintPreview() '打印预览
  81.     ActiveWindow.SelectedSheets.PrintOut , , , True
  82. End Sub

  83. Sub RemoveDuplicateAnnotation() '删除重复的底注或标题行(表格复原功能)
  84.     Dim PrintAnnotationsRows As Range '
  85.     Dim ss As Worksheet, j&, s$, i&, s0$, arr, nPARowsCount&, iPARow&
  86.     On Error Resume Next
  87.     ActiveWorkbook.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Select
  88.     Set PrintAnnotationsRows = Application.InputBox("请指定底端附注行区域:", _
  89.         "设置底端标题", Type:=8).EntireRow
  90.     If Err.Number Then Exit Sub
  91.     Application.ScreenUpdating = False
  92.     Set ss = PrintAnnotationsRows.Parent
  93.     arr = PrintAnnotationsRows.Resize(1, 12)
  94.     For j = 1 To 12
  95.         s = s & arr(1, j)
  96.     Next
  97.     nPARowsCount = PrintAnnotationsRows.Rows.Count
  98.     With ss
  99.         iPARow = PrintAnnotationsRows.Offset(-1).Cells(1).Row
  100.         arr = .Range("A1").Resize(iPARow, 12)
  101.         For i = iPARow To 1 Step -1
  102.             s0 = ""
  103.             For j = 1 To 12
  104.                 s0 = s0 & arr(i, j)
  105.             Next
  106.             If s = s0 Then .Rows(i).Resize(nPARowsCount).Delete
  107.         Next
  108.         Application.ScreenUpdating = True
  109.         .Cells(1).Select
  110.     End With
  111. End Sub
复制代码



评分

4

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-19 01:55 , Processed in 0.059630 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表