VBA Scripting.Dictionary尝试接收项目时出错(3021)

时间:2014-09-26 09:35:17

标签: vba dictionary

我正在尝试使用我之前在代码中成功填充的字典,并且发生了一件非常奇怪的事情。关键是在字典中,但它不能给我价值。它给出了错误。代码如下:

x = dict.Count
For i = 2 To lastRow

Key = Sheets(1).Cells(i, 8).Value
If dict.Exists(Key) Then

    val = dictIdPrice.Item(Key)
Else
    range("M" & i).Interior.Color = RGB(230, 0, 0)
End If
Next i

“x”具有正确的值并且输入了If子句但是带有现有键的Item方法给出了错误。我无法弄清楚为什么......

重现一个例子的问题是字典是从数据库填充的,但我会尝试。

Dim Key As Long
Dim val As Double
Dim Sql As String
Dim dictIdPrice
Dim lastRow As Integer

Sql = read_sql(IDs, dtFromSheet)
Dim rst As New ADODB.Recordset
Set rst = conODBC.Execute(Sql)
TotalColumns = rst.Fields.Count
records = rst.RecordCount
' check the query result is not empty etc
Set dictIdPrice = CreateObject("Scripting.Dictionary")
    Do While Not rst.EOF

    Key = rst.Fields(0)
    If Not dictIdPrice.Exists(Key) Then
        dictIdPrice.Add Key, rst.Fields(1)
    End If
    rst.MoveNext
Loop
For i = 2 To lastRow

Key = Trim(Sheets(1).Cells(i, 8).Value)

If dictIdPrice.Exists(Key) Then
    val = dictIdPrice.Item(Key)
Else
    range("M" & i).Interior.Color = RGB(230, 0, 0)
End If
Next i

钥匙的格式为291709,289429,289823,290535,290683

1 个答案:

答案 0 :(得分:2)

我猜这个问题就在这一行:

dictIdPrice.Add Key, rst.Fields(1)

请改为尝试:

dictIdPrice.Add Key, rst.Fields(1).Value

问题在于,当您将rst.Fields(1)存储在字典中时,实际上存储的是对象rst.Fields(1),而不仅仅是它的值。稍后,当尝试从字典中读回它时,如果记录集不再指向记录,val = dcitIdPrice.Item(Key)将评估默认成员,即Value,但没有当前记录则会失败。