VBA指令

VBA指令 – 彙整筆記

VBA 提供相當多的指令用法,VBA指令 彙整筆記,將會陸續記錄 VBA文章中,所用過的 VBA指令,方便學員們對照運用。

Range / Cells (儲存格)

Range 是最常用的儲存格指令,它有個孿生兄弟 — Cells,程式中有關於儲存格的所有運用,都會看到它們 ; 其差別僅在於設計者如何巧妙的靈活使用。
[ 備註 ] : Range 可以將 Cells 拿來當成屬性使用,反觀,Cells 卻不行。( ※ 比如 : Range( Cells( 1 , 1 ) , Cells( 1 , 2 ))。)

游標儲存格:ActiveCell

ActiveCell — 目前游標所在的儲存格。( B3 位置 )
ActiveCell.Address — 游標位址。( $B$3 )
ActiveCell.Column — 游標行號。( 2 ) — ( PS. A欄為 : 1B欄為 : 2 ……,以此類推 ! )
ActiveCell.Row — 游標列號。( 3 )

選取(單格)儲存格 : Select

[A3].Select — 選取 [ A3 ] 儲存格。意思是 : 滑鼠游標點選 A3 位址。 [ 注意 ] : [A3] — 意指 : 絕對位置。中括號內,不能使用變數。
Range(“A3”).Select — 同上。
Cells(3, “A”).Select — 同上。★ Cells( 3, “A” ) — 列 : 在前行 : 在後
Cells(3, 1).Select — 同上,選取 3列 1行 的位址 = A3。

選取(範圍)儲存格

[A2:C5].Select — 選取 [ A2 : C5 ] 範圍儲存格。
Range(“A2:C5”)
.Select — 同上。
Range(Cells(2, “A”), Cells(5, “C”)).Select — 同上。 [備註] 所說 : Range 可以將 Cells 拿來當成屬性使用。
Range(Cells(2, 1), Cells(5, 3))
.Select — 同上。

選取(整行/列)儲存格

Range(“A:A”).Select — 選取 ( A行 ) 全部。
Range(“1:5”).Select  —  選取 ( 1列 ~ 5列 ) 全部。
Columns(“A”).Select  — 選取 ( A行 ) 全部。
Columns(5).Select  — 選取 ( 第5行 ) 全部。
Rows(2).Select — 選取 ( 第2列 ) 全部。

☆ 選取游標所在的整行 / 列 :
ActiveCell.EntireColumn.Select — 游標儲存格在 B3,執行後,B行 整行會被選取。
ActiveCell.EntireRow.Select — 游標儲存格在 B3,執行後,第3列 整列會被選取。

☆ 選取所有行 / 列 / 儲存格 — 下面三組語法,目的都相同。意思是 : 選取工作表上的所有儲存格。
Columns.Select — 選取所有的行。
Rows.Select — 選取所有的列。
Cells.Select — 選取所有的儲存格。

選取(不相鄰)儲存格

Range(“A1:C3, F1:H3”).Select — 選取 ( A1:C3 ) 及 ( F1:H3 ) 的範圍儲存格。
Union(Range(Cells(1, 1), Cells(3, 3)), Range(Cells(1, 6), Cells(3, 8))).Select — 同上用法。

合併(Merge) / 解除合併(UnMerge)

[A1:C1].Select
Selection.Merge — 合併儲存格。
Selection.UnMerge — 解除合併儲存格。若沒有給予選取目標,預設 : 解除上一個合併儲存格。

清除(Clear) / 刪除(Delete)

Clear / ClearContents / Delete 指令,皆適用於單格 / 範圍 / 整行、列 / 所有儲存格 的操作。

Cells.Clear — 清除所有儲存格的內容格式
Cells.ClearContents —  清除所有儲存格的內容
Cells.Delete — 刪除所有儲存格。

Range(“M10”).Delete Shift:=xlUp

刪除(Delete) – Shift 參數用法 :
xlToLeft : 刪除儲存格後,原儲存格資料往移動。
xlUp : 刪除儲存格後,原儲存格資料往移動。

複製(Copy) / 剪下(Cut) — 貼上

