为何VBA子过程中Scripting.Dictionary无法正常工作?
为什么两段VBA代码运行结果不同?
嘿,咱们直接戳核心差异点,就能搞懂为啥一个不行一个能正常跑了:
第一个版本的问题:每次调用子过程都新建字典
在第一个无法正常运行的版本里,你把Scripting.Dictionary的声明放在了arrange_duplicates子过程内部:
Sub arrange_duplicates(i As Integer, fruit As String) Dim dict As New Scripting.Dictionary ' 每次调用这个子过程,都会新建一个空字典! If dict.Exists(fruit) Then Cells(i, 2).Value = "It already exists" Else dict.Add fruit, i End If End Sub
这里的坑在于:每次调用这个子过程,都会创建一个全新的、空的字典实例。
- 第一次循环(i=1):字典是空的,检测不到"apple",就把它加进去
- 第二次循环(i=2):又新建了一个空字典,还是检测不到"apple",自然不会执行写入提示的逻辑
子过程执行完后,这个局部的字典变量就被销毁了,完全没法记录之前的状态,相当于每次都是从零开始判断,根本做不到“检测是否已存在”。
第二个版本的关键:共用同一个字典实例
而能正常运行的版本,把字典的声明移到了主过程里,然后通过参数传递给子过程:
' 主过程里声明字典 Private Sub CommandButton1_Click() Dim dict As New Scripting.Dictionary ' 整个循环共用这一个字典 Dim i As Integer Dim fruit As String fruit = "apple" For i = 1 To 2 Call arrange_duplicates(i, fruit, dict) ' 把同一个字典传给子过程 Next i End Sub ' 子过程接收外部传来的字典 Sub arrange_duplicates(i As Integer, fruit As String, dict as Scripting.Dictionary) If dict.Exists(fruit) Then Cells(i, 2).Value = "It already exists" Else dict.Add fruit, i End If End Sub
这里的核心是:整个循环过程中,始终使用同一个字典实例。
- 第一次循环(i=1):字典是空的,添加"apple"
- 第二次循环(i=2):字典里已经有"apple"了,检测到存在,就会在对应单元格写入提示
简单说,第一个版本是“每次判断都用新本子记东西”,第二个版本是“用同一个本子记所有东西,下次判断直接看这个本子”,结果自然天差地别。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

