字典
题目要求
将课程名称以及挂科人数进行汇总
给出的数据是几十个班混在一起,挂科人数是每个班的人数,现在需要把他们相同的科目统计一个总人数
只看这个要求,其实用数据透视表可以很快得出结果,但是任何EXCEL的处理面对要批量处理的要求后,只能靠VBA才能完美解决
因此,我先用数据透视表给出结果,两者相互验算
这里用VBA处理需要字典,字典相当于将扫描的关键字存入,相同的累加其条目数,不同的则新建一个词条,然后进行处理。没有接触到字典之前,要做这种工作我都是一一比对的,效率低且容易出错。
我以为字典其实和链表应该有相似之处,字典是存关键字key和条目item或者说是值value
链表是存地址和值
字典思想很好理解,下面是代码应用:
Sub 字典demo()
Dim i As Integer, k As String, mydic As Object
Dim a(), b()
'用两个数组来接收最后的返回值
Set mydic = CreateObject("scripting.dictionary")
'字典也不是VBA的对象,需要单独创建
Set r = ActiveSheet.UsedRange
For i = 2 To r.Rows.Count + r.Row - 1
'用来确定最后一行的位置
k = Cells(i, 2)
'k存关键字
If mydic.exists(k) Then
'判断是否存在该关键字,即科目
mydic.Item(k) = mydic.Item(k) + Cells(i, 3).Value
'把关键字对应条目进行累加,即出现次数
Else
mydic.Add k, Cells(i, 3).Value
'把关键字对应的次数添加到字典中,确保一一对应
End If
Next i
i = mydic.Count
Cells(2, 9) = i
If i > 0 Then
a = mydic.keys()
'存放关键字
b = mydic.items()
'存放条目数,两个都有括号
Range(Cells(4, 8), Cells(i + 3, 8)) = Application.Transpose(a)
Range(Cells(4, 9), Cells(i + 3, 9)) = Application.Transpose(b)
'二维数组批量读写,加快读写速度
'利用转置,让数据按要求写入
End If
End Sub
批量读写那块不熟的话复习提高篇第四课深入理解单元格
求出的结果和数据透视表的结果一致,看来代码是正确执行的
补充一点用法
mydic.Key("线性代数与解析几何") = "线代"
'实现替换功能,把所有关键字进行替换
mydic.Remove ("线性代数与解析几何")
'删除掉这个关键字
mydic.RemoveAll
'清空所有关键字
另外,关键字不仅仅是字符串,还可以是数字,range对象
如果mydic(cells(1,2))就是把cell对象作为关键字,而不是cells.value
全局变量
这只是一个零碎的补充
Option Explicit
Dim x
Sub 全局变量()
x = x + 1
MsgBox x
End Sub
此时,x为模块级变量时,定义不写在子过程中,这里的x是静态变量,类似于C语言的static。 不管是private还是public,都还是静态变量。
每次运行,x会从1,变成2,变成3之类的等等。
可以通过关闭EXCEL文件而消失