VBA数组与字典解决方案第53讲:提取字典ITEM值的方案比较

2023-06-30 浏览次数 49

大家好,今日我们继续讲解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 在提取所有数据时为什么要进行两次装置呢?