Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 11331|回复: 7

[已解决]每页上有小计,最后一页上有总计

[复制链接]
发表于 2011-4-7 09:56 | 显示全部楼层 |阅读模式
让表格每页都打印标题行,这没问题。如何让每页上有小计,最后一页上有总计,请教?
最佳答案
2011-4-7 10:35
VBA吧。

Sub 新建分页小计()
    Dim iSubCol As Integer, rSubArea As Range
    Dim hb As HPageBreak

    ActiveWindow.View = xlPageBreakPreview  ' 进入 分页浏览 模式, 以便 EXCEL 正确计页
    Set r1stSubCell = Range("A3")           ' 本例名单从 A3 单元格开始
    iSubCol = 24                            ' 本例小计项共有 24 列

   
    ActiveSheet.HPageBreaks.Add Before:=r1stSubCell.End(xlDown).Offset(1, 0)

    ' 测试每一个分页符,
    ' 如果是自动分页符, 则在其上一行插入一小计行, 而本行纳入下一页
    ' 否则, 在本行插入一小计行
    For Each hb In ActiveSheet.HPageBreaks
        Set rCurrentCell = hb.Location
        rCurrentCell.Select                 ' 看看先

        If hb.Type = xlPageBreakAutomatic Then Set rCurrentCell = rCurrentCell.Offset(-1, 0)

        rCurrentCell.EntireRow.Insert
        Set rCurrentCell = rCurrentCell.Offset(-1, 0)

        ' 添加分页小计内容
        With rCurrentCell
            .Value = "小计"
            .Font.Bold = True

            Set rSubArea = .Offset(0, 1).Resize(1, iSubCol) ' 需要填充分页小计公式的区域
            
            ' 使用 SUBTOTAL 公式的好处是方便扩展, 且不会对已计算区域重复计算(如果可能发生这种情况的话)
            rSubArea.Formula = "=SUBTOTAL(9," & r1stSubCell.Offset(0, 1).Address(1, 0) & ":" & .Offset(-1, 1).Address(1, 0) & ")"

            Set r1stSubCell = .Offset(1, 0)
        End With
    Next

    ActiveWindow.View = xlNormalView
End Sub
你试一下。

好的话给个最佳了。。。。
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2011-4-7 10:06 | 显示全部楼层
页脚中选择"第1页,共?页",这样每一页都会显示第几页和共几页
回复

使用道具 举报

发表于 2011-4-7 10:09 | 显示全部楼层
这是我找来的。。。
讲述之前,特别强调,本文所述方法的前提是所要打印的数据行(不是指标题行)各行行高均相同,否则本法不适用。

步骤简述如下:

观察各页打印行数(若在普通视图页面下观察不到各页的打印行数,通过“打印预览”、“页面设置”或“视图”菜单下的“分页预览”等命令均可使分页位置观察线出现在普通视图页面下) 按“分页标志”列进行分类汇总(即上述辅助列,此处假设列名取“分页标志”)
详细步骤叙述如下:

在适当位置处添加一辅助列,作为后续的操作前提——按页数分类汇总,列字段可取名为“分页标志”。

注:若后续页不打印标题或者后续页的打印标题行数与第一页打印的标题行数不同,如图表所示,则参考步骤4所述来设置公式。

解释:图表表明第一页标题处可能存在第1~第2行的打印内容,即总共要打3行的标题,而从第二页起,标题处只有第3行的内容,即只打了1行的标题。

观察每页打印的数据行行数(事实上,若每页打印的标题内容都相同,即打印的标题行数相同,那么仅观察第1页即可),这里假设用“ n ”表示待打印的每页数据行行数,则在上述的辅助列相应行位置处输入下列公式:

公式中的“ x ”。具体说来,每页数据行第一行对于第二页等后续页来说,每页数据行第一行指的是分页线下的第一行。Word强大排版功能的话来说就是:所见即所得,即你所观测到的分页线下的第一行就是这里所说的每页数据行第一行。如中所示的第4应该为“ 3 ”。再假设经观察,发现每页待打印的数据行计有27行,那么公式为: =int((row()-3)/27),此处得到“ 0 ”值,表明是第“ 0 ”页。考虑到“ 0 ”页的表达方式与日常的表达思维习惯不相适应,故可把公式变通为:+1

若第一页与后续页的打印情况不同,比如后续页不打印图表所示的“××单位××月份工资表”正文标题这一行,仅打印表格的标题行,则后续页的“分页标志”公式应该重新设置,即与第一页的“分页标志”公式应有区别,以上述例子为例,假设观察后续各页(观察第二页即可)的打印行数计有29行,且后续页(即第二页)的数据行第一行的行号为“ 31 ”,则后续各页的公式就应该为:

