Board logo

標題: [發問] 關於字典加陣列欄數問題 [打印本頁]

作者: 軒云熊    時間: 2020-8-16 12:03     標題: 關於字典加陣列欄數問題

本帖最後由 軒云熊 於 2020-8-16 12:17 編輯

Dim X(1 To 4, 1 To 2) 的 1 TO  4 ,1 To 2
X(B, 2) = X(B, 2) + A(I, 2)  的 2
           X(K, 1) = A(I, 1) 的 1~2
           X(K, 2) = A(I, 2)
[D1].Resize(K, 2) 的 2
請問 如果要讓欄數改成動態該如何寫呢?


javascript:;
  1. Sub 練習字典加陣列累加()

  2.     Dim B, K
  3.     Dim X(1 To 4, 1 To 2)
  4.     Set D = CreateObject("Scripting.Dictionary")
  5.     A = [A1:B1].Resize([B1].End(4).Row)

  6.     For I = 1 To UBound(A)
  7.    
  8.         If D.Exists(A(I, 1)) Then
  9.            B = D(A(I, 1))
  10.            X(B, 2) = X(B, 2) + A(I, 2)
  11.         Else
  12.            K = K + 1
  13.            D(A(I, 1)) = K
  14.            X(K, 1) = A(I, 1)
  15.            X(K, 2) = A(I, 2)
  16.         End If

  17.     Next I

  18.     [D1].Resize(K, 2) = X

  19. End Sub
複製代碼

作者: 軒云熊    時間: 2020-8-16 12:24

本帖最後由 軒云熊 於 2020-8-16 12:26 編輯

Dim X(1 To 4, 1 To 2) 的 1 TO  4 ,1 To 2 列數 跟 欄數 還是說 直接給一個 較大的空間呢?
作者: 軒云熊    時間: 2020-8-16 17:56

本帖最後由 軒云熊 於 2020-8-16 18:06 編輯

後來想到的辦法是這樣但 迴圈變多了.... XD 要縮減迴圈對我來說實在太困難了....還有一大段距離...
  1. Sub 練習字典加陣列累加()

  2.     Dim D As Object, B&, K&
  3.    
  4.     Set D = CreateObject("Scripting.Dictionary")
  5.     A = Range(Cells(1, 1).End(4), Cells(1, 1).End(2))
  6.     T = Cells(1, 1).End(4).Row
  7.     L = Cells(1, 1).End(2).Column
  8.     ReDim X(1 To T, 1 To L)

  9.     For I = 1 To UBound(A)
  10.         E = A(I, 1)
  11.         If D.Exists(E) Then
  12.            B = D(E)
  13.             For F = 2 To UBound(X, 2)
  14.                 If Not IsNumeric(A(I, F)) Then
  15.                     X(B, F) = X(B, F)
  16.                 Else
  17.                     X(B, F) = X(B, F) + A(I, F)
  18.                 End If
  19.             Next F
  20.         Else
  21.            K = K + 1
  22.            D(E) = K
  23.             For Y = 1 To UBound(X, 2)
  24.                 X(K, Y) = A(I, Y)
  25.             Next Y
  26.         End If
  27.     Next I
  28.    
  29.     Cells(1, L + 2).Resize(K, Y - 1) = ""
  30.     Cells(1, L + 2).Resize(K, Y - 1) = X

  31. End Sub
複製代碼
javascript:;
作者: Andy2483    時間: 2023-3-27 16:18

回復 1# 軒云熊


    謝謝前輩發表此主題與範例
後學藉此帖練習一二維陣列與字典,學習的解決方案如下,請前輩參考

執行前:
[attach]36044[/attach]

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


Option Explicit
Sub TEST()
Dim Brr, Crr, i&, j&, xR, R&, T, A, Y, Z
Set Y = CreateObject("Scripting.Dictionary")
Set xR = Range([F1], Cells(Rows.Count, "A").End(3))
Brr = xR: Z = Array(, 2, 3, 5)
ReDim Crr(1 To UBound(Brr, 2))
For i = 1 To UBound(Brr)
   A = Y(Brr(i, 1) & "")
   If Not IsArray(A) Then
      A = Crr
      For j = 1 To UBound(Crr): A(j) = Brr(i, j): Next
      Else
         For j = 1 To 3: A(Z(j)) = A(Z(j)) + Brr(i, Z(j)): Next
   End If
   Y(Brr(i, 1) & "") = A
Next
xR.Offset(, 14).EntireColumn.ClearContents
xR.Item(1, 15).Resize(Y.Count, UBound(Crr)) = _
Application.Transpose(Application.Transpose(Y.Items))
End Sub




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