- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-3-24
|
12#
發表於 2023-4-20 09:15
| 只看該作者
本帖最後由 Andy2483 於 2023-4-20 09:33 編輯
謝謝論壇,謝謝各位前輩
論壇裡到處有寶藏,練習的題材很多
後學藉以下鏈結的範例做陣列語字典學習心得彙整,請各位前輩指教
http://forum.twbts.com/thread-12012-1-2.html
資料表:
結果表:
Option Explicit
Sub 水果種類_不重複()
Dim xD, Brr, N&, i&, xR As Range, T$
'↑宣告變數:(xD,Brr)是通用型變數,(N,i)是長整數,
'xR是儲存格變數,T是字串變數
'後學以前不知道宣告變數的重要性,解決程式錯誤吃了很多苦頭,
'現在都習慣宣告變數,各位同學多練習多遭遇挫折就會知道為什麼了
Set xD = CreateObject("Scripting.Dictionary")
'↑令xD這通用型變數是 字典
Set xR = Range([G1], Cells(Rows.Count, "G").End(xlUp))
'↑令xR這儲存格變數是本表[G1]到G欄最後一個有內容儲存格
'就是[G1:G10]這10格,Set xR =[G1:G10]就可以了!
'那為何要寫的這麼複雜呢?因為資料量如果變動!程式會自動偵測自動調整
Brr = xR
'↑令Brr這通用型變數是 二維陣列,以xR變數值帶入
'如果問為什麼要這樣陳述?
'Excel_VBA將儲存格值到進去陣列裡就這麼簡單,多個"="就到進去了
'為什要用陣列呢?
'因為Excel對使用者太好了,儲存格有很多的設定讓使用者很方便使用,
'但是程式要抓取儲存格內容跟寫入儲存格都時要花時間判讀真正的值是什麼,
'重要的是將資料一次寫入10個儲存格裡的時間比一個個分10次寫入儲存格時間短,
'所以在陣列裡做資料編輯,編輯好了再一次性寫入儲存格裡
'在陣列裡做資料的編輯很快,試試看就知道
For i = 2 To UBound(Brr)
'↑設順迴圈!i從2 到Brr陣列縱向最大索引號
T = Brr(i, 1)
'↑令T這字串變數是 i迴圈第1欄Brr陣列值
'為什麼還要這個步驟?多此一舉!
'除了認證裝進T變數是字串之外,還可以精簡程式碼,適讀性更好
'當練習時看到程式碼很長,就會想要縮短程式碼,趕快行動,多練習就知道了
If Not xD.Exists(T) Then
'↑如果xD字典keys裡還沒有T變數?
'檢查某個字串在字典裡keys是不是存在的方式就是這樣
'If xD.Exists(T) <> Empty Then '這樣問也可以
xD(T) = ""
'↑疑問如果確定還沒有!就令T變數是key,item是空字元,納入字典裡
'為什麼item是空字元?因為我們此次用字典只是為了用key要濾掉重複值,
'字典的key的使用就是要搭配item才會納入字典裡,
'所以item隨意給個值也可以
N = N + 1
'↑令N這長整數累加1,N宣告是長整數,所以初始值是0,
'因為要把字典濾好的結果字串放在同一個陣列裡,就要告訴該放哪裡
Brr(N, 1) = T
'↑令N變數列第1欄Brr陣列值是T變數
'疑問??原資料跟結果放在同一個陣列裡不會亂掉嗎?
'不會!因為迴圈往後跑,而且是從2開始,把結果資料從最前面放,追不到
'蓋掉原來值不會出問題!不會,因為原資料用過了不需要了
End If
Next
Workbooks.Add
'↑令程序新增一個活頁簿
[A1].Resize(N, 1) = Brr
'↑令這新活頁簿第1個工作表的[A1]儲存格擴展向下N變數格的值是Brr陣列值
'因為令程序寫入儲存格的範圍只有N個(6個),
'所以超出這範圍的陣列值不會寫入儲存格裡
Set xD = Nothing: Set xR = Nothing: Erase Brr
'↑令釋放這些變數
End Sub
'=================================================
補充:
橫放的方式更簡單,趕快多找範例練習
執行結果:
程式碼如下:
Sub 水果種類_不重複_1()
Dim xD, Brr, i&, xR As Range
Set xD = CreateObject("Scripting.Dictionary")
Set xR = Range([G1], Cells(Rows.Count, "G").End(xlUp))
Brr = xR
For i = 2 To UBound(Brr)
xD(Brr(i, 1)) = "Good"
Next
Workbooks.Add
[A1].Resize(1, xD.Count) = xD.keys
Set xD = Nothing: Set xR = Nothing: Erase Brr
End Sub |
|