12
EXCEL VBA C H A P T E R 01 ExcelVBA 除了是活用 Excel 的道具,同時也是學習程式設計的最 佳入口。電腦程式語言有很多種,像是 CVisual BasicJava 等,而其中以 ExcelVBA 最簡單易懂,而且即便是程式設計的新手 也能在 Excel 功能的搭配之下,立刻寫出實用的程式。 就讓我們先試著撰寫超簡單的程式,當成邁入 ExcelVBA 世界的 第一步吧!學完本章內容,就能顯示下列這種訊息方塊。 此外,程式碼輸入錯誤時,Excel 可是會生氣的說:「你寫錯了」 喔,就讓我們好好地學習本章,別再惹 Excel 生氣了。 巨集的基礎

巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

Embed Size (px)

Citation preview

Page 1: 巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

E X C E L V B A

C H A P T E R

01

ExcelVBA除了是活用 Excel的道具,同時也是學習程式設計的最佳入口。電腦程式語言有很多種,像是 C、Visual Basic、Java等等,而其中以 ExcelVBA最簡單易懂,而且即便是程式設計的新手也能在 Excel功能的搭配之下,立刻寫出實用的程式。

就讓我們先試著撰寫超簡單的程式,當成邁入 ExcelVBA世界的第一步吧!學完本章內容,就能顯示下列這種訊息方塊。

此外,程式碼輸入錯誤時,Excel可是會生氣的說:「你寫錯了」喔,就讓我們好好地學習本章,別再惹 Excel生氣了。

巨集的基礎

Page 2: 巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

1514

1312

1110

0908

0706

0504

0302

01

巨集的基礎

4

Chapter

01

S T E P

03

O P E R A T I O N

顯示開發人員索引標籤(2013 / 2010)

Excel 2013 / 2010一開始不會顯示任何與巨集有關的選單,必須進行下列的設定開啟巨集的選單。

顯示開發人員索引標籤

1在功能區裡按下滑鼠

右鍵 →【自訂功能區】

2勾選「開發人員」 選項

3 點選「確定」

4顯示了「開發人員」 索引標籤

Excel 2013 / 2010

Page 3: 巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

1514

1312

1110

0908

0706

0504

0302

01

巨集的基礎

12

Chapter

01

完成巨集

在「Sub 巨集名稱 ()」與「End Sub」之間寫入程式碼,巨集就完成了。「坐而言不如起而行」,讓我們先試著動手完成巨集吧!

一起完成巨集吧

這裡使用的「MsgBox」就是顯示訊息方塊的函數,一聽到函數,大家可能會想起「f(x)=2x+1」這種數學的函數,不過 VBA的函數與數學函數是不同的。

VBA的函數就是「進行某種處理的命令區塊」,正如同剛剛範例裡的命令方塊就是命令 VBA進行「請顯示訊息方塊」的意思。VBA內建了多種這類的函數,可用來執行各種處理,而這些函數也稱為內建函數。

接著要說明的是設定函數執行方式的參數,一樣以剛剛的範例來看,

「MsgBox」函數被賦予了「大家好」的參數,所以會顯示內容為「大家好」的訊息方塊。

S T E P

02

圖片的圖說與快捷碼

● 程式碼以「Sub」開始,以「End Sub」結束。

● 在「Sub」後面接著寫巨集名稱。

Sub 巨集名稱() 巨集的內容End Sub

小結

O P E R A T I O N

Î「msgbox」請全部以半

形字元輸入,請先將輸入

法切換成半形模式再輸入。

Î雖然「msgbox」全部

以小寫英文字母輸入,

但 是 經 過 步 驟 2 的 操

作之後,應該會轉換成

「MsgBox」這種部份字母

變成大寫的格式,如果沒

有轉換的話,代表命令的

名稱拼錯了。

1 加入這行內容

別忘了「""」喔!

2確認滑鼠位於右端,

按下 Enter 鍵

「msgbox」將轉換成「MsgBox」。