=int((row()-30)/29)

最后补充:对于第4步骤的所述情况,由于新公式得到的结果与第一页公式得到的结果是一样的,均为“ 0 ”值,即所得到的分页标志是相同的,与我们想得到的效果有点出入,故可把公式变通如下(意思是值从2开始,分别为2、3、4……等):

同理,第一页的公式可相应更改为(意思是在“ 0 ”值的基础上加1,得到1;当然,也可不更改,原因如前批注所述):

对汇总行进行修饰,比如可在汇总行的适当位置列处添加“小计”或 “第X页小计”(用设置公式来达到这效果)等字样,通过对汇总行的字体、字号、颜色、填充色等的设置突出显示汇总行;

提示:①你可通过“分级显示符号”按钮暂时隐藏明细数据行,以方便对汇总行单元格的设置;②你可用“编辑”菜单下的“定位”→“可见单元格”命令来快速设置汇总行的单元格(或者用快捷键Alt+;(分号键)来快速定位可见单元格,此法应该是最高效的方法了);
回复

使用道具 举报

发表于 2011-4-7 10:35 | 显示全部楼层    本楼为最佳答案   
VBA吧。

Sub 新建分页小计()
    Dim iSubCol As Integer, rSubArea As Range
    Dim hb As HPageBreak

    ActiveWindow.View = xlPageBreakPreview  ' 进入 分页浏览 模式, 以便 EXCEL 正确计页
    Set r1stSubCell = Range("A3")           ' 本例名单从 A3 单元格开始
    iSubCol = 24                            ' 本例小计项共有 24 列

   
    ActiveSheet.HPageBreaks.Add Before:=r1stSubCell.End(xlDown).Offset(1, 0)

    ' 测试每一个分页符,
    ' 如果是自动分页符, 则在其上一行插入一小计行, 而本行纳入下一页
    ' 否则, 在本行插入一小计行
    For Each hb In ActiveSheet.HPageBreaks
        Set rCurrentCell = hb.Location
        rCurrentCell.Select                 ' 看看先

        If hb.Type = xlPageBreakAutomatic Then Set rCurrentCell = rCurrentCell.Offset(-1, 0)

        rCurrentCell.EntireRow.Insert
        Set rCurrentCell = rCurrentCell.Offset(-1, 0)

        ' 添加分页小计内容
        With rCurrentCell
            .Value = "小计"
            .Font.Bold = True

            Set rSubArea = .Offset(0, 1).Resize(1, iSubCol) ' 需要填充分页小计公式的区域
            
            ' 使用 SUBTOTAL 公式的好处是方便扩展, 且不会对已计算区域重复计算(如果可能发生这种情况的话)
            rSubArea.Formula = "=SUBTOTAL(9," & r1stSubCell.Offset(0, 1).Address(1, 0) & ":" & .Offset(-1, 1).Address(1, 0) & ")"

            Set r1stSubCell = .Offset(1, 0)
        End With
    Next

    ActiveWindow.View = xlNormalView
End Sub
你试一下。

好的话给个最佳了。。。。
回复

使用道具 举报

 楼主| 发表于 2011-4-7 12:07 | 显示全部楼层
回复 tony3 的帖子

好是好,没有合计与表格下面的内容均可能被统计成小计。
回复

使用道具 举报

发表于 2011-4-7 12:11 | 显示全部楼层
分类汇总就可以了

当然,如果经常用,VBA更方便一些
回复

使用道具 举报

发表于 2011-4-7 14:24 | 显示全部楼层
回复 wp8680 的帖子

这也也是我多年前在网上找到的。

最好再请版里的VBA高手修改一下。在最后加上合计。
回复

使用道具 举报

发表于 2011-4-8 10:17 | 显示全部楼层
本帖最后由 mytata 于 2011-12-30 10:06 编辑

有个技巧的:

1.先估计一页有多少列(可通过“打印预览”来看,我这47列一页,)因设置了“顶标题行”占了一列,等下分类汇总要占一列,就只须在辅助列(如A列)A2:A46填充45个个1,A47输入公式“=A2+1”,再往下填充直到最后。
2.选中辅助列A:A,复制 --》选择性粘贴----->数值,以去掉公式。
2、“数据/分类汇总/分类字段/辅助列/汇总方式/求和/选定汇总项/英语、数学…/汇总结果显示在数据下方/确定”

未尾小计.rar

6.14 KB, 下载次数: 316

回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-17 01:32 , Processed in 0.331409 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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