全民一起VBA提高篇第十课:字典对象

字典

题目要求
将课程名称以及挂科人数进行汇总
给出的数据是几十个班混在一起,挂科人数是每个班的人数,现在需要把他们相同的科目统计一个总人数

在这里插入图片描述
在这里插入图片描述
只看这个要求,其实用数据透视表可以很快得出结果,但是任何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文件而消失

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值