- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-5-5
|
10#
發表於 2023-5-15 11:45
| 只看該作者
謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案如下,請各位前輩指教
資料表:
結果表:
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 |
|