Page 4: 巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

1514

1312

1110

0908

0706

0504

0302

01

巨集的基礎

28

Chapter

01

建立巨集的工具

VBE與一般的編輯器一樣,都內建了編輯內容的工具列,而且與常見的文字處理器一樣可以拷貝或貼上內容。

►用以編輯內容的工具

S T E P

07

只開啟一個活頁簿的時候,不需要擔心儲存巨集的方法,但是一旦開啟多個活

頁簿,就必須確認巨集到底位於哪個活頁簿,而從專案總管裡就能看出巨集的位

置了。

MEMO 開啟多個活頁簿時,儲存巨集的方法

此外,位於程式碼視窗右上角的元件方塊還可以跳到指定的巨集。

►利用元件方塊跳至指定的巨集

儲存 剪下 複製 貼上 搜尋 復原 重做

2滑鼠游標將跳到步驟一

選取的巨集

1點選此處,再從列表裡

選擇巨集名稱

這裡註明了檔案名稱,可以

發現檔名為 BOOK1

這個 Module1依附在 Book1之下

這個 Module1依附在 Book2之下

從這裡的名稱可以

看出目前的程式碼

視窗屬於 Book1的Module1

Page 5: 巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

1514

1312

1110

0908

0706

0504

0302

01

巨集的基礎

30

Chapter

01

04 產生錯誤!!被Excel怒罵怎麼辦?

剛開始學寫寫 VBA 程式時,難免會犯下總總錯誤,此時 Excel 大多會顯示錯誤訊息提醒,讓我們一

起了解一下這些錯誤訊息是什麼意思吧!

Excel 氣紅了臉

VBA也是電腦能夠閱讀的「語言」之一,所以也有所謂的「文法」。大部分的外國人利用簡單的中文向我們搭話時,即便說得不盡正確,我們大概都會推

測「他說的應該是那個意思吧?」

不過電腦可是腦袋硬硬的超級頑固大叔,只要文法稍微有誤,就會立刻生氣

地說:「我看不懂這種鬼東西!」,然後就罷工。Excel也不例外,今後各位讀者撰寫巨集時,也一定會遇到 Excel生氣罷工的情況。

話說回來,Excel可不會無緣無故的發火,只要了解它為什麼生氣,就不用過度擔心了。Excel的生氣理由大致分成三種,讓我們一起了解這幾種理由的差別吧!

Excel的生氣理由有下列三種:

• 變成紅色生氣

• 變成藍色生氣

• 變成黃色生氣

首先要先從變成紅色生氣說明。試著輸入錯誤的巨集,故意惹 Excel生氣看看。

請插入模組(→ P.10),並輸入下列的巨集。

試著輸入下列錯誤的巨集

Sub test() msgbox 大家好"End Sub

S T E P

01

O P E R A T I O N

2按下 Enter 鍵之後,將顯示下列的錯誤

1故意少打一個雙引號

