找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4075|回复: 0

Excel技巧—实现分页小计与合计2009-10-22 23:49Excel技巧—实现分页小计与合计

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-6-23 21:45:22 | 显示全部楼层 |阅读模式
Excel技巧—实现分页小计与合计
2009-10-22 23:49

Excel技巧—实现分页小计与合计

实现分页小计与合计:可以采用函数法、VBA等等,下面提供VBA的一种实现方法。

分页小计(采用VBA)

1、建立模块:m分页小计1

代码

Dim rCurrentCell As Range   ' 每一页之分页小计所在单元格

Public ll(50)

Dim r1stSubCell As Range    ' 小计区域第一个单元格

' -------------------------------------------------

' 从这里开始执行

Sub Main()

    t = Timer

    Application.ScreenUpdating = False

    Worksheets("sheet1").Activate

    删除分页符

    Set r1stSubCell = Range("A5")           ' 本例名单从 A5 单元格开始

    For Each rCurrentCell In Range(r1stSubCell, r1stSubCell.End(xlDown))

        If rCurrentCell = "本页小计" Or rCurrentCell = "总 计" Then rCurrentCell.EntireRow.Delete

    Next

    Set r1stSubCell = Range("A5")           ' 本例名单从 A5 单元格开始

    For Each rCurrentCell In Range(r1stSubCell, r1stSubCell.End(xlDown))

        If rCurrentCell = "本页小计" Or rCurrentCell = "总 计" Then rCurrentCell.EntireRow.Delete

    Next

    新建分页小计

    Range("A5").Activate

   ' MsgBox "分页小计已完成!" & Chr(13) & "共用时间" & Round(Timer - t, 2) & "秒"

    Application.ScreenUpdating = True

End Sub

' -------------------------------------------------

Sub 删除原有的分页小计行()

    Application.ScreenUpdating = False

    Set r1stSubCell = Range("A5")           ' 本例名单从 A5 单元格开始

    For Each rCurrentCell In Range(r1stSubCell, r1stSubCell.End(xlDown))

        If rCurrentCell = "本页小计" Or rCurrentCell = "总 计" Then rCurrentCell.EntireRow.Delete

    Next

    Set r1stSubCell = Range("A5")           ' 本例名单从 A5 单元格开始

    For Each rCurrentCell In Range(r1stSubCell, r1stSubCell.End(xlDown))

        If rCurrentCell = "本页小计" Or rCurrentCell = "总 计" Then rCurrentCell.EntireRow.Delete

    Next

    Range("A1").Activate

    MsgBox "已成功删除分页小计"

    Application.ScreenUpdating = True

End Sub

Sub 新建分页小计()

    Application.ScreenUpdating = False

   

    t = UserForm1.TextBox1.Value & ","

    l = Len(t)

    t1 = ""

    'Dim ll(50)

    Unload UserForm1

    P = 1

    For n = 1 To l

        w = Application.WorksheetFunction.Find(",", t, n)

        ll(P) = Mid(t, n, w - n)

        If IsNumeric(Val(ll(P))) = False Or Val(ll(P)) < 2 Then

            MsgBox "输入错误,请重新输入"

            GoTo AAA

        End If

        P = P + 1

        n = w

        If n >= l Then Exit For

    Next

    Dim iSubCol As Integer, rSubArea As Range

    Dim hb As HPageBreak

    Worksheets("sheet1").Activate

    Rows(Range("a65536").End(xlUp).Row).Copy Range("a" & Range("a65536").End(xlUp).Row + 1)

    Rows(Range("a65536").End(xlUp).Row).ClearContents

    Range("a" & Range("a65536").End(xlUp).Row + 1) = " "

    ActiveWindow.View = xlPageBreakPreview ' 进入 分页浏览 模式, 以便 EXCEL 正确计页

    Set r1stSubCell = Range("A5")           ' 本例名单从 A5 单元格开始

    iSubCol = 9                           ' 本例小计项共有 20 列


    ' 最后一行插入手工分页符

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

    ActiveSheet.HPageBreaks.Add Before:=Range("a65536").End(xlUp)

    ' 测试每一个分页符,

    ' 如果是自动分页符, 则在其上一行插入一小计行, 而本行纳入下一页

    ' 否则, 在本行插入一小计行

    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 = Application.Union(Range("d" & rCurrentCell.Row), Range("u" & rCurrentCell.Row)) ' 需要填充分页小计公式的区域

            ' Set rSubArea = Range("b" & rCurrentCell.Row, "T" & rCurrentCell.Row) ' 需要填充分页小计公式的区域

            ' 使用 SUBTOTAL 公式的好处是方便扩展, 且不会对已计算区域重复计算(如果可能发生这种情况的话)

            ' rSubArea.Formula = "=SUBTOTAL(9," & r1stSubCell.Offset(0, 1).Address(1, 0) & ":" & .Offset(-1, 1).Address(1, 0) & ")"

            For yy = 1 To P - 1

                .Offset(0, ll(yy) - 1).Formula = "=SUBTOTAL(9," & r1stSubCell.Offset(0, ll(yy) - 1).Address(1, 0) & ":" & .Offset(-1, ll(yy) - 1).Address(1, 0) & ")"

            Next


            Set r1stSubCell = .Offset(1, 0)

        End With

    Next

    Rows(Range("a65536").End(xlUp).Row).Clear

    If Range("A65536").End(xlUp) = " " Then Rows(Range("a65536").End(xlUp).Row).Clear

    Rows(Range("a65536").End(xlUp).Row).Copy Range("a" & Range("a65536").End(xlUp).Row + 1)

    Rows(Range("a65536").End(xlUp).Row).ClearContents

    With Range("A" & Range("A65536").End(xlUp).Row + 1)

        .Value = "总 计"

        .Font.Bold = True

        For yy = 1 To P - 1

            .Offset(0, ll(yy) - 1).Formula = "=SUBTOTAL(9," & Cells(5, ll(yy) - 0).Address & ":" & .Offset(-1, ll(yy) - 1).Address & ")"

        Next

    End With

    ' Set rSubArea = Range("b" & Range("A65536").End(xlUp).Row, "T" & Range("A65536").End(xlUp).Row)

    ' rSubArea.Offset(0, 0) = "=SUBTOTAL(9," & "B5:B" & Range("A65536").End(xlUp).Row - 1 & ")"

    删除分页符

    ActiveWindow.View = xlNormalView

    End

AAA:

    UserForm1.Show

   

End Sub

Sub 删除分页符()

On Error Resume Next

    t = ActiveSheet.HPageBreaks.Count

    For n = t To 1 Step -1

        If ActiveSheet.HPageBreaks(n).Extent = xlPageBreakFull Then

            ActiveSheet.HPageBreaks(n).Delete

        End If

        t = ActiveSheet.HPageBreaks.Count

    Next

End Sub

2、建立模块:模块1

代码

Public P

Sub a()

UserForm1.Show

End Sub

3、建立窗体:UserForm1

并在窗体上建立TextBox1控件

窗体代码

Private Sub CommandButton1_Click()

Main

End Sub


【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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