- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
20#
發表於 2023-3-15 20:13
| 只看該作者
本帖最後由 Andy2483 於 2023-3-15 20:20 編輯
回復 11# hugh0620
回復 16# Hsieh
謝謝論壇,謝謝前輩
後學藉此帖學習到很多知識,以下心得註解,請前輩再指導
Option Explicit
Sub TEST()
Dim Ay(), d, d1, ar, i, a, s, mystr1
'↑宣告變數:Ay是陣列,其餘為通用型變數
Set d = CreateObject("Scripting.Dictionary")
'↑令d是 字典
Set d1 = CreateObject("Scripting.Dictionary")
'↑令d1也是 字典
With Sheet2
'↑以下是關於Sheet2工作表的程序 (Data表)
.Unprotect "1234"
'↑令以"1234"密碼取消保護工作表
ar = .Range(.[B5], .[B65536].End(xlUp).Offset(, 2))
'↑令ar變數是二維陣列,以[B5]到(B欄最後一個有內容儲存格,
'再向右偏移2欄的儲存格),此範圍儲存格值帶入ar陣列中
For i = 1 To UBound(ar, 1)
'↑設順迴圈!i從1到 ar縱向最大索引列號
mystr1 = Join(Array(ar(i, 1), ar(i, 2), ar(i, 3)))
'↑令mystr1變數是以 空白字元連結陣列子值的新字串
'陣列子值:i迴圈數的(1,2,3)欄ar陣列值
d(mystr1) = d.Count
'↑令以mystr1變數當key,item是 d字典key數量(PS:起始值是0),納入d字典
Next
With Sheet1
'↑以下是關於Sheet1工作表的程序 (輸入表)
ar = .Range(.[B5], .[B65536].End(xlUp).Offset(, 6))
'↑令ar變數裝新資料:
'令ar是二維陣列,以[B5]到(B欄最後一個有內容儲存格,
'再向右偏移6欄的儲存格),此範圍儲存格值帶入ar陣列中
For i = 1 To UBound(ar, 1)
'↑設順迴圈!i從1到 ar縱向最大索引列號
mystr1 = Join(Array(ar(i, 1), ar(i, 2), ar(i, 6)))
'↑令mystr1變數是以 空白字元連結陣列子值的新字串
'陣列子值:i迴圈數的(1,2,6)欄ar陣列值
If d.exists(mystr1) = False Then
'↑如果查d字典裡沒有 mystr1變數 key
ReDim Preserve Ay(s)
'↑令Ay陣列擴充列數到索引號s(PS:s起始值是0)
Ay(s) = Array(ar(i, 1), ar(i, 2), ar(i, 6), ar(i, 7))
'↑令s變索引號Ay陣列值是一維陣列,以i迴圈列ar陣列子值(1,2,6,7)帶入
s = s + 1
'↑令s變數累加 1
Else
d1(mystr1) = ar(i, 7)
'↑否則令以mystr1變數為key,item是i迴圈列第7欄ar陣列值,納入d1字典中
End If
Next
End With
For Each a In .Range(.[B5], .[B65536].End(xlUp))
'↑設逐項迴圈!令a是 (Data表[B5]到 B欄最後一個有內容儲存格)這範圍儲存格之一
mystr1 = Join(Array(a, a.Offset(, 1), a.Offset(, 2)))
'↑令mystr1變數是以 空白字元連結陣列子值的新字串
'陣列子值:a變數值,a變數往右偏移1格的儲存格值,a變數往右偏移2格的儲存格值
a.Offset(, 3) = d1(mystr1)
'↑令a變數往右偏移3格的儲存格值是 以mystr1變數查d1字典的item值
Next
If s > 0 Then
'↑如果s變數大於 0?
.[B65536].End(xlUp).Offset(1, 0).Resize(s, 4) = _
Application.Transpose(Application.Transpose(Ay))
'↑令Data表B欄第1空白格擴展向下s1變數列,向右擴展4欄,
'這擴展範圍儲存格值以Ay陣列轉置兩次的值帶入
End If
.Protect "1234"
'↑令以"1234"密碼保護Data表
End With
End Sub |
|