簡體   English   中英

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

[英]VBA for-loop adding blank dictionary entries

我正在嘗試使用 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)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM