大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解第53讲:提取字典ITEM值的方案比较.
任何一个对象的引入都有其自身的特点,我们在应用的时候要根据这种对象自身的特点和实际需要灵活运用。今日要给大家讲解的是ITEM值提取问题,ITEM在一些资料中称为键值,有些资料称为项,我们要记住它是和KEY成对出现的,所有KEY组成了KEYS,所有ITEM组成了ITEMS,KEYS和ITEMS本身是数组,提取其中的数值要考虑到数组的一些特性。
实例讲解,如下数据;
我们先要把上述数据装入字典,装入字典时以A 列数据为键,对应的键值是BCD列数据的组成的数组,然后取出字典中最后一个ITEM。这个实例,对于实际数据处理非常有益,大家要理解我下面代码和后面解释,非常有用。
下面看我给出的代码:
Sub mynzsz_53() '第53讲 提取字典ITEM值的方案比较
Sheets("53").Select
Set mydic = CreateObject("Scripting.Dictionary")
myarr = Range("a1:d" & Range("a1").End(xlDown).Row)
For I = 1 To UBound(myarr)
If Not mydic.exists(myarr(I, 1)) Then mydic(myarr(I, 1)) = Array(myarr(I, 2), myarr(I, 3), myarr(I, 4))
Next
'提出键值的方案
'提出全部值,这个是非常简单的,要注意的是转置
'Range("g1").Resize(UBound(myarr), 3) = Application.Transpose(Application.Transpose(mydic.items))
'提出唯一值:字典中最后的值,方案一
' Range("g1").Resize(1, 3) = Application.Index(mydic.items, mydic.Count)
'提出唯一值:字典中最后的值,方案二(具有局限性)
'Range("g1").Resize(1, 3) = mydic.items(mydic.Count)
'提出唯一值:字典中最后的值,方案三
' t = mydic.items
'Range("g1").Resize(1, 3) = t(mydic.Count - 1)
'提出唯一值:字典中最后的值,方案四
I = 1
For Each u In mydic.keys
If I = mydic.Count Then Range("g1").Resize(1, 3) = mydic(u)
I = I + 1
Next
End Sub
代码截图:
代码解释:
1 上述代码实现了把数据装入字典,然后提取出其中一个键值的方法.
2 Set mydic = CreateObject("Scripting.Dictionary")
上述代码创建了一个字典对象,注意这种创建就是后期绑定,同前期绑定在代码书写上有不同,下面还会提到。我在这套教材中采用后期绑定的方案较多些,后期绑定方便了前期的处理,但在写代码时候要注意没有代码的提示。
3 myarr = Range("a1:d" & Range("a1").End(xlDown).Row)
上述代码将数据装入数组
4 For I = 1 To UBound(myarr)
If Not mydic.exists(myarr(I, 1)) Then mydic(myarr(I, 1)) = Array(myarr(I, 2), myarr(I, 3), myarr(I, 4))
Next
上述代码将数组数据装入字典,注意这里键值是Array(myarr(I, 2), myarr(I, 3), myarr(I, 4))
是一个数组。
5 '提出全部值,这个是非常简单的,要注意的是转置
'Range("g1").Resize(UBound(myarr), 3) = Application.Transpose(Application.Transpose(mydic.items))
上述方案是提出全部的值,我在代码中经常使用,这里大家想一想,为什么要两次装置呢?
6 '提出唯一值:字典中最后的值,方案一
' Range("g1").Resize(1, 3) = Application.Index(mydic.items, mydic.Count)
这是提取字典最后一个记录值的方案也是很简洁的代码用了Index函数,这个函数在将数组中有讲解,是提取某列数的基本函数.
7 '提出唯一值:字典中最后的值,方案二(具有局限性)
'Range("g1").Resize(1, 3) = mydic.items(mydic.Count)
上述代码直接提取字典 items 的第mydic.Count 个数值.但这种方案只能用于前期的字典绑定。
8 '提出唯一值:字典中最后的值,方案三
' t = mydic.items
'Range("g1").Resize(1, 3) = t(mydic.Count - 1)
上述代码先将 items 存于数组中,然后再提取第mydic.Count 个数值.
9 '提出唯一值:字典中最后的值,方案四
I = 1
For Each u In mydic.keys
If I = mydic.Count Then Range("g1").Resize(1, 3) = mydic(u)
I = I + 1
Next
上述代码是根据KEY的值提取ITEM的值。
代码运行:
今日内容回向:
1 上述对于提取ITEM方案是否理解?
2 在提取所有数据时为什么要进行两次装置呢?