- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
19#
發表於 2023-5-30 08:23
| 只看該作者
謝謝論壇,謝謝各位前輩
後學藉此帖複習直式呈現方式,方案學習心得註解如下,請各位前輩指教
Option Explicit
Sub TEST()
Dim Brr, Crr(1 To 1000, 1 To 2), A, Y, R&, i&, TT$, T1$, T3$, T4 As Date, T9$
'↑宣告變數
Set Y = CreateObject("Scripting.Dictionary")
'↑令Y變數是 字典
Brr = Range([sheet1!I3], [sheet1!A65536].End(3))
'↑令Brr變數是 二維陣列,以sheet1 表的A~I欄儲存格值帶入陣列中
With Sheets("工作表1").[A2].Resize(UBound(Brr), UBound(Brr, 2))
'↑以下是關於名為 "工作表1" 工作表擴展Brr陣列範圍的程序
.Value = Brr
'↑令儲存格值是 Brr陣列值
.Sort KEY1:=.Item(1), Order1:=1, _
Key2:=.Item(4), Order2:=1, Header:=2
'↑令該範圍做2層次,無標題列的縱向順排序
Brr = .Value
'↑令Brr二維陣列值是該範圍排序後的陣列值
End With
For i = 1 To UBound(Brr)
'↑設順迴圈
T1 = Brr(i, 1): T3 = Brr(i, 3): T4 = Brr(i, 4): T9 = Brr(i, 9)
'↑令變數裝入陣列值,一方面定義其值,一方面可以縮短程式碼
If T9 <> "國假" Then GoTo i00
'↑如果T9變數不是 "國假"字串,就跳到i00位置繼續執行
TT = T1 & "|" & T3: A = Y(TT)
'↑令TT變數是 組合字串,令A變數是 以TT變數查Y字典回傳的item
If Not IsArray(A) Then A = Crr: Y(TT & "/編") = T1: Y(TT & "/名") = T3
'↑如果item不是陣列?? 就令A變數是Crr陣列(空陣列),
'令TT變數連接 "/編"組成的新字串當key,item是T1變數,納入Y字典裡,
'令TT變數連接 "/名"組成的新字串當key,item是T3變數,納入Y字典裡
R = Y(TT & "/R"): R = R + 1: Y(TT & "/R") = R
'↑令R變數是 TT變數連接 "/R"組成的新字串查Y字典的回傳值,
'令R變數累加 1,
'令TT變數連接 "/R"組成的新字串當key,item是 R變數,納入Y字典裡
A(R, 1) = T4: A(R, 2) = T9: Y(TT) = A
'↑令R變數列第1欄A陣列值是 T4變數值,令R變數列第2欄A陣列值是 T4變數值,
'令TT變數當key,item是A二維陣列納入Y字典中
i00: Next
With Sheets("工作表1")
'↑以下是關於名為 "工作表1" 工作表的程序
.UsedRange.Offset(1, 0).Clear: R = 1
'↑令使用的儲存格往下偏移1列範圍的儲存格清除,令R變數是 1
.Columns(1).NumberFormatLocal = "@"
'↑令A欄格式是 文字
For Each A In Y.KEYS
'↑設逐項迴圈,令A變數是Y字典裡的key
If Not IsArray(Y(A)) Then GoTo i01
'↑如果以A變數查Y字典回傳得item不是 陣列,就跳到i01位置執行
R = R + 1
'↑令R變數累加1
.Cells(R, 1) = Y(A & "/編"): .Cells(R, 2) = Y(A & "/名")
'↑令儲存格寫入 員工編號與姓名
.Cells(R, 3).Resize(Y(A & "/R"), 2) = Y(A): R = R + Y(A & "/R") - 1
'↑令適當範圍寫入Y字典所回傳item二維陣列值
i01: Next
End With
Set Y = Nothing: Erase Brr, Crr
'↑令釋放變數
End Sub |
|