VBA for 循環添加空白字典條目

傑克

我正在嘗試使用 VBA 字典替換 Excel 工作表中的某些值。當我去年這樣做時,它工作得很好。再次嘗試時,它會向重複鍵添加空白值,結果不會向單元格寫入任何內容。

我試過早期綁定和後期綁定都沒有成功。

這是後期綁定的代碼。

Sub someDict()

Dim myDict As Object
Set myDict = CreateObject("Scripting.Dictionary")
Dim n As Long
Dim i As Long

myDict.Add "A", "Amaretto Sour"
myDict.Add "B", "Bourbon"
myDict.Add "C", "Cosmopolitan"
myDict.Add "D", "Daiquiri"
myDict.Add "E", "Electric Lemonade"
myDict.Add "F", "Four Horsemen"
myDict.Add "G", "Gin and Tonic"
myDict.Add "H", "Hurricane"
myDict.Add "I", "Irish Coffee"
myDict.Add "J", "John Collins"

Debug.Print "Total: " & myDict.Count()

n = Cells(Rows.Count, 1).End(xlUp).Row
For i = n To 1 Step -1
    If Cells(i, 3) = "TEST" Then
        Debug.Print myDict.Count()
        Cells(i, 5) = myDict(Cells(i, 4))
        Debug.Print myDict.Count()
    End If
Next i

Debug.Print "Total after loop: " & myDict.Count()

Dim k As Variant
For Each k In myDict.Keys
    ' Print key and value
    Debug.Print k, myDict(k)
Next

End Sub

這是表結構:

桌子

立即數中的當前輸出為:

Total: 10
 10 
 11 
 11 
 12 
 12 
 13 
 13 
 14 
 14 
 15 
 15 
 16 
 16 
 17 
Total after loop: 17
A             Amaretto Sour
B             Bourbon
C             Cosmopolitan
D             Daiquiri
E             Electric Lemonade
F             Four Horsemen
G             Gin and Tonic
H             Hurricane
I             Irish Coffee
J             John Collins
J             
H             
G             
F             
E             
C             
A     

我本來希望它是:

Total: 10
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
 10 
Total after loop: 10
A             Amaretto Sour
B             Bourbon
C             Cosmopolitan
D             Daiquiri
E             Electric Lemonade
F             Four Horsemen
G             Gin and Tonic
H             Hurricane
I             Irish Coffee
J             John Collins

誰能告訴我我做錯了什麼(除了使用 VBA 字典),此外,為什麼它以前對我有用?

可能是由於 scrobj.dll 的更新嗎?

謝謝。

邁克爾

字典實際上對鍵使用變體而不是嚴格的字符串或數字,這就是為什麼在循環鍵時必須將 k 定義為變體的原因。鍵實際上可以是任何東西。

此外,如果您引用尚未定義的鍵,字典會自發地添加新鍵,這就是您必須使用安全函數 Exists 來測試是否已定義鍵的原因。

VBA 是一個沒有紀律的野獸,當您在代碼中引用 Range() 對象時,它試圖幫助確定您想要什麼。如果可以使用範圍對象,則它將使用範圍對象。如果需要字符串/數字,則它將使用 Range() 對象的值(作為默認屬性)。

因為字典可以將任何對像作為鍵,而不是使用 Cells(i, 4) 中的值,它使用 Cells(i, 4) 的實際範圍對象並創建一個沒有值的新鍵。您可以在 Locals 窗口中看到這一點,其中顯示了變體字典鍵的子類型:

在此處輸入圖片說明

最後,當您 debug.print 鍵時,打印函數需要一個字符串/數字。因此,當它到達“重複”鍵(實際上是范圍對象)時,它會打印範圍對象的值。

在逐步執行代碼時,您實際上可以在即時窗口中獲得這些鍵的任何範圍屬性!例如:?k.Address

要修復您的代碼,您只需要明確引用單元格的值:

    Cells(i, 5) = myDict(Cells(i, 4).Value)

這就是為什麼最好的編碼實踐是始終​​明確引用對象的屬性,而不是依賴默認屬性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章