20170727xlVBA根据总名单和模板生成多页名单

Sub CountingDown()
    Dim Dic As Object    '用于分类统计
    Dim i As Long
    Dim CountDown As Long    '每页最多几条信息
    Dim x As Long, y As Long
    Dim Page As Long    '页数
    Dim Index As Long    '每页的序号
    Dim Sht As Worksheet
    Dim StartRow As Long, EndRow As Long    '分页的起始行

    Dim mRng As Range    '模板区域
    Set mRng = Sheets("受理模板").Range("A1:J26")    '保存模板区域行高与列宽

    With Sheets("总名单")
        Page = 0    '分页序号
        Index = 0    '姓名序号

        '开始划分第一页
        i = 2
        StartRow = 2
        CountDown = 36    '开始倒数信息条数
        Set Dic = CreateObject("Scripting.Dictionary")

        Do While .Cells(i, 1).Value <> ""    '循环连续非空行
            CountDown = CountDown - 1    '倒数-1

            Key = Trim(.Cells(i, 4).Text)    '获取分类
            If Len(Key) > 2 Then Key = "增驾"    '处理分类

            If Dic.Exists(Key) = False Then    '若是新增的分类
                Dic(Key) = 1    '开始计数
                CountDown = CountDown - 1    '分类统计需要占用一行
            Else
                Dic(Key) = Dic(Key) + 1    '如果不是新增的分类,分类计数
            End If


            If CountDown = 0 Or .Cells(i + 1, 1).Value = "" Then    '若满一页,或者结束
                Page = Page + 1    '新增一页
                NewName = "受理名单" & Page    '获取新表名
                CopyModel NewName    '新增名单表
                Set Sht = Sheets(NewName)

                EndRow = i    '保存结束行

                '初始化 每一页的行列号
                x = 0
                y = 1
                'Index = 0  '改为从一开始算
                '内循环
                For Each k In Dic.keys    '循环每个类别
                    For n = StartRow To EndRow    '循环刚统计的每个人
                        '处理类别
                        Key = Trim(.Cells(n, 4).Text)
                        If Len(Key) > 2 Then Key = "增驾"

                        '如果类别符合,则输出
                        If Key = k Then
                            '每满18行,换列
                            If x = 18 Then
                                x = 0
                                y = 6
                            End If

                            '累计序号
                            Index = Index + 1
                            
                            '累计信息序号(包括分类)
                            x = x + 1
                              
                            '输出相应的信息
                            Sht.Cells(3 + x, y).Value = Index
                            Sht.Cells(3 + x, y + 1).Value = .Cells(n, 1).Value
                            Sht.Cells(3 + x, y + 2).Value = "'" & .Cells(n, 2).Value
               
                        End If
                    Next n
                    
                    
                    '每满18行,换列
                    If x = 18 Then
                        x = 0
                        y = 6
                    End If
                    x = x + 1
                    '输出分类统计结果
                    Sht.Cells(3 + x, y + 2).Value = k & Dic(k) & "人"
                  
                Next k
                  
                '保持模板行高
                For x = 1 To 26
                    Sht.Rows(1).RowHeight = mRng.Rows(x).RowHeight
                Next x
                For y = 1 To 10
                    Sht.Columns(y).ColumnWidth = mRng.Columns(y).ColumnWidth
                Next y

                '开始下一页
                StartRow = EndRow + 1
                CountDown = 36
                Set Dic = CreateObject("Scripting.Dictionary")
            End If
            
            i = i + 1
        Loop
    End With

    Set Sht = Nothing
    Set Dic = Nothing

End Sub
Sub CopyModel(ByVal NewName As String)
    Dim mSht As Worksheet
    Dim NewSht As Worksheet
    Set mSht = Sheets("受理模板")
    mSht.Copy After:=Sheets(Sheets.Count)
    Set NewSht = Sheets(Sheets.Count)
    On Error Resume Next
    Sheets(NewName).Delete
    On Error GoTo 0
    NewSht.Name = NewName
End Sub

  

原文地址:https://www.cnblogs.com/nextseven/p/7247838.html