利用VBA字典实现三条件,结果唯一查询

大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解第83讲内容:利用字典实现三条件下,结果唯一查询。

在前几讲中,我分别讲了利用字典实现单条件,多值查询;双条件单值、多值查询几种情况的查询方法,今日我继续讲解三个条件下的唯一查询,也就是说要同时实现三个条件,这种情况下如果利用FIND,思路是:在实现第一个查询的基础上,要同时验证其他两个条件,才能返回数据,而利用字典可以实现一次直达返回,更突出显示了字典在查询方面的优势。利用字典实现三条件查询的方式仍是利用字典嵌套,这里将利用三级嵌套的模式来解决,大家要注意理解字典嵌套的写法,这和数据录入时下拉菜单的实现有着相似的地方,大家可以自己比较一下代码。下面我仍结合实例来讲解三条件下的唯一值查询。

实例,如下面的数据截图,在源数据中我要依照型号,类别,规格三个条件来查到现在库存的数量,如何实现呢?

利用VBA字典实现三条件,结果唯一查询

思路分析:利用字典嵌套的方法,第一层字典时以型号为键,第二层是以类别为键,第三册是以规格为键,然后将库存数量作为键值来给字典赋值,在查询的时候,可以依次按照上面的字典嵌套结构来查询。

下面看我给出的代码:

Sub mynzsz_83() '第83讲 利用字典实现三条件,结果唯一查询

Sheets("83").Select

'将数据存入数组

myarr = Range("a2:f" & Range("a2").End(xlDown).Row)

'创建字典对象

Set mydic = CreateObject("Scripting.Dictionary")

'在字典中装入数据

For i = 1 To UBound(myarr)

'这里利用了字典的嵌套

If Not mydic.exists(myarr(i, 1)) Then

Set mydic(myarr(i, 1)) = CreateObject("Scripting.Dictionary")

End If

If Not mydic(myarr(i, 1)).exists(myarr(i, 2)) Then

Set mydic(myarr(i, 1))(myarr(i, 2)) = CreateObject("Scripting.Dictionary")

End If

'mydic的键值是字典,这时字典的键值是一个一维数组

mydic(myarr(i, 1))(myarr(i, 2))(myarr(i, 3)) = myarr(i, 4)

Next

Set myRng = Range(Cells(2, "I"), Cells(Range("I2").End(xlDown).Row, "I"))

For Each uu In myRng

Cells(uu.Row, "L") = "" '清空回填数据区域

'填入查到的数据,在字典的嵌套中查找到键值,此时键值是数组,回填到区域

'注意下面语句的写法,不然会报错,字典最大的好处是在查找的时候,如果没有查到是不会报错的。

If mydic.exists(uu.Value) Then

If mydic(uu.Value).exists(Cells(uu.Row, "J").Value) Then

Cells(uu.Row, "L") = mydic(uu.Value)(Cells(uu.Row, "J").Value)

End If

End If

Next

Set mydic = Nothing

MsgBox ("ok")

End Sub

代码的截图:

利用VBA字典实现三条件,结果唯一查询

代码分析:

1 上面的代码实现了字典的三级嵌套来完成赋值和查询的过程:

Set mydic = CreateObject("Scripting.Dictionary");这是字典的最外层结构

Set mydic(myarr(i, 1)) = CreateObject("Scripting.Dictionary");将第一层字典的键值作为字典;

Set mydic(myarr(i, 1))(myarr(i, 2)) = CreateObject("Scripting.Dictionary"):将第二层字典的键值作为字典,实现字典的嵌套。

赋值:mydic(myarr(i, 1))(myarr(i, 2))(myarr(i, 3)) = myarr(i, 4)

2 '将数据存入数组

myarr = Range("a2:f" & Range("a2").End(xlDown).Row)

上述代码实现了数据数组装载,。

3 For i = 1 To UBound(myarr)

'这里利用了字典的嵌套

If Not mydic.exists(myarr(i, 1)) Then

Set mydic(myarr(i, 1)) = CreateObject("Scripting.Dictionary")

End If

If Not mydic(myarr(i, 1)).exists(myarr(i, 2)) Then

Set mydic(myarr(i, 1))(myarr(i, 2)) = CreateObject("Scripting.Dictionary")

End If

'mydic的键值是字典,这时字典的键值是一个一维数组

mydic(myarr(i, 1))(myarr(i, 2))(myarr(i, 3)) = myarr(i, 4)

Next

上述语句完成了字典的嵌套和赋值,注意在实现嵌套的时候要分层逐步实现,最后才是把数组数据赋给字典。

5 If mydic.exists(uu.Value) Then

If mydic(uu.Value).exists(Cells(uu.Row, "J").Value) Then

Cells(uu.Row, "L") = mydic(uu.Value)(Cells(uu.Row, "J").Value)(Cells(uu.Row, "K").Value)

End If

End If

Next

上述代码实现三层嵌套下的数据查询。

下面看代码的运行:

利用VBA字典实现三条件,结果唯一查询

今日内容回向:

1 如何理解字典的三层嵌套?

2 三条件查询在字典中是如何实现的?


分享到:


相關文章: