尝试访问字典中的排序列表时出现类型不匹配错误

时间:2018-02-02 14:21:42

标签: excel-vba list dictionary vba excel

我有两张LkupsdataResponseTimes张。我正在读取数据 最初都是阵列。

然后我使用函数GetAmbStpMappingsDict从数组AmbSTPLkupArr创建排序列表的字典。

工作表dataResponseTimes的示例数据:

| Category   | Code    | Amb             | Incidents | Total (hours) | Mean (min:sec) | 90th centile (min:sec) | HCP incidents | Date       | Processed Date   |
|------------|---------|-----------------|-----------|---------------|----------------|------------------------|---------------|------------|------------------|
| Category 1 | England | England         | 27703     | 18:36:00      | 00:07:55       | 00:13:44               |               | 01/10/2017 | 02/02/2018 07:45 |
| Category 1 | RX9     | East Midlands   | 4588      | 14:47:36      | 00:08:25       | 00:14:52               |               | 01/10/2017 | 02/02/2018 07:45 |
| Category 1 | RYC     | East of England | 0         | 00:00:00      | 00:00:00       | 00:00:00               |               | 01/10/2017 | 02/02/2018 07:45 |

工作表Lkups的示例数据:

| Amb Code | STP                             |
|----------|---------------------------------|
| RYC      | CAMBRIDGESHIRE AND PETERBOROUGH |
| RYC      | HERTFORDSHIRE AND WEST ESSEX    |
| RYC      | MID AND SOUTH ESSEX             |
| RX9      | DERBYSHIRE                      |
| RX9      | HUMBER, COAST AND VALE          |
| ENGLAND  | ENGLAND                         |

我的想法是创建一个结构,使得有一个字典键,例如' RYC'和相关列表,例如剑桥郡等:

| RYC | CAMBRIDGESHIRE AND PETERBOROUGH |
|     | HERTFORDSHIRE AND WEST ESSEX    |
|     | MID AND SOUTH ESSEX             |

我编写的代码创建了结构,但在子test中我得到了

  

类型不匹配(错误13)

在线:Set sList = dict(key)

根据@Thomas Inzina的回答改编的子PrintItems可以打印出字典dict,的内容,但试图在没有For Each循环的情况下使用它上述错误。

我假设这是因为,在没有循环键的情况下,我试图以某种方式快捷访问列表。调试显示dict(key)正在返回empty

如果可能,我不想部署另一个循环(即密钥)。我尝试更改sList的数据类型,其中,tbh,我没有预料到会有效。

我希望能够循环testArr并使用来自testArr(rowIndex, 2)的代码字段dataResponseTimes的值来返回字典中的列表,用于该Code testArr(rowIndex, 2) 1}};例如如果RYCCambridgeshire....,我想要如前所述的三个项目dataResponseTimes

最终目标是,我会在Code中为相同的RYC复制匹配次数的每一行,例如列表中的Lkups。对于| Category 1 | RYC | East of England | 0 | 00:00:00 | 00:00:00 | 00:00:00 | | 01/10/2017 | 02/02/2018 07:45 | ,我将复制以下行3次(对于查找映射中的每个区域一次(Code)。

sList.Count

因此,较短的路线可能只是通过CAMBRIDGESHIRE AND PETERBOROUGH作为关键字Option Explicit Public Sub test() 'Tools > references > ms scripting runtime Dim sht As Worksheet Set sht = ThisWorkbook.Worksheets("dataResponseTimes") Dim dict As Dictionary Set dict = GetAmbStpMappingsDict Dim testArr() testArr = sht.Range("A2:J4").Value Dim rowIndex As Long For rowIndex = LBound(testArr, 2) To UBound(testArr, 2) Dim sList As Variant, stpName As String Dim x As Long Dim key As Variant key = testArr(rowIndex, 2) 'testArr(rowIndex, 2) is a Variant/string Set sList = dict(key) 'Error For x = 0 To sList.Count - 1 stpName = sList.GetKey(x) Debug.Print stpName Next Next rowIndex End Sub Public Function GetAmbStpMappingsDict() As Dictionary Dim dict As New Scripting.Dictionary Dim AmbSTPLkupArr As Variant AmbSTPLkupArr = ThisWorkbook.Worksheets("Lkups").Range("A2:B7").Value Dim rowIndex As Long For rowIndex = LBound(AmbSTPLkupArr, 1) To UBound(AmbSTPLkupArr, 1) If Not dict.Exists(AmbSTPLkupArr(rowIndex, 1)) Then dict.Add AmbSTPLkupArr(rowIndex, 1), CreateObject("System.Collections.SortedList") dict(AmbSTPLkupArr(rowIndex, 1)).Add AmbSTPLkupArr(rowIndex, 2), AmbSTPLkupArr(rowIndex, 1) Else dict(AmbSTPLkupArr(rowIndex, 1)).Add AmbSTPLkupArr(rowIndex, 2), AmbSTPLkupArr(rowIndex, 1) End If Next rowIndex Set GetAmbStpMappingsDict = dict End Function Sub PrintItems(dict As Object) 'Modified from code by @Thomas Inzina Dim sList As Variant, ambTrust As Variant, stpName As String Dim x As Long For Each ambTrust In dict Set sList = dict(ambTrust) Debug.Print "Parent Dictionary ambTrust: "; ambTrust For x = 0 To sList.Count - 1 stpName = sList.GetKey(x) 'sList.GetByIndex(x) Debug.Print stpName Next Next End Sub 进行访问。尝试访问实际列表值的最初原因是我要附加列表值,例如string my_path = @"C:\Windows\System32"; DirectoryInfo dir_info = new DirectoryInfo(my_path); string directory = dir_info.Name; // System32 到该行。

有人可以帮我解决这个问题吗?

代码:

#dialog-box-foot {
    background-color: #ee6e73;  // Background color
    border-radius: 4px;         // Round
    font-size: 16px;            // Font size
}

1 个答案:

答案 0 :(得分:1)

为了正确识别问题,将信用转到@Rory。

1)我没有发现查找表/表(<android.support.design.widget.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:theme="@style/SkoolarActionBar" app:layout_scrollFlags="scroll|enterAlways" /> )中的一个项目与数据表Lkups的区别。正如@Rory所述,这里的密钥区分大小写。将英格兰改为英格兰;和,

2)纠正循环的转录错误,即 dataResponseTimes没有For rowIndex = LBound(testArr, 1) To UBound(testArr, 1)解决了这个问题。