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
原文:http://www.cnblogs.com/nextseven/p/7247838.html