- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-5-5
|
6#
發表於 2023-6-15 11:02
| 只看該作者
謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案如下,請各位前輩指教
執行前:
輸入 2021/11/21 後按鈕執行結果:
Option Explicit
Sub TEST()
Dim Brr, Z, V1&, V2&, V3, i&, j%, R&, N&, T$
'↑宣告變數
Intersect(ActiveSheet.UsedRange, [U2:Z65536]).ClearContents
If IsDate([S2]) = False Then MsgBox "[S2]需輸入日期": Exit Sub
'↑如果[S2]儲存格值不是日期? True就跳出提示,結束程式執行
Set Z = CreateObject("Scripting.Dictionary")
'↑令Z變數是 字典
Brr = Range([F1], [A65536].End(xlUp))
'↑令Brr變數是 二維陣列,以A~F欄儲存格值帶入陣列中
For i = 2 To UBound(Brr)
'↑設順迴圈
T = Brr(i, 1) & "|" & Brr(i, 3) & "|" & Brr(i, 4)
'↑令T變數是 第1.3.4欄迴圈陣列值的組合字串,中間以"|"間隔
If InStr(T, [S2] & "|") = 0 Then GoTo i01
'↑如果T組合字串不符合條件? True就跳到標示i01位置繼續執行
If Z(Brr(i, 4)) = "" Then V1 = V1 + 1: Z(Brr(i, 4)) = 1
'↑如果商品名稱不在Z字典裡? True就令V1變數累加1後,
'將 商品名稱key對應item改為1
V2 = V2 + Brr(i, 5): V3 = V3 + Brr(i, 6)
'↑令V2變數累加 數量,'↑令V3變數累加 消費金額
N = Z(T)
'↑令N變數是 以T變數查Z字典回傳item值
If N = 0 Then
'↑如果N變數是 0
R = R + 1: For j = 1 To 6: Brr(R, j) = Brr(i, j): Next
'↑令R變數累加1,設順迴圈將迴圈列陣列值謄到指定的 R變數列
Z(T) = R: GoTo i01
'↑令T變數key對應item改為R變數,令跳到標示i01位置繼續執行
End If
Brr(N, 5) = Brr(N, 5) + Brr(i, 5): Brr(N, 6) = Brr(N, 6) + Brr(i, 6)
'↑令第二次以上出現的T變數,其數量與消費金額累加
i01: Next
If R > 0 Then R = R + 1 Else: MsgBox "無符合條件資料": Exit Sub
For j = 1 To 3: Brr(R, j) = "": Next
Brr(R, 4) = V1: Brr(R, 5) = V2: Brr(R, 6) = V3
'↑令加總值放在陣列裡
[U2].Resize(R, 6) = Brr
'↑令從[U2]擴展範圍儲存格值以Brr陣列值寫入,超過範圍的陣列值忽略
Set Z = Nothing: Erase Brr
'↑令釋放變數
End Sub |
|