[A1].Copy [B1] — 複製 [ A1 ] 儲存格,粘貼到 [ B1 ] 儲存格。
Range(“A1:C3”).Copy Range(“D1”) — 複製 ( A1 : C3 ) 範圍儲存格 到 ( D1 ) 開頭的位置 — 貼上。
Range(“A1:C3”).Cut Range(“D1”) — 剪下 ( A1 : C3 ) 範圍儲存格 到 ( D1 ) 開頭的位置 — 貼上。
Range(“A1”).Copy Sheets(“工作表2”).Range(“A1”) — 複製 ( A1 ) 儲存格資料 到 工作表2 ( A1 ) 儲存格 — 貼上。

貼上(Paste)

Range(“A2:H2”).Copy
Range(“A” & lastRow + 1).Select
Selection.PasteSpecial Paste:=xlPasteValues

貼上(Paste) 參數用法 :
xlPasteAll : 全部(All)貼在目標位置。
xlPasteValues : 貼在目標位置的資料為 : 數值
xlPasteFormulas : 貼在目標位置的資料為 : 公式

插入(Insert)

Range(“M10:Q10”).Select
Selection.Insert Shift:=xlToRight

插入(Insert) – Shift 參數用法 :
xlToRight : 插入儲存格後,原儲存格資料往移動。
xlDown : 插入儲存格後,原儲存格資料往移動。

行/列轉置 (Transpose:=True)

Range(“B2”).Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select

Selection.Copy
Range(“V2”).Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True

貼上(Paste) 其他參數用法 :
Operation : xlNone (不採取行動) / xlPasteSpecialOperationAdd : 複製的資料將新增至目的地儲存格。
SkipBlanks : 預設值為 False。若為 True : 不會將剪貼簿中的空白儲存格貼到目的地。
Transpose : 預設值為 False。若為 True : 表示將複製的資料列與欄轉置後貼上。

快速移動 : End

※ 如同 EXCEL 快速鍵 : CTRL + 方向鍵,意思是 : 將游標快速移動到資料區域(有資料)的邊界儲存格。

[ 快速移動 – 參數用法 ] :
CTRL + ↓ : End(xlDown) — 快速向
CTRL + → : End(xlToRight) — 快速向
CTRL + ← : End(xlToLeft) — 快速向
CTRL + ↑ : End(xlUp) — 快速向

CTRL 快速移動鍵

[ 快速移動 – VBA指令 解說 ] : 從 A1 儲存格,快速移動一圈,再回到 A1。
ActiveCell.End(xlDown).Select — 由上圖目前 A1 游標儲存格,End(xlDown) 快速往移動到 A4 資料邊界(有資料)欄位。
[A4].
End(xlToRight).Select
— 游標從 [ A4 ] 儲存格,End(xlToRight) 快速往移動到 E4
Range(“E4”).
End(xlDown).Select
— 游標從 ( E4 ) 儲存格,End(xlDown) 快速往移動到 E7
Cells(7, “E”).
End(xlToLeft).Select
— 游標從 ( E7 ) 儲存格,End(xlToLeft) 快速往移動到 A7
Cells(7, 1).
End(xlUp).Select
— 游標從 ( A7 ) 儲存格,End(xlUp) 快速往移動,回到 A4
ActiveCell.
End(xlUp).Select
— 游標從 ( A4 ) 儲存格,End(xlUp) 快速往移動,但上方沒有任何資料欄位,就會停止在最邊界位置 A1

快速範圍選取 : End

※ 如同 EXCEL 快速鍵 : CTRL + SHIFT + 方向鍵,意思是 : 選取游標快速移動到資料區域(有資料)邊界的全部儲存格。

[ 快速範圍選取 – 參數用法 ] :
CTRL + SHIFT + ↓ : Selection.End(xlDown) — 快速向選取。
CTRL + SHIFT + → : Selection.End(xlToRight) — 快速向選取。
CTRL + SHIFT + ← : Selection.End(xlToLeft) — 快速向選取。
CTRL + SHIFT + ↑ : Selection.End(xlUp) — 快速向選取。

CTRL SHIFT 方向鍵

