常见字典用法集锦及代码详解(全) - 蓝桥玄霜 - 图文 联系客服

发布时间 : 星期二 文章常见字典用法集锦及代码详解(全) - 蓝桥玄霜 - 图文更新完毕开始阅读38a27ad776a20029bd642d2d

实例2 求多表的不重复值问题

图 实例2-1

这个问题也很适合用字典来解决。代码如下:

二、代码: Sub bcfz()

Dim i&, Myr&, Arr

Dim d, k, t, Sht As Worksheet

Set d = CreateObject(\For Each Sht In Sheets

If Sht.Name <> \Then Myr = Sht.[a65536].End(xlUp).Row Arr = Sht.Range(\& Myr) For i = 1 To UBound(Arr) d(Arr(i, 1)) = \ Next End If

13

常见字典用法集锦及代码详解

Next k = d.keys

Sheet4.[a3].Resize(d.Count, 1) = Application.Transpose(k) Set d = Nothing End Sub 三、代码详解

1、For Each Sht In Sheets :For Each…Next循环结构,这种形式是VBA特有的,

用于对对象的循环非常适用。意思是在所有的工作表中依次循环。

2、If Sht.Name <> \Then :如果这个工作表的名字不等于”Sheet4”时执行下面的代码。

3、Myr = Sht.[a65536].End(xlUp).Row :求得这个工作表A列有数据的最后一行的行数,把它赋给变量Myr。这里用了长整型数据类型(Long),数据范围最大可到2,147,483,647,是为了避免数据很多的时候会超出整型数据类型(Integer)而出错,因为整型数据类型数据范围最大只到32,767。

4、Arr = Sht.Range(\ :把A列数据赋给数组Arr。 5、For i = 1 To UBound(Arr) :For…Next循环结构,从1开始到数组的最大上限值之间循环。Ubound是VBA函数,返回数组的指定维数的最大值。

6、d(Arr(i, 1)) = “” :这句代码的意思就是把关键字Arr(i,1)加入字典,关键字对应的项为空,相当于字典中的这个关键字没有解释。和d.Add Arr(i,1), \的效果相同,只是代码更简洁一些。

7、k=d.keys :把字典d中存在的所有的关键字赋给变量k。得到的是一个一维数组,下限为0,上限为d.Count-1。Keys是字典的方法,前面已经讲过了。

8、Sheet4.[a3] .Resize(d.Count, 1) = Application.Transpose(k) :把字典d中所有的关键字赋给表4以a3单元格开始的单元格区域中。

代码执行后如图实例2-2所示。

14

实例3 A列中显示1 ~ 1000中被6除余1和余5 的数字

图 实例2-2

实例3 A列中显示1 ~ 1000中被6除余1和余5 的数字

一、问题的提出:

有1、2、3…1000一千个数字,要求编写一段代码,在工作表的A列显示这些数被6除余1和余5的数字。

二、代码:

Sub 余1余5() ?by:狼版主 Dim dic As Object, i As Long, arr

Set dic = CreateObject(\For i = 1 To 1000

dic.Add i & IIf(Abs(i Mod 6 - 3) = 2, \\\Next

15

常见字典用法集锦及代码详解

arr = WorksheetFunction.Transpose(Filter(dic.keys, \[a1].Resize(UBound(arr), 1) = arr [a:a].Replace \\Set dic = Nothing End Sub

三、代码详解

1、Dim dic As Object, i As Long, arr :也可把字典变量dic声明为对象(Object),i As Long是规范的写法,也可写成i& 。

2、dic.Add i & IIf(Abs(i Mod 6 - 3) = 2, \:这句代码的内容比较多,用了两个VBA函数IIf和Abs,用了一个Mod运算符。i Mod 6就是每一个数除6的余数,题目中有两个要求:余1和与5,为了从1到1000都同时能满足这两个要求,所以用了Abs(i Mod 6 - 3) = 2 ,Abs是取绝对值函数。另一个VBA函数IIf是根据判断条件返回结果,和If…Then判断结果类似;IIf(Abs(i Mod 6 - 3) = 2, \ 这段的意思是如果符合判断条件,返回”@”否则返回空””。 i & IIf(Abs(i Mod 6 - 3) = 2, \的意思是把这个数与”@”或者”””连起来作为关键字加入字典dic,关键字相对应的项为空。比如当i=1时,1是满足上述表达式的,就把”1@” 作为关键字加入字典dic;当i=2时,2不满足上述表达式,就把”2” 作为关键字加入字典dic,关键字相对应的项都为空。

3、arr = WorksheetFunction.Transpose(Filter(dic.keys, \ :这句代码的内容分为3部分,第1部分是Filter(dic.keys, \ 其中的Filter是一个VBA函数,VBA函数就是可以直接在代码中使用的,我们平常使用的函数叫工作表函数,如Sum、Sumif、Transpose等等。Filter函数要求在一维数组中筛选出符合条件的另一个一维数组,式中的dic.keys正是一个一维数组。这里的筛选条件是”@”,也就是把字典关键字中含有@的关键字筛选出来组成一个新的一维数组,其下标从零开始。第2部分是用工作表函数Transpose转置这个新的一维数组,工作表函数的使用在前面keys方法一节已经说过了;第2部分是把转置以后的值赋给数组变量Arr。

呵呵,狼版主的代码是短了,我的解释却太长了。

4、[a1].Resize(UBound(arr), 1) = arr :把数组Arr赋给[a1]单元格开始的区域中。 5、[a:a].Replace \ :把A列中的所有的@都替换为空白,只剩下数字了。

代码详解的4代码执行后,如图实例3-1所示。

16