(")

在「msgbox」與「大家好」 之間輸入空白

Page 6: 巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

1514

1312

1110

0908

0706

0504

0302

01

函數與變數

38

Chapter

02

S T E P

01 設定多個參數

第 1章提到MsgBox就是顯示訊息方塊的「函數」,而「MsgBox "大家好 "」裡,被雙引號括起來的「"大家好 "」就是參數(P.13)。MsgBox這個函數可在Excel裡顯示訊息方塊,「大家好」這個參數就被設定為訊息方塊裡的文字。

除了可以在訊息方塊裡使用「確定」按鈕,也可以使用「是」、「否」按鈕,

而這兩個按鈕也能利用參數設定。換句話說,函數可同時指定多個參數。

如果想同時設定多個參數,可利用逗號間隔各個參數。下列的「MsgBox "大家好 ",vbYesNo」就利用逗號將「"大家好 "」以及「vbYesNo」這兩個參數隔 開來。

讓我們試著輸入下列的巨集。

試著設定多個參數

01 MsgBox 的參數

撰寫 VBA 的程式通常會用到各種函數,此時各函數的設定值(Parameter)就稱為「參數」。

範例

「TEST」

Î本書的範例檔可從下列

的網址下載:http://books.

gotop.com.tw/download/

ACI026100

不過開啟檔案之前,最好

先依照在目錄之前的說明

「啟用內容」。

1啟動 VBE,選取「插入」→「模組」

O P E R A T I O N

Page 7: 巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

0102

0304

0506

0708

0910

1112

1314

15

MsgBox 的參數 01

43

要記住每個參數的順序,或是記下每個參數名稱都不是一件容易的事情吧,老

實說只要先記個大概,然後依照提示輸入命令也就夠了。

例如,輸入「MsgBox」之後,就會顯示下圖的提示,其中斜體字的「Prompt」

與「Buttons」就是參數名稱。就算不使用參數名稱,也可以從提示裡了解參數的

順序。

MEMO 自動快速提示

C O L U M N

輸入途中按下 Ctrl + space 鍵,可顯示輸入提示或是候補選項,可說是一項方便

的功能。例如像下列一樣只輸入「ms」就按下 Ctrl + space ,就會顯示以 ms為字

首的輸入候選。

此外,如果輸入「msg」之後按下 Ctrl + space ,會因為沒有其他候選而直接轉

換成「MsgBox」。

輸入支援功能( Ctrl + space )

Î利用中括號「[]」圍起

來的參數代表「可省略的

參數」,例如 Prompt 就

是沒被中括號圍起來的參

數,所以不可以省略,而

Buttons則是可以省略的

參數。

顯示黃色提示訊息

Î除了 MsgBox 這類內

建 的 函 數 之 外, 程 序

(→ P.178)與已經宣告

的變數(→ P.156)都可

利用這個功能顯示輸入候

選。 顯示候選選項

已經自動補充後續的敘述

Page 8: 巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

0102

0304

0506

0708

0910

1112

1314

15

變數的概念 02

45

何必將資料放進箱子裡,直接顯示資料不是比較簡單嗎?

其實將計算結果指定給變數之後,就能在各種巨集處理裡使用這個箱子,如

此一來使用者可使用輸入的數值,或是在後續的章節裡出現的巨集也是利用變

數進行重複處理或分歧處,所以變數實在是不可或缺的一項工具。

巨集名稱與變數名稱的命名規則

● 變數名稱可使用半形英數字、中文、底線(_),但不可以使用「@」、「&」、

「$」、「-」這類符號。

● 名稱不能以數字或底線為開頭。

● 名稱長度必須低於 255個字元(全形字元視為兩個字元)。

● 不可以使用「Sub」這類 Excel VBA已經使用的名稱(保留字)。

● 不可以使用已使用的巨集名稱。雖然使用了已使用的名稱不會立刻顯示錯誤,

但是一執行巨集就會造成錯誤。

● 下列是巨集名稱與變數名稱的範例:

Test Score ×:不可插入空白

1a ×:開頭不可以是數字

A&B ×:不可插入 &這類特殊符號

台北市台灣省 ○:可使用中文

小結

C O L U M N

程式語言的世界很少像 VBA一樣,能夠使用中文的變數名稱,如 C語言或是

C++這類主流的程式語言,通常都不接受中文變數名稱。

使用中文的好處在於不需要為了變數的命名而煩惱。Excel到了 Excel 97之後才

開始不會因為使用中文變數名稱而產生錯誤,所以當您在學習程式設計時,不妨多

使用中文的變數名稱。

不過,到底該不該使用中文的變數名稱或巨集名稱(程序名稱)其實還有討論的

空間。如果自行撰寫的程式會用於工作或是被他人使用,建議不要使用中文的變數

名稱或巨集名稱,尤其軟體已朝多國語言發展,使用中文命名的程式不保證今後都

不會發生任何問題。

為了避免不必要的風險發生,建議大家最好不要使用中文命名。

中文的變數名稱

Î不同的模組工作表可使

用相同的巨集名稱。

Page 9: 巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

0102

0304

0506

0708

0910

1112

1314

15

第一個 If 條件句 01

59

確認命運的選擇巨集

到目前為止,大家應該都了解「命運的選擇」巨集了,請大家確認一下命運

的選擇 .xlsx的「命運的選擇」巨集的程式碼,構造應該如下。

Sub 命運的選擇() 結果 = MsgBox("開始命運的選擇!你要選「是」還是「否」", vbYesNo)

If 結果 = vbYes Then (省略:點選「是」所執行的命令句) Else (省略:點選「否」所執行的命令句) End If

End Sub

S T E P

03

下面兩段程式碼的意義雖然完全一樣,但是左邊(①)經過縮排整理的程式碼

比較容易閱讀,大部分的人也都習慣這麼做。要縮排的時候,按下 Tab 鍵即可。

預設值會在行首插入 4個空白,而要改變縮排的長度,可從 VBE的「工具」→

「選項」裡,調整「定位點寬度」的數字。

►①讓 If條件句內的內容縮排

If 結果 = vbYes Then MsgBox "點選了是。"End If

MEMO 縮排

話說回來,當參數只有一個,寫成「MsgBox("這是測∼試 ")」,也就是利用括

號將參數括號來,並不會產生錯誤。這是為什麼呢?看來,雖然外表上看起來都

是括號,但實際上 Excel將「MsgBox("這是測∼試 ")」的括號解釋成括住算式的

括號,而非括住參數的括號。括住算式的括號也就是在「(1+1)*2」這類算式中

代表「請先計算 1+1」的括號。假設在不使用傳回值的情況下,將程式碼寫成下

列的樣子,

MsgBox("這是測試"),(vbYes)

一樣不會發生錯誤喔!

範例

「命運的選擇」

Î 是斷行符號,實際

的程式碼應該是連成一行

的才對。

►②不讓 If條件句內的內容縮排

If 結果 = vbYes ThenMsgBox "點選了是。"End If

Page 10: 巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

1514

1312

1110

0908

0706

0504

0302

01

條件分歧

66

Chapter

03

下圖是 Select Case句的執行流程。

►範例的執行流程

MsgBox "小於10歲"

MsgBox "大於10歲小於30歲"

MsgBox "剛好30歲"

MsgBox "31或32歲"

MsgBox "33歲到39歲"

MsgBox "4字頭的年紀"

MsgBox "不在任何範圍之內"

偽 真

偽 真

偽 真

ls<10(結果<10)

ls<30(結果<30)

ls 30(結果=30)

ls 31,30(結果=31 Or 結果=30)

ls<=37,38,39(結果<=37 Or 結果=38 Or 結果=39)

ls 40 To 49(結果>=40 And 結果<=49)

Else(不符合上述所有條件)

除了以雙引號括住字串時,字串的使用方法與數值一樣。例如,可仿照下列的

程式碼使用字串。

Sub 字串與SelectCase() 問候語 = InputBox("請輸入問候語") Select Case 問候語 Case "感謝您,十分感謝您" MsgBox "不客氣" Case "早安", "大家好", "晚安" MsgBox 問候語 Case Else MsgBox "不好意思,我不知道你在說什麼" End SelectEnd Sub

MEMO 針對字串的 Select Case 句範例

「字串與 SelectCase」

Î這次的範例將輸入的值

代入變數「問候語」。當變

數「問候語」為「感謝您」

或「十分感謝您」之一,

就回答「不客氣」,如果

是「早安」、「大家好」、

「晚安」其中之一,就直

接以對方的問候語回答。

如果輸入的值不屬於上

述任何一種,就回答「不

好意思,我不知道你在說

什麼」。

Page 11: 巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

0102

0304

0506

0708

0910

1112

1314

15

常用的屬性與方法 02

75

02 常用的屬性與方法

在了解屬性與方法的基本使用方法之後,接下來想帶著大家了解特別重要的屬性與方法,之後如果

需要使用這類屬性或方法,只需要翻回這一章,重新讀一遍就夠了。

儲存格的基本操作

Cells屬性的值就是代表特定儲存格的 Range物件,其參數可利用 Cells(列

編號 ,欄編號)的順序指定(參考下圖)。

Z A B C D E

1 Cells(1,1) Cells(1,2) Cells(1,3)

2 Cells(2,1) Cells(2,2) Cells(2,3)

3 Cells(3,1) Cells(3,2) Cells(3,3)

小結

S T E P

01 以列與欄指定

01節利用「Range("A1")」的語法指定了儲存格,但有時候會希望以第 1欄或第 2欄的方式指定,而不是以 A欄或 B欄的方式指定。而這時候最能派上用場的就是 Cells屬性,而且常跟下一章介紹的 For迴圈句搭配使用。

Cells屬性的格式為「列編號 ,欄編號」,而且會傳回相當於該儲存格範圍的Range物件。

試用 Cells 屬性

Sub 利用列編號與欄編號指定儲存格() Cells(1, 2).Value = "第1列第2欄" Cells(2, 2).Value = "第2列第2欄"End Sub

O P E R A T I O N

範例

「利用列編號與欄編號指

定儲存格」

列編號為 1、欄編號為 2的儲存格

列編號為 2、欄編號為 2的儲存格

Î在 此 使 用 的 Cells 是

Application物件的屬性,

但是啟用中的 Application

物件可以省略不寫,所

以才會直接寫屬性名稱

(→ P.191)。

1列 2列 3列

2欄

3欄

1欄

不要忘記 Cells最後的 s1

Page 12: 巨集的基礎 - epaper.gotop.com.twepaper.gotop.com.tw/pdf/ACI026100.pdf · 101112131415 02 03 04 05 06 07 08 09 01 巨集的基礎 30 C 01 04 產生錯誤!!被Excel怒罵怎麼辦?

1514

1312

1110

0908

0706

0504

0302

01

字串與日期函數

138

Chapter

08

斷行與顯示雙引號

各種字元之中,有一類必須使用特殊的方法才能顯示,例如「空白的字串」、

「斷行字元」或是「雙引號」,就屬於這一類。

空白字串可利用兩個並排的雙引號「""」顯示,而斷行字元則可利用「vbCrLf」這個常數代表。

有關常數的說明請參考 P.173,大家先將常數想成不能改變內容的變數就夠了,而且 VBA內建了多種常數,可隨時在程式碼裡使用。除了這裡介紹的「vbCrLf」之外,還有剛剛在 StrConv 函數的第二個參數裡使用的「vbUpperCase」、「vbLowerCase」也都屬於常數的一種。

此外,要顯示雙引號的時候,可在圍住字串的雙引號之內連續輸入兩個雙引

號,此時將只會顯示一個雙引號。

S T E P

04

StrConv 函數的傳回值

● StrConv(字串, 轉換方法)

依照「轉換方法」轉換第一個參數指定的「字串」。主要的「轉換方法」如下。

參數 意思

vbUpperCase 轉換成大寫英文字母

vbLowerCase 轉換成小寫英文字母

vbWide 轉換成全形字母

vbNarrow 轉換成半形字母

vbKatakana 轉換成片假名

vbHiragana 轉換成平假名

小結

利用 vbUpperCase轉換成大寫英文字母1

利用 vbLowerCase轉換成小寫英文字母2

利用 vbWide轉換成全形字母3

利用 vbNarrow轉換成半形字母4

利用 vbKatakana轉換成片假名5

利用 vbHiragana轉換成平假名6

轉換前 轉換後

Î當然,漢字與平假名是

無法轉換成半形,英文字

母也無法轉換成片假名。

不過 Excel不會因此顯示

錯誤,只是原封不動地顯

示原本的文字而已。