ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何让A列有合并单元格的工作簿在打印的时候不将一个合并单元格打印到两页里

如何让A列有合并单元格的工作簿在打印的时候不将一个合并单元格打印到两页里

作者:绿色风 分类: 时间:2022-08-17 浏览:144
楼主
kevinchengcw
Q: 我有一个工作表,在A列的分类项里采用了合并单元格的方式,打印的时候经常会遇到分页符在合并单元格中,造成一个单元格打印到了两页里,有没有什么办法可以避免这一问题出现呢?
A: 通过VBA的workbook_beforeprint事件我们完全可以实现在打印的时候将位于合并单元格中间的分页符调整到合并单元格上方,从而实现只打印完整的合并单元格的功能,代码如下(仅对A列合并单元格有效):
  1. Private Sub Workbook_BeforePrint(Cancel As Boolean)
  2. Dim Rng As Range
  3. Dim R, N, I As Integer
  4. ActiveWindow.View = xlPageBreakPreview  '打开分页预览,这样会出现分页符
  5. If ActiveSheet.HPageBreaks.Count > 0 Then  '当大于一页时执行代码
  6.     For N = 1 To ActiveSheet.HPageBreaks.Count   '循环列举各个水平分页符位置
  7.         R = ActiveSheet.HPageBreaks(N).Location.Row   '取得当前列举到的水平分布所在的行的值
  8.         I = R  '储存行值的备份
  9.         Cells(R, 1).Select  '选中当前行的第一列的单元格
  10.         If Selection.MergeCells = True And I > Selection.Row Then I = Selection.Row  '如果被选中的单元格是合并单元格,并且分页符所在的行值不是最顶部单元格的行值,则将最顶部的行值赋值给变量I
  11.         If I <> R Then ActiveSheet.HPageBreaks.Add before:=Cells(I, 1)  '如果I的值与当前分页符所在的行值不等,则添加分页符到合并单元格顶部的行的位置(注:这样自动分页符会删除,并重新生成新的整页的分页符)
  12.     Next N  '下一个水平分页符
  13. End If
  14. ActiveWindow.View = xlNormalView  '处理完成,恢复到普通视图
  15. End Sub


如果是其他列的单元格请调整cells(R,1).select里的1的值为对应的列值
2楼
wnianzhong
收藏了,以后能用的到,谢谢!
3楼
lrlxxqxa
这个功能实际工作中用得到
4楼
wygwyg0624
实用,顶了,找了好几天,先谢谢了
5楼
kevinchengcw
再来个功能升级版
,可以将合并单元格拆分到两页去.
  1. Private Sub Workbook_BeforePrint(Cancel As Boolean)
  2. Dim Rng As Range
  3. Dim R, N, I, A As Integer
  4. ActiveWindow.View = xlPageBreakPreview
  5. If ActiveSheet.HPageBreaks.Count > 0 Then
  6.     For N = 1 To ActiveSheet.HPageBreaks.Count
  7.         R = ActiveSheet.HPageBreaks(N).Location.Row
  8.         I = R
  9.         Cells(R, 1).Select
  10.         If Selection.MergeCells = True And I > Selection.Row Then
  11.             I = Selection.Row
  12.             If I <> R Then
  13.                 A = Selection.Row + Selection.Rows.Count - 1
  14.                 Selection.UnMerge
  15.                 Range(Cells(I, 1), Cells(R - 1, 1)).Merge
  16.                 Range(Cells(R, 1), Cells(A, 1)).Merge
  17.                 'Range(Cells(I, 1), Cells(A, 1)).Borders.LineStyle = 1   '这句如果有边框就取消前面的注释单引号
  18.                 Cells(R, 1) = Cells(I, 1).Value
  19.             End If
  20.         End If
  21.     Next N
  22. End If
  23. ActiveWindow.View = xlNormalView
  24. End Sub
6楼
wjc2090742
用的到。如果可以根据页面的内容多寡来判断是要调整分页符位置还是把合并单元格拆分就更完美了,那我就全不用手工了
7楼
yf_home
测试了一下,在Excel2003下效果不错,但在Excel2010没有效果,好像触发不了事件?
测试环境:xp繁体系统+OFFICE2010繁体家庭版

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap