返回列表 上一主題 發帖

[發問] 利用EXCEL巨集資料處理

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

資料表:


結果表:



Option Explicit
Sub TEST()
Dim Brr, Crr, Y, R1&, R&, i&, j&, TT$, T2$, T3$, T4$, T5$
'↑宣告變數
Set Y = CreateObject("Scripting.Dictionary")
'↑令Y變數是 字典
Brr = Range([Date!F2], [Date!A65536].End(xlUp))
'↑令Brr變數是 二維陣列,以資料表儲存格值帶入
ReDim Crr(1 To 1000, 1 To 7)
'↑宣告Crr變數是二維空陣列,縱向索引號1~1000,橫向1~7
For i = 1 To UBound(Brr)
'↑設順迴圈
   T2 = Brr(i, 2): T3 = Brr(i, 3): T4 = Brr(i, 4): T5 = Brr(i, 5)
   '↑令T2~T5變數裝入陣列值
   TT = T2 & "|" & T3 & "|" & T4 & "|" & T5
   '↑令TT變數是組合字串,用來濾重複用的key
   If Y(TT) = "" Then
   '↑如果以TT變數查Y字典得item值是""
      R = R + 1
      '↑令R變數累加1 (用來累加Crr陣列這結果陣列的列號)
      For j = 1 To 4: Crr(R, j) = Brr(i, j + 1): Next
      '↑將Brr陣列2~5欄寫入Crr陣列(1~4)欄指定的R變數列號
      Crr(R, 5) = Val(Brr(i, 6))
      '↑Crr陣列第5欄放入資料表的數量 (用Val()將字串轉為數值)
      Crr(R, 6) = 1
      '↑Crr陣列第6欄是寫入1  (第1箱)
      Crr(R, 7) = Brr(i, 1)
      '↑Crr陣列第7欄是寫入箱號 (第1箱號)
      Y(TT) = R: GoTo i01
      '↑令以TT變數為key,item是 R變數(列號),納入Y字典中
      '令程序跳到標示 i01位置繼續執行

   End If
   R1 = Y(TT)
   '↑令R1變數是 以TT變數查Y字典得item值 (用來指向Crr陣列列號)
   '是第2次以上出現的key才會跑到這裡

   Crr(R1, 5) = Crr(R1, 5) + Val(Brr(i, 6))
   '↑令數量累加
   Crr(R1, 6) = Crr(R1, 6) + 1
   '↑令箱數累加
   Crr(R1, 7) = Crr(R1, 7) & "," & Brr(i, 1)
   '↑令箱號添加在Crr陣列第7欄後面
i01: Next
With [Result!A2].Resize(R, 7)
'↑以下是關於結果表預計要寫入新結果範圍儲存格的程序
   .EntireColumn.Clear
   '↑令這些欄位做清除
   [Result!A1:G1] = [{"訂貨單","板號","料號","原產地","數量合計","箱數","箱號註記"}]
   '↑令結果表寫入標題列
   .Value = Crr
   '↑令Crr陣列值寫入這些範圍儲存格,超過此範圍的陣列值忽略
   .EntireColumn.AutoFit
   '↑令這些欄位欄寬自動調整
   Intersect(.Cells, [G:G]).NumberFormatLocal = "@"
   '↑令第7欄的格式是 文字
End With
Set Y = Nothing: Erase Brr, Crr
'↑令釋放變數
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

        靜思自在 : 為自己找藉口的人永遠不會進步。
返回列表 上一主題