我正在尝试使用我之前在代码中成功填充的字典,并且发生了一件非常奇怪的事情。关键是在字典中,但它不能给我价值。它给出了错误。代码如下:
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
答案 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,但没有当前记录则会失败。