[ 快速範圍選取 – VBA指令 解說 ] : 從 A1 儲存格,快速選取到 E4 的全部儲存格。
Range(“A1”).Select — 若游標起始在 A1 位址,這行指令可以不寫。
Range(Selection,
Selection.End(xlToRight)).Select
— 從游標 A1 位址,向範圍選取到 E1 位址的所有儲存格。
Range(Selection,
Selection.End(xlDown)).Select
— 從游標 E1 位址,繼續向範圍選取到 E4 位址,涵蓋到 A4 的所有儲存格。

微調移動 : Offset

[ 微調移動 – 參數用法 ] :
ActiveCell.Offset( 1, 0 ).Select — 游標儲存格( 下移1列 )。
ActiveCell.Offset( -1 ).Select — 游標儲存格( 上移1列 )。
ActiveCell.Offset( 0, 2 ).Select — 游標儲存格( 右移2行 )。
ActiveCell.Offset( , -2 ).Select — 游標儲存格( 左移2行 )。

[ 語法範例 ] :
[A1].Offset(0, 2).Select — 游標由 [ A1 ] 右移2行。
Range(“A1”).Offset(0, 2).Select — 同上。
Cells(1, “A”).Offset(0, 2).Select — 同上。

排序 : Sort

[ 語法範例輕鬆幾步驟 – 抓取 外資買賣超歷史資料 ] :
Range(“A4:O100”).Sort Key1:=Range(“J4“), Order1:=xlDescending, Header:=xlNo

