文科生也能学会的Excel VBA 宏编程入门(二)——分类明细

任务介绍

上一回我们进行了分类汇总值的统计,这一回我们统计分类明细。具体任务目标为将下面“分数”sheet页按性别分成男/女两个sheet页,每个sheet页的结构一样。实际上就是将总表的各行分别复制到不同sheet页即可。
在这里插入图片描述

VBA编程

  1. 依次点击【开发工具】→【Visual Basic】,双击【ThisWorkbook】进入编程页面。如果想同时保留多个宏,也可以【右键】【插入模块】进入编程页面。
    在这里插入图片描述在这里插入图片描述
  2. 编写如下程序
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语句调用方是被复制的对象,输入参数是粘贴到的对象。可以简单理解为从语句左边的对象复制粘贴到右边的对象。
  1. 点击绿色小三角运行宏,或者点击【宏】找到这个宏并执行都可以运行这段程序。写在【模块】里的宏没有ThisWorkbook前缀。
    在这里插入图片描述
  2. 运行结果如下:
    在这里插入图片描述
    在这里插入图片描述
发布了22 篇原创文章 · 获赞 21 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/liucc09/article/details/104626588