访问字典内排序列表时出现Type Mismatch Error问题咨询
看起来你在处理VBA字典和排序列表时碰到了Type Mismatch Error——这在对象赋值或者类型混淆时很常见,我来帮你梳理下可能的原因和解决办法:
1. 先确认字典里存的到底是什么类型
首先要排查的是GetAmbStpMappingsDict函数返回的字典中,每个键对应的值是不是真的排序列表对象。类型不匹配往往是因为你以为存的是SortedList,但实际可能是数组、单个值或者未初始化的对象。
你可以在创建字典后加一段调试代码,打印每个值的类型:
Dim mappingsDict As Object Set mappingsDict = GetAmbStpMappingsDict(AmbSTPLkupArr) Dim key As Variant For Each key In mappingsDict.Keys Debug.Print "键: " & key & ", 值的类型: " & TypeName(mappingsDict(key)) Next key
如果输出不是SortedList(假设你用的是VB自带的SortedList),那问题就出在GetAmbStpMappingsDict函数内部的创建逻辑上。
2. 检查排序列表的创建逻辑
在GetAmbStpMappingsDict里,要确保每个键对应的是正确初始化的SortedList对象,而不是随便赋值的数组或者变量。比如正确的创建方式应该是:
' 在函数内部创建排序列表并添加到字典 Dim sl As New SortedList ' 这里向sl中添加数据,比如从AmbSTPLkupArr取对应值 sl.Add "someValue", "someKey" ' 将排序列表添加到字典 mappingsDict.Add targetKey, sl
如果函数里直接把数组赋值给字典键,或者没有用New初始化SortedList就赋值,那字典里存的就不是你想要的排序列表,访问时自然会类型不匹配。
3. 检查排序列表的访问方式
访问字典中的排序列表时,一定要注意对象赋值的语法。SortedList是对象,所以需要用Set关键字把字典返回的对象赋值给变量,再进行操作:
' 错误示例:没有用Set,直接赋值会触发类型不匹配 Dim targetSL As SortedList targetSL = mappingsDict("East Midlands") ' ❌ 这里会报错 ' 正确示例:用Set赋值对象 Dim targetSL As SortedList Set targetSL = mappingsDict("East Midlands") ' ✅ ' 然后访问列表元素 Debug.Print targetSL.Item(0) ' 获取第一个元素
如果你直接用mappingsDict("East Midlands")(0)这种方式访问,也要确保字典返回的确实是SortedList,否则同样会类型不匹配。
4. 结合你的数据场景排查
从你提供的dataResponseTimes样本数据来看,字典的键应该是Amb列的区域名称(比如"East Midlands")。你可以额外检查:
AmbSTPLkupArr数组中的数据是否有异常(比如空值、格式错误),导致创建SortedList时没有正确添加元素- 函数中是否正确遍历了
AmbSTPLkupArr,有没有把错误类型的数据塞进了排序列表
快速定位问题的测试代码
最后给你一段完整的测试代码,帮你快速定位问题所在:
Sub TestDictionaryMappings() Dim AmbSTPLkupArr As Variant Dim mappingsDict As Object ' 假设你已经把Lkups表的数据读取到AmbSTPLkupArr中 AmbSTPLkupArr = ThisWorkbook.Worksheets("Lkups").UsedRange.Value Set mappingsDict = GetAmbStpMappingsDict(AmbSTPLkupArr) ' 遍历字典,检查每个键值对的类型和内容 Dim key As Variant For Each key In mappingsDict.Keys Debug.Print "------------------------" Debug.Print "键: " & key Debug.Print "值的类型: " & TypeName(mappingsDict(key)) If TypeName(mappingsDict(key)) = "SortedList" Then Dim sl As SortedList Set sl = mappingsDict(key) Debug.Print "排序列表元素数量: " & sl.Count If sl.Count > 0 Then Debug.Print "第一个元素值: " & sl.Item(0) End If End If Next key End Sub
运行这段代码后,查看立即窗口的输出,就能清楚看到字典里存的是不是你预期的排序列表,以及列表的内容是否正确。
内容的提问来源于stack exchange,提问作者QHarr