[ 排序(Sort) – 指令用法 ] :
Range(“A4:O100”) : 設定排序範圍 : A4 ~ O100
◎ Key1:=Range(“J4“) : 指定排序的開始欄位 : J4欄。
◎ Order1:=xlDescending : 排序方式。( PS. 參數 : xlAscending ( 升冪 – 由小到大排列 ) / xlDescending ( 降冪 — 由大到小排列 )
◎ Header:=xlNo : 排序資料開頭是否為 : 表頭(Header)。( PS. 參數 : xlYes(有表頭) / xlNo(無表頭)。)

搜尋 : Find

[ 語法範例_A – 3分鐘教會你 – 抓取 大盤借券賣出餘額 歷史資料 ] :
countRow = Range(“B:B”).Find(“合計”).Row

[ 搜尋(Find) – 指令用法 ] :
countRow = Range(“B:B”).Find(“合計”).Row : 利用 Range.Find方法,搜尋 : B整欄,是否有 “合計“字元,若有 → 傳回 Row(1112列)值,給 countRow 變數。

[ 語法範例_B ] :
Set xFind = Range(“B2:B100”).Find(stockCode, LookIn:=xlValues)
If Not xFind Is Nothing Then
xPrice = Range(“C” & xFind.Row)
End If
Set xFind = Nothing

[ 參數設定 ] :
LookIn:=xlValues : 數值搜尋。( ※ xlFormulas : 公式搜尋 / xlComments : 備註搜尋。)
lookat:=xlWhole : 完整符合。( ※ xlPart : 部分符合。)
SearchOrder:=xlByRows : 依列號搜尋。( ※ xlByColumns : 依行號搜尋。)
SearchDirection:=xlNext : 正向搜尋。( ※ xlPrevious : 反向搜尋。)
MatchCase:=Ture : 區分大小寫。( ※ 預設值 : False。)

※ 使用 FindNext 及 FindPrevious 方法,可以進行重複搜尋。( PS. 必須搭配 Find指令搜尋到第一個值之後,才能使用 FindNext。)

( PS. 未找到符合資料,系統會傳回 Nothing,不會傳回錯誤訊息。)
→ 以IF指令來作判別 : If xFind is Nothing then
( 注意 : 公式是以 xFind is Nothing 來設定,而非 xFind = Nothing。)

查找行數(Column)/列數(Row)

☆ 得知游標儲存格的行數(Column)/列數(Row) :
A = Range(“B1”).Column — Column 為 B ( 第2行 ),所以 A 變數的值 = 2
B = Range(“C5”).Row — Row 為 5 ( 第5列 ),所以 B 變數的值 = 5

newColume = Range(“A1”).End(xlToRight).Column — 得知範圍資料的最右一行的行數。( 從 A1 往右找 )
newRow = Range(“A1048576”).End(xlUp).Row — 得知範圍資料的最底一列的列數。( 從 底部 A1048576 往上找 )

刪除重複資料 : RemoveDuplicates

[ 指令用法 ] :
◎ Range(“A2:E100”).RemoveDuplicates Columns:=1, Header:=xlYes ‘ 刪除A2~E100欄位中的重複資料 — 以第1行(A行)為目標值(含表頭)。

字串處理指令

& (字串連接) : 可利用 & 指令,將 A 和 B 兩字串相連接,但須注意的是 & 指令前後,都要加入一個 空白格
[ 舉例 ] : [ A1 ] = ” Missing ” & ” You ! ” ( 注意 : & 前後皆有空格 ! )
[ 輸出 ] : Missing You !

Len : 傳回該字串的長度。
[ 舉例 ] : [ A1 ] = Len(“Hello”)
[ 輸出 ] : 5

Left : 取出字串開頭(左邊)的部分。
[ 舉例 ] : [ A1 ] = Left(“Welcom”, 3)
[ 輸出 ] : Wel

Right : 取出字串結尾(右邊)的部分。
[ 舉例 ] : [ A1 ] = Right(“Welcom”, 3)
[ 輸出 ] : com

Mid : 取出字串任意的位置。
[ 舉例 ] : [ A1 ] = Mid(“Welcom”, 2, 3)
[ 輸出 ] : elc

[ 範例 ] : 西元年 / 中國年 日期互換


    [ 程式碼 / 西元年轉換成中國年 ] 
    nowDate = Format(Now(), "yyyymmdd")  ' → 所得之西元日期格式為 : "20230814"。
    ChDate = Int(Left(nowDate , 4) - 1911) & "/" & Mid(nowDate , 5, 2) & "/" & Right(nowDate , 2)  ' → 中國年 : "112/08/14"。

    [ 程式碼 / 中國年轉換成西元年 ] 
    ADdate = Int(Left(ChDate, 3) + 1911) & Right(ChDate, 6)  ' 西元年日期格式 : "2023/08/14"。
    nowDate = Replace(ADdate, "/", "")  ' → 西元年日期格式 : "20230814"。    
    
    ( PS. 也可直接轉換 : ADdate = Int(Left(ChDate, 3) + 1911) & Mid(ChDate, 5, 2) & Right(ChDate, 2)  → 西元年日期格式 : "20230814"。

字串比對 : StrComp

StrComp : 比對字串,傳回 整數值 的比對結果。

[ 語法公式 ] : StrComp ( string1 , string2 , [ compare ] )
※ compare : 為 0省略,則進行 二進位 比較;為 1 : 則進行 文字 比較。

[ 傳回值 ] :
◎ string1 小於 string2 : 傳回 -1
◎ string1 等於 string2 : 傳回 0
◎ string1 大於 string2 : 傳回 1
◎ string1 或 string2 為 NULL : 則傳回 NULL


    [ 程式碼 / 比對字串 ] 
    xCompare = StrComp("20230817", "20230817", 1)  ' 比對字串。
    If xCompare = 0 Then
        msgbox " 資料存在 "
    Else
        msgbox " 資料不存在 "
    End if

V B A 資 源

EXCEL & VBA功能 – 綜合筆記
◎ EXCEL & VBA功能 筆記 : 將針對文章中所使用的 EXCEL 及 VBA公式 / 工具操作 / 巨集設定 / 控制項的運用,做個整合記錄,方便大家在學習當下的參考與使用。

VBA指令 – 彙整筆記
◎ VBA 提供相當多的指令用法,VBA指令 彙整筆記,將會陸續記錄 VBA文章 中,所用過的 VBA指令,方便學員們對照運用。

VBA程式語法 – 彙整筆記
◎ 語法就是程式的文法。 使用者要與電腦溝通,就必須遵守這些規則。VBA程式語法 筆記 : 將針對 VBA文章 中所使用的 VBA程式語法,做個整合記錄,方便大家在學習當下參考與使用。