任务介绍
上一回我们进行了分类汇总值的统计,这一回我们统计分类明细。具体任务目标为将下面“分数”sheet页按性别分成男/女两个sheet页,每个sheet页的结构一样。实际上就是将总表的各行分别复制到不同sheet页即可。
VBA编程
- 依次点击【开发工具】→【Visual Basic】,双击【ThisWorkbook】进入编程页面。如果想同时保留多个宏,也可以【右键】【插入模块】进入编程页面。
- 编写如下程序
Sub 分类明细统计()
'
' 按分类统计明细
'
'
Dim maleRow, femaleRow As Long '用于记录两个分sheet页分别记录到哪一行了
maleRow = 2
femaleRow = 2
Dim nameList() As String '定义一个字符串数组
nameList = Split("男生,女生", ",") '通过Split函数将字符串通过“,”分割成字符串数组
'删除sheet
For Each name In nameList '循环语句,遍历nameList数组中的每一个字符串
On Error Resume Next '出错后继续执行。因为sheet不存在时删除会报错
Application.DisplayAlerts = False '关闭弹窗提示
Sheets(name).Delete
Application.DisplayAlerts = True '打开弹窗提示
On Error GoTo 0 '取消出错后继续执行
Next
Sheets("分数").Select
'创建sheet
For Each name In nameList
Sheets.Add after:=ActiveSheet '在当前激活的Sheet后面添加一个新的sheet
ActiveSheet.name = name '新添加的sheet会变成当前激活的sheet,所以给ActiveSheet改名即可
Sheets("分数").Rows(1).Copy ActiveSheet.Rows(1) '将分数的第一行标题复制到新建的sheet的第一行
Next
Dim row, rowNumber As Long
row = 2
rowNumber = Sheets("分数").UsedRange.Rows.Count '获取分数的总行数
Do While row <= rowNumber '用于判断是否到最后一行
If Sheets("分数").Range("B" & row) Like "男" Then
Sheets("分数").Rows(row).Copy Sheets("男生").Rows(maleRow)
maleRow = maleRow + 1
Else
Sheets("分数").Rows(row).Copy Sheets("女生").Rows(femaleRow)
femaleRow = femaleRow + 1
End If
row = row + 1
Loop
End Sub
- 下面对程序中一部分内容进行说明,这里
Dim maleRow, femaleRow As Long
采用了Long
类型,Long
是长整型,VBA中,Integer
类型的范围是-32768–32767,由于担心Excel表行数超出3万多条,因此采用Long
型,范围是-2147483648 – 2147483648,肯定够用。 Dim nameList() As String
是定义一个字符串数组,也就是说VBA里面在变量名后面加个括号就可以定义成数组类型,定义成数组类型是为了方便通过循环的方式遍历数组里面的内容,避免大量重复的代码。nameList = Split("男生,女生", ",")
,这里用VBA自带的Split函数将字符串"男生,女生"
通过逗号分割成字符串数组{"男生","女生"}
。For Each
是VBA中常用来遍历数组的循环语句,每次从数组中顺序取出一个值赋给变量,直到取完。
For Each 变量 In 数组变量
...程序
Next
On Error Resume Next
的意思是当发生错误的时候,无视错误并继续运行。该语句对整个Sub
内的代码都有效,如果要关闭这个功能,需使用语句On Error GoTo 0
。这里使用这个语句是删除不存在的Sheet页时会报错,因此跳过错误继续删除下一个。Application.DisplayAlerts = False
是用来关闭弹窗,不然每次删除一个Sheet的时候都会弹出一个烦人的提示窗。Sheets("分数").Select
顾名思义就是选中“分数”这个Sheet页,相当于用鼠标点击了这个Sheet页标签一样,目的是为了让它成为当前激活的Sheet页。Sheets.Add after:=ActiveSheet
是在激活的Sheet页后面添加一个新的Sheet页。VBA中,符号:=
是用来给函数的输入参数赋值。也就是说Add
这个函数有一个名叫after
的输入参数,用于告诉Add
函数在哪个Sheet页后面添加一个新的Sheet页。显然,Add
函数也有一个叫before
的参数用来在某个Sheet页前面添加一个新的Sheet页,具体可以查VBA文档。而我们希望的是在当前激活的Sheet页后面添加一个新的Sheet页。需要注意的是,每个新添加的Sheet页会变成当前激活的Sheet页。Sheets("分数").Rows(row).Copy Sheets("男生").Rows(maleRow)
,VBA的Copy语句调用方是被复制的对象,输入参数是粘贴到的对象。可以简单理解为从语句左边的对象复制粘贴到右边的对象。
- 点击绿色小三角运行宏,或者点击【宏】找到这个宏并执行都可以运行这段程序。写在【模块】里的宏没有ThisWorkbook前缀。
- 运行结果如下: