VBA如何使用字典

我正在使用VBA中的字典出现问题。 我想从工作表添加值到字典。 如果我使用简单的列表,代码中没有错误。 喜欢这个。

Function Account(Place As String) As String Dim cities(500) Dim accounts(500) For i = 2 To 500 cities(i) = Worksheets("Sheet2").Cells(i, 2).Value accounts(i) = Worksheets("Sheet2").Cells(i, 3).Value Next i placeName = StrConv(Place, vbProperCase) Account = placeName End Function 

这段代码没有给出问题,但是如果我为字典添加代码,就有一些问题。

 Function Account(Place As String) As String Dim cities(500) Dim accounts(500) Dim dict Set dict = CreateObject(Scripting.Dictionary) For i = 2 To 500 cities(i) = Worksheets("Sheet2").Cells(i, 2).Value accounts(i) = Worksheets("Sheet2").Cells(i, 3).Value dict(cities(i)) = accounts(i) Next i placeName = StrConv(Place, vbProperCase) Account = placeName dict = Nothing End Function 

有人可以指出错误。 我是vba的新手,所以我不太了解它。

下面的UDF加载一个字典对象,其中包含作为键(唯一)的位置以及作为项的关联账户。 字典加载完成后,查找传入函数的Place参数,并返回该帐号。

 Option Explicit Function Account(Place As String) As String Static d As Long, dict As Object If dict Is Nothing Then Set dict = CreateObject("Scripting.Dictionary") dict.comparemode = vbTextCompare Else dict.RemoveAll End If With Worksheets("Sheet2") For d = 2 To .Cells(.Rows.Count, "B").End(xlUp).Row dict.Item(.Cells(d, "B").Value2) = .Cells(d, "C").Value2 Next d End With If dict.exists(Place) Then Account = dict.Item(Place) Else Account = "not found" End If End Function 

请注意,除了其他更正之外,实例化字典对象的代码是CreateObject("Scripting.Dictionary")而不是CreateObject(Scripting.Dictionary)

通过您的一个评论让人想起的一个可能的关注领域在于使用“Sheet1”和“Sheet2”。 在Excel VBA中,有两种不同的方式来引用工作表。 这是工作表的名称,这是用户在Excel中的选项卡上看到的,用户可以随意更改。 默认为“Sheet1”,“Sheet2”等名称

还有每个工作表的“代号”。 在Visual Basic编辑器中,项目资源pipe理器窗口将列出“Microsoft Excel对象”下的所有工作表。 在那里你会看到每个工作表的Codename,工作表的名字在括号中。

当您使用Worksheets(“Sheet1”)时,“Sheet1”引用名称,而不是代号。 最后可能会生成一个工作表,其名称为“Sheet1”,代号为“Sheet2”。

就你的职能而言,我注意到,在这两种情况下,你首先声明局部variables – 数组“城市”和“账户”,然后再加上第二个字​​典中的“字典”。 你有代码来填充这些局部variables,但是对他们什么也不做。 函数的返回值不依赖于任何这些局部variables。

一旦function代码完成,那些局部variables将失去它们的值。 VBA将用于存储这些variables的内存返回到其可用内存池,以便用于其他目的。

尝试注释整个for … next循环,你会看到函数的返回值没有改变。

我不确定你打算如何完成这些function。 这将有助于你解释这一点。

要使用CreateObject(Scripting.Dictionary)您必须引用“Microsoft脚本运行时”。 问题是你可能必须从微软网站升级.dll文件,因为你从当前的Windows安装的.dll不支持这种方法(我一直在与Windows 7版本的情况一样)。

但是,我试图到达我下载更新的微软页面,无法find它。 所以,我build议你交叉你的数组内容:

 Function Account(Place As String) As String Dim cities(500) Dim accounts(500) For i = 2 To 500 cities(i) = Worksheets("Sheet2").Cells(i, 2).Value accounts(i) = Worksheets("Sheet2").Cells(i, 3).Value Next i For i = 2 To 500 If cities(i) = Place Then placeName = accounts(i) Exit For End If Next i Account = placeName End Function