- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
7#
發表於 2022-12-7 16:44
| 只看該作者
謝謝論壇
今天自己註解程式碼質疑了自己是否真懂每個陳述.涵式...,還是只會抄襲
item() :會依位置或按鍵傳回 集合 物件的特定 成員。
https://learn.microsoft.com/zh-tw/office/vba/language/reference/user-interface-help/item-method-visual-basic-for-applications
以下是#6樓的心得註解
Option Explicit
Sub TEST_排除資料表重複列_直式梯次名單_先整理再排序()
Dim Brr, Crr, xR, Z, xA, V, W, P, Sh1, SH3
'↑宣告通用型變數
Dim i&, j&, S&, N&, R&, C&, X&, Y&, Q&
'↑宣告長整數變數
Dim D As Date, Da$, T$
'↑宣告變數!(D)是日期變數,(Da,T)是字串變數
Set W = CreateObject("Scripting.Dictionary")
Set Z = CreateObject("Scripting.Dictionary")
Set P = CreateObject("Scripting.Dictionary")
'↑令W,Z,P各是字典
Set Sh1 = Sheets("Sheet1")
'↑令Sh1是 "Sheet1" 工作表
Set SH3 = Sheets("Sheet3")
'↑令Sh1是 "Sheet3" 工作表
SH3.UsedRange.Clear
'↑令 "Sheet3" 工作表涵蓋有使用的儲存格最小方正區域清除
Crr = Range(Sh1.[A1], Sh1.UsedRange).Offset(1, 0)
'↑令Crr是 表1[A1]到有使用儲存格的最小方正範圍儲存格往下偏移1列範圍的值
R = UBound(Crr) - 1
'↑令R是 Crr陣列縱向最大列號數減 1
C = UBound(Crr, 2)
'↑令C是 Crr陣列橫向最大列號數
ReDim Brr(1 To R, 1 To C)
'↑宣告Brr陣列範圍!縱向從1到R,橫向從1到C
ReDim V(R - 1)
'↑宣告V是一維陣列!索引範圍從0到R - 1
For i = 1 To R
'↑設外順迴圈!i從1到R
Da = ""
'↑令Da字串變數是空字元
For j = 1 To C
'↑設內順迴圈!j從1到C
Da = Da & "/" & Crr(i, j)
'↑令Da字串變數是 自己連接"/"符號,再連接i迴圈列j迴圈欄的Crr陣列值
Next
If W.Exists(Da) = Empty Then
'↑如果以Da當key查察W字典裡是初始值
Q = Q + 1
'↑令Q變數累加1
For j = 1 To C
'↑設內順迴圈!j從1到C
Brr(Q, j) = Trim(Crr(i, j))
'↑令Q變數列第j迴圈欄的Brr陣列值是 i迴圈列第迴圈j欄的值去掉頭尾的空白字元
Next
W(Da) = ""
'↑令以Da字串變數值當key,item是空字元倒入W字典裡
End If
Next
W.RemoveAll
'↑清空W字典
For Each xR In Brr
'↑設順迴圈!令xR 是Brr陣列的一員
If InStr(xR, "(") Then
'↑如果xR值裡有包含"("符號?
S = InStr(xR, "梯") + 1
'↑令S是xR判斷 "梯"字元所在字元位置數
N = InStr(xR, "(")
'↑令N 是 xR判斷 "("字元所在字元位置數
D = Mid(xR, S, N - S)
'↑令D是 xR值從S字元開始取 N - S個字的字串再變為日期
W(D) = xR
'↑令D這日期當key,item是xR的值
P(xR) = D
'↑令xR這日期當key,item是D的值
End If
Next
For Each xA In W.KEYS
'↑設順迴圈!令xA 是W字典裡keys的一員
Z(xA) = V
'↑令以xA為key,item是V一維陣列,倒入Z字典裡
Next
For i = 1 To Q
'↑設外順迴圈!i從1到Q
For j = 2 To C
'↑設內順迴圈!j從1到Q
T = Brr(i, j)
'↑令T字串變數是i迴圈列j迴圈欄的Brr陣列值
If T <> "" Then
'↑如果T字串變數不等於空字元??
V = Z(P(T))
'↑令V這通用型變數是 以T字串查察P字典的item值再查察Z字典得到的item(一維陣列)
X = W(T & "|") + 1
'↑令X這數字變數是 以T字串連接"|"符號查察字典的item值累加 1
V(X - 1) = Brr(i, 1)
'↑令V這一維陣列的索引號是 X-1的元素是 是i迴圈列第一欄的Brr陣列值
W(T & "|") = X
'↑令以T字串連接"|"符號為key的item是 數字變數X
Z(P(T)) = V
'↑令以T字串查察P字典的item值再查察Z字典得到的item是 一維陣列V
End If
Next j
Next i
SH3.[A1].Resize(1, Z.Count) = Application.Transpose(Application.Transpose(Z.KEYS))
'↑令表三[A1]擴展向下擴展1列(A1自身列),向右擴展Z字典鍵數欄是 Z字典key轉置兩次的值
SH3.[A2].Resize(Q, Z.Count) = Application.Transpose(Z.ITEMS)
'↑令表三[A2]擴展向下擴展 Q列,向右擴展Z字典鍵數欄是 Z字典key轉置兩次的值
For i = 1 To SH3.UsedRange.Columns.Count
'↑設順迴圈!i從1到 表三使用範圍的欄數
With Range(SH3.Cells(1, i), SH3.Cells(Rows.Count, i).End(3))
'↑以下是有關於表三 每一欄有內容的儲存格程序
.Sort KEY1:=.Item(1), Order1:=1, Header:=2, Orientation:=xlTopToBottom
'↑排序:基準是範圍裡第一格欄位,大到小,沒有標題列,縱向排序從上到下
End With
Next
With SH3.UsedRange
'↑以下是有關於表三使用範圍的儲存格程序
.Sort KEY1:=.Item(1), Order1:=1, Header:=2, Orientation:=xlLeftToRight
'↑排序:基準是範圍裡第一格列位,大到小,沒有標題列,縱向排序從左到右
For i = 1 To .Columns.Count
'↑設順迴圈!i從1 到表三使用範圍的欄數
D = .Cells(1, i)
'↑令D日期變數是 表三使用範圍的相對儲存格第1列第i迴圈變數欄的值轉成日期
.Cells(1, i) = W(D)
'↑令以 表三使用範圍的相對儲存格第1列第i迴圈變數欄的值查察W字典得到的item值(字串)
'的值放入當格
Next
End With
Application.Goto [Sheet3!A1]
Set Crr = Nothing
Set Brr = Nothing
Set W = Nothing
Set Z = Nothing
Set P = Nothing
End Sub
Sub Item的規則()
Dim Area As Range
Set Area = [A1:J10]
MsgBox Area.Item(1).Address
MsgBox Area.Item(5).Address
MsgBox Area.Item(10).Address
MsgBox Area.Item(11).Address
MsgBox Area.Item(100).Address
MsgBox Area.Item(101).Address
'↑範圍內由左到右,上到下標儲存格索引
MsgBox Area.Item(1, 1).Address
MsgBox Area.Item(1, 5).Address
MsgBox Area.Item(1, 10).Address
MsgBox Area.Item(2, 1).Address
MsgBox Area.Item(10, 10).Address
MsgBox Area.Item(1, 11).Address
'↑範圍內的座標方式標儲存格索引
End Sub |
|