VBA中后期绑定SortedList添加项后无法读取的问题排查
搞定VBA里的SortedList读取问题
嘿,我懂你用惯了Dictionary突然转SortedList的别扭感——你遇到的坑其实是两者在API上的细微差别,再加上循环变量的小疏忽,才导致读不出内容。咱们一步步拆解问题,给你捋明白怎么改:
核心问题1:SortedList的Keys/Items是方法,必须加括号调用
Dictionary里dict.Keys直接就能拿到键集合,但SortedList的Keys()是返回数组的方法,必须加括号!你之前写的sortList.keys根本没正确获取到键数组,自然遍历不出东西。
核心问题2:循环变量i没重置
你前面填充数据时i已经跑到了7,后面读取时直接复用这个变量的话,会从第8行开始写入,看起来就像没输出一样,得把i重新设回1才行。
修正后的完整代码
这里给你调整好的代码,两种遍历方式都写上了,你可以选自己顺手的:
Option Explicit Sub testing() Dim sortList As Object Dim dict As Object Set sortList = CreateObject("System.Collections.SortedList") Set dict = CreateObject("Scripting.Dictionary") Dim i As Long Dim key As Variant Dim item As Variant ' 填充数据,这部分你的写法没问题 For i = 1 To 7 key = Sheet1.Cells(i, 1) item = Sheet1.Cells(i, 2) dict.Add key, item sortList.Add key, item Next i ' 方式1:转成数组后用For Each遍历 Dim keysArr As Variant keysArr = sortList.Keys() ' 必须加括号获取键数组 i = 1 ' 重置循环变量,从第一行开始写 For Each key In keysArr Sheet1.Cells(i, 6) = key Sheet1.Cells(i, 7) = sortList.Item(key) ' Item属性也可以直接写sortList(key),和Dictionary用法一致 i = i + 1 Next key ' 方式2:用索引遍历(SortedList是0基索引,这种方式更高效) ' For i = 0 To sortList.Count - 1 ' Sheet1.Cells(i + 1, 6) = sortList.GetKey(i) ' Sheet1.Cells(i + 1, 7) = sortList.GetByIndex(i) ' Next i End Sub
额外注意点
- SortedList是0基索引,用
GetKey(index)和GetByIndex(index)的时候要从0开始计数,这和Dictionary的遍历逻辑略有不同,但好处是能直接按排序后的顺序访问数据。 - 你之前以为SortedList需要Objects类型其实不对,它完全支持字符串、数字这些基本类型,只要键的类型统一就行(混合类型会导致排序出错)。
- SortedList的
Item属性和Dictionary用法一致,既可以写sortList(key)也可以写sortList.Item(key),两种写法都有效。
内容的提问来源于stack exchange,提问作者Raystafarian
相关产品推荐
相关产品推荐

