|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 cbtaja 于 2016-7-8 17:02 编辑
功能完整、且简单易用的打印底注行(底端标题行)工具
EXCEL页面设置中包含了“打印标题”(PrintTitle)的设置,这为避免重复输入顶端标题行带来了很大方便。
但是,表格中除了打印“标题行”之外,往往还需要在每页底部附加“签字栏”等这样相对类似于“标题行”而存在的“底注行”。
而美中不足的是,EXCEL并没有内置该项页面设置功能。因此,强大的坛友们中编写了很多类似的“底端标题行”工具。
本人也来编写一个。虽然本工具颇有特色,但标题中号称“完美”,其实只是为了抛砖引玉而已。
下一步将添加用户菜单功能,请大家测试和提出修改意见。
打印底注行(底端标题行).rar
(89.52 KB, 下载次数: 2685)
- '------------------------------------------------------------------------------
- ' 程序名称 : PrintAnnotationsRows
- ' 中文名称 : 设置打印底注行
- ' 修改时间 : 2016-7-7 12:00
- '------------------------------------------------------------------------------
- ' 作者 : cbtaja(极速蜗牛)
- ' Email : dengsch@foxmail.com
- '------------------------------------------------------------------------------
- ' 使用环境 : Excel 2003及以上版本。
- ' 程序功能 : 为EXCEL补充“打印底注”功能(相对于系统内置的“打印标题”功能)
- ' 程序原理 : 首先,把“打印底注行”合并到“打印标题行”中,
- ' 以便借用系统来完成自动分页;
- ' 然后,把“底注行”复制到各分页处,;
- ' 最后,删除标题行中的“底注行”,完成目标。
- ' 程序特色 : 1、分页准确无误(因由系统实现自动分页,无计算误差);
- ' 2、适应EXCEL2003以上全系列版本;
- ' 3、适应所有工作表的格式:
- ' 不对原表格格式作任何限制,即可以设置任意行数的标题行和底注行,
- ' 且不限制标题行的起始行号;可一键复原;
- ' 4、功能完善,无需任何其它第三方软件辅助;
- ' 5、可一次预览所有打印页,不仅避免仅逐页预览的麻烦,
- ' 还避免逐页预览不能在页眉、页脚显示总页码的错误;
- ' 5、简单易用,人性化的交互功能,使得点击鼠标3次即可完成操作;
- ' 6、单文件,代码简单、且不含“用户窗体”,使用和移植都方便;
- ' 7、免费、开源;
- '------------------------------------------------------------------------------
- Option Explicit
- Sub PrintAnnotationsRows() '设置打印底注行
- Dim PrintAnnotationsRows As Range, rCount&, rNums&()
- Dim PAnttRowsCount&, endRow As Range, PtRows As Range
- Dim PtRowsAddress$, PTRowsCount&, i&, t#, iEndCellRow&
-
- If MsgBox("是否自动复制到新表中处理?", vbYesNo) = vbYes Then _
- ActiveSheet.Copy after:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
- ActiveSheet.Columns.Find("*", , xlValues, , , 2).EntireRow.Cells(1).Select
- On Error Resume Next
- Set PrintAnnotationsRows = Application.InputBox("请指定底端附注行:", _
- "设置底端标题", Type:=8).EntireRow
- If Err.Number Then Exit Sub
-
- PAnttRowsCount = PrintAnnotationsRows.Rows.Count
- Set endRow = PrintAnnotationsRows.Offset(-1).Resize(1)
-
- t = Timer
- '首先,把底端附注行剪切至顶端标题行之上,并把该行加入到顶端标题行中
- PrintAnnotationsRows.Cut
- With PrintAnnotationsRows.Parent
- PtRowsAddress = .PageSetup.PrintTitleRows '顶端标题行
- If Len(PtRowsAddress) = 0 Then
- Set PtRows = .Rows(1)
- PTRowsCount = 0
- Else
- Set PtRows = .Rows(PtRowsAddress)
- PTRowsCount = PtRows.Rows.Count
- End If
- PtRows.Insert Shift:=xlDown
- .PageSetup.PrintTitleRows = PrintAnnotationsRows.Resize(PAnttRowsCount + _
- PTRowsCount).Address
- Application.ScreenUpdating = False
-
- '然后,根据系统自动分页结果,把包含水平分页符的行号记录以数组中
- iEndCellRow = .Cells.Find("*", , xlValues, , , 2).Row
- For i = 1 To iEndCellRow
- If Rows(i).PageBreak <> xlNone Then
- rCount = rCount + 1
- ReDim Preserve rNums(1 To rCount)
- rNums(rCount) = i
- End If
- Next
-
- ' 由下向上,在每个水平分页符下面添加底注行
- PrintAnnotationsRows.Copy
- endRow.Offset(1).Insert Shift:=xlUp
- For i = rCount To 1 Step -1
- PrintAnnotationsRows.Copy
- .Rows(rNums(i)).Insert Shift:=xlDown
- Next
-
- '最后,从顶端标题行中删除原本除属于底注的行
- PrintAnnotationsRows.Delete
-
- Application.CutCopyMode = False
- Application.ScreenUpdating = True
- .Cells(1).Select
- End With
- t = Timer - t
- MsgBox Format(t, "用时0.0秒!")
- Call PrintPreview
- End Sub
- Private Sub PrintPreview() '打印预览
- ActiveWindow.SelectedSheets.PrintOut , , , True
- End Sub
- Sub RemoveDuplicateAnnotation() '删除重复的底注或标题行(表格复原功能)
- Dim PrintAnnotationsRows As Range '
- Dim ss As Worksheet, j&, s$, i&, s0$, arr, nPARowsCount&, iPARow&
- On Error Resume Next
- ActiveWorkbook.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Select
- Set PrintAnnotationsRows = Application.InputBox("请指定底端附注行区域:", _
- "设置底端标题", Type:=8).EntireRow
- If Err.Number Then Exit Sub
- Application.ScreenUpdating = False
- Set ss = PrintAnnotationsRows.Parent
- arr = PrintAnnotationsRows.Resize(1, 12)
- For j = 1 To 12
- s = s & arr(1, j)
- Next
- nPARowsCount = PrintAnnotationsRows.Rows.Count
- With ss
- iPARow = PrintAnnotationsRows.Offset(-1).Cells(1).Row
- For i = iPARow To 1 Step -1
- arr = .Cells(i, 1).Resize(1, 12)
- s0 = ""
- For j = 1 To 12
- s0 = s0 & arr(1, j)
- Next
- If s = s0 Then .Rows(i).Resize(nPARowsCount).Delete
- Next
- Application.ScreenUpdating = True
- .Cells(1).Select
- End With
- End Sub
复制代码
|
评分
-
5
查看全部评分
-
|