- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
5#
發表於 2023-6-2 08:56
| 只看該作者
本帖最後由 Andy2483 於 2023-6-2 08:58 編輯
謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案使用2個陣列方案如下,請各位前輩指教
Option Explicit
Sub TEST()
Dim Brr, Crr, Y, R&, i&, T1$, T2$, K&
Dim xRd As Range, Shd As Worksheet, Sha As Worksheet
'↑宣告變數
Set Y = CreateObject("Scripting.Dictionary")
'↑令Y變數是 字典
Set Shd = Sheets("data"): Set Sha = Sheets("sheet1"): Sha.[A:B].ClearContents
'↑令變數裝入物件(工作表),令結果表清除舊資料
Set xRd = Range(Shd.[B1], Shd.Cells(Rows.Count, 1).End(xlUp))
'↑令xRd變數裝入物件(資料表A~B欄儲存格)
Brr = xRd: K = UBound(Brr): ReDim Crr(1 To K, 1 To 2)
'↑令Brr變數是 二維陣列,以xRd變數值帶入陣列中,
'令K變數是Brr陣列縱向最大索引列號,
'令Crr變數是 二維空陣列,宣告他的範圍縱向同Brr陣列,橫向1~2索引號
For i = 1 To K
'↑設順迴圈
T1 = Brr(i, 1): T2 = Brr(i, 2)
'↑令變數裝入陣列值,成為字串變數
If i = 1 Then R = R + 1: Crr(i, 1) = T1: Crr(i, 2) = T2: GoTo i01
'↑如果i迴圈是 1!就令R是0+1,令Crr陣列標題列同Brr陣列,令跳到i01位置繼續執行
If Y(T1) = "" Then R = R + 1: Y(T1) = R: Crr(R, 1) = T1
'↑如果以T1變數查Y字典回傳item是空字元(初次納入字典),就令R變數+1(累計列號)
'令在Y字典中key是 T1變數的item換成是 R變數(記住 料件代號是放在Crr哪一列)
'令Crr陣列寫入該 料件代號
Crr(Y(T1), 2) = Crr(Y(T1), 2) + Val(T2)
'↑令Crr陣列第2欄累加 應發數量
i01: Next
Sha.[A:A].NumberFormatLocal = "@"
'↑令結果表A欄儲存格格式是文字
Sha.[A1].Resize(R, 2) = Crr
'↑令結果表[A1]擴展範圍帶入Crr陣列值,超過此範圍的Crr陣列值忽略
Set Y = Nothing: Set xRd = Nothing: Set Shd = Nothing
Set Sha = Nothing: Erase Brr, Crr
'↑令釋放變數
End Sub |
|