- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
8#
發表於 2022-10-15 15:31
| 只看該作者
回復 2# Hsieh
謝謝前輩
太厲害了!後學覺得很難!
後學在此帖學到很多知識!
將心得在此註解一下
如有冒犯請見諒!也懇請前輩指正並指導!
Sub Ex_Hsieh()
Dim Sh As Worksheet, Ar(), A As Range, B As Range, C As Range, s&, i%
'↑宣告變數
Set d = CreateObject("Scripting.Dictionary")
'↑令d 是字典
Set d1 = CreateObject("Scripting.Dictionary")
'↑令d1 是字典
For Each Sh In Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4"))
'↑設外迴圈,令 Sh 是4個工作表之一,順著跑
With Sh
'↑以下關於Sh 工作表的程序
Set C = IIf(i = 0 Or i = 2, .[A1], .[C1])
'↑令C儲存格物件變數:如果i這變數是0或2, C儲存格=Sh的[A1]儲存格
',如果i這變數不是0或2, C儲存格=Sh的[C1]儲存格
For Each A In .Range(C, .[IV1].End(xlToLeft))
'↑設中迴圈,令A 儲存格物件變數是??
'當i=0(初始值):C是[A1]儲存格,.[IV1].End(xlToLeft)是第一列最左邊的儲存格
'所以A 是 Sheet1 的[A1:H1]的儲存格之一
ReDim Preserve Ar(s)
'↑調整Ar陣列大小,保留陣列內部資料
'一開始Ar 是一維陣列,s初始值是0,Ar(0) 是沒有資料
Ar(s) = A.Value
'↑令Ar是標題列的值
s = s + 1
'↑令累加1,讓Ar陣列往右 排入標題列的值
DDD = .Range(A.Offset(1, 0), .Cells(65536, A.Column).End(xlUp)).Address
For Each B In .Range(A.Offset(1, 0), .Cells(65536, A.Column).End(xlUp))
'↑設內迴圈,令 B儲存格物件變數:A標題列格偏下1格到 當欄的最後一格
'當i=0(初始值);Sh=Sheet1;A=[A1];B=[A2:A105]
'所以 B Sheet1 的[A2:A105]的儲存格之一
If i = 0 Then
'↑如果i是初始值0,也就是工作表是 Sheet1 時
'目的是要收集標題欄兩欄的值與 日期&股代號&標題列格 拚字串的key,Item是 CreditMoney欄值
d1(.Cells(B.Row, 1) & .Cells(B.Row, 2)) = Array(.Cells(B.Row, 1), .Cells(B.Row, 2))
'↑條件成立時 d1字典裝入 日期&股代號 拚字串的 key ,Item是朗元素的一維陣列 日期;股代號
d(.Cells(B.Row, 1) & .Cells(B.Row, 2) & A) = B.Value
'↑條件成立時 d字典裝入 日期&股代號&標題列格 拚字串的key,Item是 CreditMoney欄值
ElseIf d1.exists(.Cells(B.Row, 1) & .Cells(B.Row, 2)) = True Then
'↑如果i不是是初始值0:工作表不是 Sheet1 時
',而且 d1字典裡有 日期&股代號 拚字串的 key時
d(.Cells(B.Row, 1) & .Cells(B.Row, 2) & A) = B.Value
'↑條件成立時 d字典裝入 日期&股代號&標題列格 拚字串的key,Item是 CreditMoney欄值
End If
Next
Next
i = i + 1
End With
Next
With Sheet5
'↑以下關於 第5個工作表的程序
.Cells = ""
'↑令所有儲存個都是空字元
.[A1].Resize(, s) = Ar
'↑把收集到的Ar標題一維陣列從[A1]開始的儲存格放進值
r = d1.Count
'↑令r 是d1字典裡元素數量104
.[A2].Resize(d1.Count, 2) = Application.Transpose(Application.Transpose(d1.items))
'↑把收集到d1字典的item(兩欄標題) 從[A2]開始的儲存格放進值
For Each C In .Range(.[C1], .[IV1].End(xlToLeft))
'↑設外迴圈令 C儲存格物件變數是 Sheet5 的[C1:AK1]的儲存格之一
'也就是結果表的標提列儲存格
For Each A In C.Offset(1, 0).Resize(d1.Count, 1)
'↑設內迴圈令 A儲存格物件變數是 C標題列儲存格偏下一格開始,
'往下匡列 (d1字典裡元素數量) 的儲存格 104格 的儲存格之一
A = d(.Cells(A.Row, 1) & .Cells(A.Row, 2) & C)
'↑用兩標題欄兩格值與標題列格拚的字串當key,
'調出d字典裡的Item 值放到儲存格理
Next
Next
End With
End Sub |
|