- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
8#
發表於 2022-10-18 08:47
| 只看該作者
本帖最後由 Andy2483 於 2022-10-18 08:51 編輯
各位前輩好
今天練習陣列語字典
心得註解如下:
Option Explicit
Sub TEST()
Dim Arr, Brr(1 To 999, 1 To 12), Crr, c&, i&, x&, R&, T, Y, N, j, Z
'↑宣告變數
Set Y = CreateObject("Scripting.Dictionary")
'↑令Y是字典
Set Arr = [工作表1!A1].CurrentRegion
'↑令 Brr是 [A1]相鄰非空格所串連起來的儲存格,擴展到方正區域的最小範圍儲存格
c = [工作表1!A1].End(xlToRight).Column
'↑令C是此表的欄數
R = [工作表1!A1].End(xlDown).Row
'↑令R是此表的列數
For i = 2 To R
'↑設迴圈從2開始到此表的列數
T = Arr(i, 3)
'↑令T是 C欄項目名稱
Crr = Y(T & "|") '#1
'↑令Crr是Y字典裡的 項目名稱&"|"字串 為key的item
Y(T) = Y(T) + 1 '@1
'↑令項目名稱 為key,item累加1,這是後面用來指定陣列列數的
',如 @1 標註
If Not IsArray(Crr) Then
'↑如果判定 Crr 還不是陣列
Y(T) = Y(T) + 1
'↑令項目名稱 為key,item累加1,這是後面用來指定陣列列數的
',如 @2 標註!這裡+1是為了空出一列給標題列用的
Crr = Brr
'↑令Crr變成一個上述Brr(1 To 999, 1 To 12)空陣列
',所以Brr從頭到尾都是一個空的容器
End If
For j = 1 To 12
'設迴圈將資料帶入Crr陣列
Crr(Y(T), j) = Arr(i, j) '@1
If Y(T) = 2 Then '@2
'↑如果此時的陣列寫入是在第2列
Crr(1, j) = Arr(1, j)
'↑就一起把標題列寫進去陣列裡
End If
Next j
Y(T & "|") = Crr '#1
'↑令 項目名稱&"|"字串 為key ,令Crr為它的item,
Next
'↑迴圈總結:
'迴圈會讓字典裡裝進數字.字串.陣列
Workbooks.Add
For Each Z In Y.KEYS
'↑設順迴圈令Z是Y字典裡key的一員
If InStr(Z, "|") Then
'↑如果Z這key字串裡有 "|" 符號,代表他的item是陣列
'我們就是要調出陣列放在新工作表裡,如 #1 標註
Crr = Y(Z)
'↑用Crr 裝這Y(Z)陣列來看比較習慣!看到括弧()就害怕!
With Sheets.Add(after:=Sheets(Sheets.Count))
'↑在上方新開的活頁簿最後工作表後面再新開依工作表
.Name = Replace(Z, "|", "")
'↑工作表名是 項目名稱&"|"字串 去掉 "|" 符號
.[A1].Resize(UBound(Crr), UBound(Crr, 2)) = Crr
'↑把陣列從[A1]開始貼進儲存格裡了!
.[I:J].NumberFormatLocal = "yyyy/m/d"
'↑令[I:J]欄的格式是 西元4碼年 /能1碼就不要兩碼的月/日
.Cells.Columns.AutoFit
'↑令整表的所有欄位自動調整欄寬
End With
End If
Next
End Sub
懇請各位前輩指正並指導! |
|