字典含有重复的key不覆盖_VBA学习笔记28:VBA字典2

本文介绍了VBA字典在提取唯一值、进行求和和查找操作中的应用。通过装入数组并利用字典唯一key的特性,实现了对表格数据的高效处理。在查找功能中,字典可以实现双向查找,但需要注意重名情况可能导致的错误。
摘要由CSDN通过智能技术生成

f3db982e63945564b8212dd864dacb85.png

学习资源:《Excel VBA从入门到进阶》第28集 by兰色幻想

本课学习字典的唯一值、求和和查找。

一、字典与唯一值

例:提取“产品名称“表的不重复产品名称放在D列”提取唯一“表中。

6ab5ed12aabce3e17a238ab4780ecb84.png

思路:

  1. 把表格数据先装入数组(数组运行速度快)。
  2. 字典的key是唯一的,把产品名称数组放入key,item没有值就直接为空。
  3. 装入字典后,再读取字典到”提取唯一“表即可。
Sub 提取不重复的产品()
Dim d As New Dictionary
Dim arr, x

arr = Range("B3:B13")

For x = 1 To UBound(arr)
    d(arr(x, 1)) = ""
Next x
'这里不用add是为了避免key出现重复值导致运行出错。

Range("D3").Resize(d.Count) = Application.Transpose(d.Keys)

End Sub

dcf3ff7910218978da4747a31d8cc38a.png
运行结果

二、字典与求和

例:根据下表,计算各个商品的总销量,计算结果放入E3:F11。

951e3b62330b84cf0c263a8c61569b29.png

思路:

  1. 先把数据装入数组。
  2. 装入字典,同样利用key唯一原则,把商品名称当做key,如遇到不重复值,就把不重复值的数值加到对应的item里。
  3. 读取字典
Sub 汇总()
Dim d As New Dictionary
Dim arr, x

arr = Range("B3:C11")

For x = 1 To UBound(arr)
    d(arr(x, 1)) = d(arr(x, 1)) + arr(x, 2)
    'key对应的item的值在原来的基础上加新的
Next x

Range("E3").Resize(d.Count) = Application.Transpose(d.Keys)
Range("F3").Resize(d.Count) = Application.Transpose(d.Items)

End Sub

3c35803aba37c7b4fbe0514b291b8288.png
运行结果

三、字典与查找

例:把三张班级学生名单装进字典,设计为无论使用学号能找到姓名,用姓名能找到学号。

631949cf64c913aa74c6f25e3776b1c1.png

共有三个班级,表格所在位置是sheet4-6,序号在A列,姓名在B列。

3df2c6bc89c5d72989da75f2751e4d4b.png
“查找”sheet的界面

思路:

  1. 利用循环,先把数据装入数组。
  2. 把数组装入字典,因为无论输入姓名还是学号,都能查找到对应的值,那就把姓名和学号都作为key:当装入的key是姓名时,item就装入学号;当装入的key是学号时,item就装入姓名。
  3. 按输入值C2,读取字典,输入对应的item值
Sub 多表双向查找()
Dim d As New Dictionary
Dim x, y, a, b
Dim arr

For x = 4 To 6
    
b = Sheets(2).Name
a = Sheets(x).Range("a65536").End(xlUp).Row - 1
    arr = Sheets(x).Range("a2").Resize(Sheets(x).Range("a65536").End(xlUp).Row - 1, 2)

    For y = 1 To UBound(arr)
        d(arr(y, 1)) = arr(y, 2)
        d(arr(y, 2)) = arr(y, 1)
    Next y
    '以姓名和学号都作为key放入字典。
Next x

If Sheets("查找").Range("C2") <> "" Then Sheets("查找").Range("C3") = d(Sheets("查找").Range("C2").Value)

End Sub

d310de1cd672ce92deef873356920f0d.png
输入“云梦泽”,查找结果是A1,正确

10285cf86f79f52b67877f99b1904a8d.png
输入A1,查找结果是“云梦泽”,正确

932210245a76e9cef6f9eb2d18376922.png
字典d的item

注意:这个例子有个bug,就是重名的话,按姓名查找学号可能会有误,因为key值是唯一的,如果有重复值会覆盖原来item的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值