Board logo

標題: Scripting.Dictionary的應用 [打印本頁]

作者: john2006168    時間: 2021-5-16 19:44     標題: Scripting.Dictionary的應用

這兩天在看字典的應用,字典對象的方法有6個:Add方法、Keys方法、Items方法、Exists方法、Remove方法、RemoveAll方法。
附件一個test filr 想看看老師怎寫?和用到上面的哪幾個方法[attach]33291[/attach][attach]33291[/attach]
作者: samwang    時間: 2021-5-16 20:57

回復 1# john2006168

請試看看,謝謝。
Sub test()
Dim Arr, xD, Ar(), T, T2%, i&, M%, N%
Set xD = CreateObject("Scripting.Dictionary")
Sheets("工作表1").Range("B1:C1").Copy Sheets("Summary").Range("A1")
Arr = Sheets("工作表1").[a1].CurrentRegion
ReDim Ar(1 To UBound(Arr), 1 To 2)
For i = 2 To UBound(Arr)
    T = Arr(i, 2): T2 = Arr(i, 3)
    If xD.Exists(T & "") Then
        M = xD(T & "")
        Ar(M, 2) = Ar(M, 2) + T2
    Else
        N = N + 1: xD(T & "") = N
        Ar(N, 1) = T: Ar(N, 2) = T2
    End If
Next
Sheets("Summary").[A2].Resize(N, 2) = Ar
End Sub
作者: samwang    時間: 2021-5-17 07:52

回復 1# john2006168


不一樣寫法,請再測試看看,謝謝。
Sub test2()
Dim Arr, xD, T, T2%, i&
Set xD = CreateObject("Scripting.Dictionary")
Sheets("工作表1").Range("B1:C1").Copy Sheets("Summary").Range("A1")
Arr = Sheets("工作表1").[a1].CurrentRegion
For i = 2 To UBound(Arr)
    T = Arr(i, 2): T2 = Arr(i, 3)
    xD(T & "") = xD(T & "") + T2
Next
Sheets("Summary").[A2].Resize(xD.Count) = Application.Transpose(xD.keys)
Sheets("Summary").[B2].Resize(xD.Count) = Application.Transpose(xD.items)
End Sub
作者: samwang    時間: 2021-5-17 08:38

更新#3樓,放了將表頭第一列也可以寫入字典即可,謝謝。
Sub test3()
Dim Arr, xD, T, T2, i&
Set xD = CreateObject("Scripting.Dictionary")
Arr = Sheets("工作表1").[A1].CurrentRegion
For i = 1 To UBound(Arr)
    T = Arr(i, 2): T2 = Arr(i, 3)
    xD(T & "") = xD(T & "")
    xD(T & "") = xD(T & "") + T3
Next
Sheets("Summary").[A1].Resize(xD.Count) = Application.Transpose(xD.keys)
Sheets("Summary").[B1].Resize(xD.Count) = Application.Transpose(xD.items)
End Sub
作者: john2006168    時間: 2021-5-17 10:17

回復 3# samwang

謝謝提供兩種方法,慢慢學習中.
請問可否幫忙解釋這句意思?
    xD(T & "") = xD(T & "") + T2
作者: samwang    時間: 2021-5-17 10:55

回復 5# john2006168

不好意思4樓,T3須改為T2   
xD(T & "") = xD(T & "") + T2   ' Name有重複時,Oder 數值累加
作者: john2006168    時間: 2021-5-18 15:23

回復 6# samwang

samwang,請問一下如果我加多一欄和多一個條件,相同的"LOCATION"加在一起,請問這樣怎麼寫.
作者: samwang    時間: 2021-5-18 20:41

回復 7# john2006168

請測試看看,條件複雜時,可以使用字典+數組陣列比較容易解,謝謝。

Sub test()
Dim Arr, xD, T, T2, T3, T4, i&, M%, N%
Set xD = CreateObject("Scripting.Dictionary")
Arr = Sheets("工作表1").[A1].CurrentRegion
For i = 1 To UBound(Arr)
    T = Arr(i, 2) & "|" & Arr(i, 4)
    T2 = Arr(i, 2): T3 = Arr(i, 3): T4 = Arr(i, 4)
    If xD.Exists(T & "") Then
        M = xD(T & ""): Arr(M, 2) = Arr(M, 2) + T3
    Else
        N = N + 1: xD(T & "") = N
        Arr(N, 1) = T2: Arr(N, 2) = T3: Arr(N, 3) = T4
    End If
Next
Sheets("Summary").[A1].Resize(N, 3) = Arr
End Sub
作者: john2006168    時間: 2021-5-20 12:22

回復 8# samwang
可以運行,但是有些地方不是很理解,可否幫忙註釋一下.
作者: samwang    時間: 2021-5-20 14:42

回復 9# john2006168

解釋寫得不好時,請見諒,感謝。

Sub test()
Dim Arr, xD, T, T2, T3, T4, i&, M%, N%
Set xD = CreateObject("Scripting.Dictionary")
Arr = Sheets("工作表1").[A1].CurrentRegion '資料裝入數組
For i = 1 To UBound(Arr)
     T = Arr(i, 2) & "|" & Arr(i, 4)    '關鍵條件串連一起當作key
     T2 = Arr(i, 2): T3 = Arr(i, 3): T4 = Arr(i, 4)
     If xD.Exists(T & "") Then          'key有無在字典
         M = xD(T & "")                      '找到同key的位置
         Arr(M, 2) = Arr(M, 2) + T3  '累加
     Else
         N = N + 1: xD(T & "") = N  'key裝入字典且編流水號
         Arr(N, 1) = T2: Arr(N, 2) = T3: Arr(N, 3) = T4 '將符合條件的資料裝到結果的數組
     End If
Next
Sheets("Summary").[A1].Resize(N, 3) = Arr  '結果顯示
End Sub
作者: john2006168    時間: 2021-5-25 10:39

回復 10# samwang

謝謝您解釋.
作者: Andy2483    時間: 2023-6-20 10:19

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案如下,請各位前輩指教

資料表:
[attach]36624[/attach]

結果表執行前:
[attach]36625[/attach]

執行結果:
[attach]36626[/attach]


Option Explicit
Sub TEST_1()
Dim Brr, Crr, Z, i&, j%, R&, Y&, T$
Set Z = CreateObject("Scripting.Dictionary")
Brr = Range([工作表1!D1], [工作表1!A65536].End(3))
ReDim Crr(1 To UBound(Brr), 1 To 3)
For i = 1 To UBound(Brr)
   T = Brr(i, 2) & "|" & Brr(i, 4)
   R = Z(T)
   If R = 0 Then
      Y = Y + 1: R = Y
      For j = 1 To 3: Crr(R, j) = Brr(i, j + 1): Next
      Z(T) = R: GoTo i01
   End If
   Crr(R, 2) = Crr(R, 2) + Brr(i, 3)
i01: Next
With [Summary!A1].Resize(Y, 3)
   .EntireColumn.ClearContents
   .Value = Crr
End With
Set Z = Nothing: Erase Brr, Crr
End Sub




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)