Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
1-10
1-3 初學者入門導引為了讓初學者去除恐懼,我們將以實例說明與操作,讓您跟著完成簡單的練
習。這一節的內容分成二大部份,分別為:錄寫巨集與自行撰寫巨集,期望讀者
能循序閱讀,以引發您的學習興趣。
1-3-1 錄寫 Excel VBA巨集我們經常在授課時,與所有初學 VBA的朋友說,只要您會唱卡拉 OK或使
用錄音機、CD音響、DVD播放機⋯等設備,就會使用 Excel VBA。其主要原因
是,Excel VBA有一個「錄寫」功能,能夠將使用者在 Excel中所執行的指令或
滑鼠的動作,自動錄下來且轉換為 Visual Basic程式碼。
現在,請依循下列步驟,自己做一次,馬上就會感受到它的神奇魅力!下面
的練習,主要是執行在 A1儲存格填入 1、B2填入 2、C3填入 3的基本輸入工
作。
STEP1 啟動 Excel之後,開啟範例檔案「Ch01_VBA.xlsm」,選擇「工作表 1」,
執行 開發人員 >程式碼 >錄製巨集 指令。
STEP2 出現 錄製巨集 對話方塊,輸入所要的 巨集名稱,例如:基本練習。如果
不輸入,Excel即會使用預設的名稱 巨集 1、巨集 2、⋯等來命名。
STEP3 其他設定請使用預設值,暫時不去動它,免得才剛開始就把自己搞得暈頭
轉向,按【確定】鈕。
ACI0288_Excel2016VBA.indb 10 2016/4/25 下午 04:03:34
1-11
輕輕鬆鬆認識 E
xcel VB
A
1
STEP4 開始錄製巨集。請留意!從現在起 Excel中所執行的每一個動作都會被錄製
下來;此時,程式碼 功能區群組出現 停止錄製 指令。
1
2
說明
巨集名稱 的命名方式必須遵守下列規則:可以使用中文或英文。
名稱的第一個字必須是英文字母或中文字。
名稱中不能含有 空白 ( )的字元。
名稱中可以使用 底線 (_)字元。
STEP5 先點選 A1儲存格,輸入 1;接著,分別在 B2輸入 2、C3輸入 3。
STEP6 點選 A1儲存格,將儲存格游標放在工作表左上角的位置。
STEP7 執行 開發人員 >程式碼 >停止錄製 指令,完成錄寫工作。
接下頁
ACI0288_Excel2016VBA.indb 11 2016/4/25 下午 04:03:34
1-12
恭喜您,完成了第一個 Excel VBA巨集。您可能會說,這是什麼啊!我只
不過是輸入 1、2、3就算完成一個 VBA巨集。沒錯!下一小節,您就會看到自
己的傑作了。
說明
狀態列 上也會出現 錄製巨集 或 停止錄製 的按鈕。
錄製巨集
停止錄製
ACI0288_Excel2016VBA.indb 12 2016/4/25 下午 04:03:35
1-13
輕輕鬆鬆認識 E
xcel VB
A
1
STEP2 出現 巨集 對話方塊,在 巨集名稱
清單中選取「基本練習」,按【執
行】鈕。
1-3-2 執行 Excel VBA巨集與顯示 VBA程式前一小節已經錄好一個巨集,現在就依下列步驟來執行它,看看它的成果。
執行 Excel VBA巨集
STEP1 選擇「工作表 2」,執行 開發人員 >程式碼 >巨集 指令。
1
2
ACI0288_Excel2016VBA.indb 13 2016/4/25 下午 04:03:35
1-14
不錯吧!以後凡是需要重複執行的工作,例如:格式化工作表或調整欄寬列
高,都可以依循上述方法,錄寫一個巨集,然後執行它就行了。
顯示 VBA程式嗯!那麼剛剛錄製的巨集是放在哪裡呢?怎麼找不到啊!別急,這很簡單,
只要執行 開發人員 >程式碼 > Visual Basic 指令,或按 + 鍵,即會看到
如下圖所示的 Visual Basic編輯視窗。
STEP3 Excel立刻在「工作表 2」的 A1、B2、C3儲存格,分別填入 1、2、3。
ACI0288_Excel2016VBA.indb 14 2016/4/25 下午 04:03:35
1-15
輕輕鬆鬆認識 E
xcel VB
A
1
嘿!怎麼灰灰地一片,什麼也沒有!如果要看到程式內容,還有幾個小動作,
一下子就好了。
STEP1 將滑鼠指向視窗的左側,在 專案總管 中先展開 VBAProjcet,再展開 模組
資料夾。
STEP2 模組 資料夾下方會顯示 Module1,使用滑鼠指向它,並快按二下;右側的
程式碼 窗格即會出現剛剛所錄下來的巨集程式。
1
23
ACI0288_Excel2016VBA.indb 15 2016/4/25 下午 04:03:36
1-16
1-3-3 逐字逐句輸入 VBA程式雖然我們很快地完成一個巨集,但似乎沒有什麼感覺,也沒有太大的成就
感!現在請開始自己寫一個程式,這樣就會有深刻的印象。不過,別被嚇壞了,
更不要把這本書重重摔下,拔腿就跑!
閱讀本節的內容之前,別擔心您是否具備程式基礎,也別問太多為什麼。這
個練習的目的,是讓您親身試著體會撰寫程式的樂趣,所以只要照著做就可以,
詳細的程式語法會在後續的章節中說明。
自己動手撰寫 VBA
STEP1 啟動 Excel之後,執行 開發人員 >程式碼 > Visual Basic 指令。
STEP2 在 Visual Basic編輯視窗中,執行 插入 >模組 指令,即會在其視窗右側,
出現空白的 程式碼 窗格。
ACI0288_Excel2016VBA.indb 16 2016/4/25 下午 04:03:36
1-17
輕輕鬆鬆認識 E
xcel VB
A
1
STEP4 回到 Excel工作表之後,選擇「工作表 3」,執行 開發人員 >程式碼 >巨集
指令。
STEP5 出現 巨集 對話方塊,在 巨集名稱 清單中選取「第一個練習」,按【執行】
鈕。是否發現其結果與執行「基本練習」巨集完全相同呢!
STEP3 參考下圖,把內容輸入到程式碼區域。按 檢視 Microsoft Excel 鈕返回
Excel工作表。
1
2
1
2
3
接下頁
ACI0288_Excel2016VBA.indb 17 2016/4/25 下午 04:03:37
1-18
如果在步驟 5的執行過程中,出現如下圖所示的錯誤訊息,請別心慌!先按
【確定】鈕,這表示剛剛在輸入程式碼時可能打錯字了,先回到 VB編輯視窗將
錯誤改正,然後按 重新設定 鈕,再重新執行巨集。
多打了一個「r」
ACI0288_Excel2016VBA.indb 18 2016/4/25 下午 04:03:37
4-1 處理 Excel 活頁簿
4-2 處理 Excel 工作表
4-3 儲存格的參照位址
4-4 Excel VBA 中儲存格的定義
4-5 選取儲存格範圍的技巧
4-6 應用程式物件集合
4-7 事件程序的重要應用
Excel VBA 常用的程式
Chapter4
ACI0288_Excel2016VBA.indb 1 2016/4/25 下午 04:04:00
4-2
Excel VBA的重心是處理 Excel中的 活頁簿、工作表、圖表、儲存格,以
提升或完成人工作業無法做到的事情。因此,我們將依據實際的工作經驗,將此
部份的相關用法與技巧提供讀者參考。請您依循本章範例多加練習,以便建立進
一步學習 Excel VBA的基礎。
4-1 處埋 Excel活頁簿進行 Excel的一般作業時,首先,使用者一定會開啟一個活頁簿檔案,或是
建立一個新的活頁簿,當工作告一段落後,接著會將其儲存或是關閉。上述這些
事情,在使用 Excel VBA的時候,也一定會碰到。
4-1-1 開啟活頁簿檔案在 Excel VBA中「活頁簿」是一個物件,也是一個物件集合,其名稱為
「Workbooks」。將「Workbooks」對應到 Excel的一般作業,就是我們習慣用
的「*.xls」或「*. xlsx」檔案,有下列幾種常見的開啟檔案的作業方式。
開新檔案-建立新活頁簿
新增一個空白的活頁簿,可以使用預設的狀況,使用「Add」方法來進行。
一般而言,新增的活頁簿即為作用中活頁簿。
範例 開新檔案
Sub 開新檔案 ( ) Workbooks.AddEnd Sub
執行程式後已開啟新的活頁簿檔案
ACI0288_Excel2016VBA.indb 2 2016/4/25 下午 04:04:01
4-3
Excel V
BA
常用的程式
4
範例 開啟指定範本檔案以建立新檔案
Sub 開新檔案 _範本 () Dim wkb1 As Workbook Dim wkb2 As Workbook Set wkb1 = Workbooks.Add(Template:="D:\Test_範本 .xlsx") Set wkb2 = Workbooks.Add(Template:="D:\Test_範本 .xltx") Workbooks.Add ("D:\TAATCL\Test_範本 .xlsx")End Sub
若希望將自己建立好的活頁簿作為範本使用,讓其他使用者不會破壞原始的
活頁簿,則可以依循下列範例,建立一個 VBA巨集,讓使用者透過此 VBA程式
開啟範本檔案。
本例將要開啟的範本檔案放置在「D:\」
執行程式後已開啟指定的「範本」檔案
ACI0288_Excel2016VBA.indb 3 2016/4/25 下午 04:04:01
4-4
此範例使用三種不同的方式開啟範本檔,在範例中我們知道原始活頁簿建
立妥當後,可以直接儲存為「*.xlsx」檔案,當成巨集所開啟的範本檔,不一定
需要儲存為「*.xltx」範本檔案,且執行此 VBA程式所開啟的新檔,會自動在
其檔名之後加上序號,例如:Test_範本 1.xls、Test_範本 2.xls、Test_範本
3.xls⋯等,等同於以範本檔案為基礎開啟新檔案的操作,會自動在其檔名之後加
上序號一樣。
開啟舊檔
開啟一個已存放在儲存媒體中的活頁簿檔案,是經常要處理的事情。不過在
開啟檔案之前,必須知道檔案所存放的磁碟與資料夾名稱,如此才能順利打開。
所以在 VBA中要開啟舊檔,必須加上此檔案的磁碟與資料夾名稱。
範例 開啟舊檔案
Sub Test( ) Workbooks.Open("D:\Test_範本 .xlsx")End Sub
說明
在檔案管理中,檔案所存放的磁碟與資料夾名稱,我們通稱為「路徑」。
參考前述範例,也可以使用物件變數的方式處理開啟舊檔的工作。
範例 使用物件變數的方式開啟舊檔
Sub Test( ) Dim Wkb = As Workbook Set Wkb = Workbooks.Open(FileName:= "D:\Test_範本 .xlsx")End Sub
執行 VBA程式時,如果想要取得活頁簿的名稱,可以使用下列的方法處理。
「.Name」是擷取檔名、「.FullName」則是擷取檔名與資料夾名稱(路徑)。
範例 擷取檔案名稱
Sub 擷取檔名 () Dim wkb As Workbook Set wkb = Workbooks.Open("D:\Test_範本 .xlsx") MsgBox wkb.Name MsgBox wkb.FullName MsgBox wkb.PathEnd Sub
ACI0288_Excel2016VBA.indb 4 2016/4/25 下午 04:04:01
4-5
Excel V
BA
常用的程式
4
作用中的檔案(啟動活頁簿)
工作時可能會同時開啟數個 Excel活頁簿檔案,並視需要在不同的檔案間切
換,每一次切換被選取的檔案,稱為「作用中」檔案。同樣地,在 Excel VBA也
可以同時開啟數個活頁簿,但如要針對某一個活頁簿執行一些程式,則必須先啟
動該活頁簿,對應的陳述式範例如下所示。
範例 將已開啟的活頁簿變為作用中的活頁簿
Sub 啟動活頁簿 ( ) Workbooks("Ch04_VBA.xlsm").ActivateEnd Sub
4-1-2 儲存與關閉檔案無論使用電腦進行哪一項工作,過程中必須記得隨時存檔,以免讓不確定因
素造成資料或檔案的毀損。同樣地,執行 Excel VBA程式時,最好也要將這些使
用中的檔案隨時儲存。
檢查是否具有相同名稱的檔案
使用 VBA執行儲存檔案,最好養成一個習慣,那就是存檔之前先確認資料夾
名稱(路徑),並檢查其中是否已具有相同名稱的檔案。
範例 檢查是否具有相同名稱的檔案
Sub 檢查檔案 ()Dim 找找看我在不在Dim 完整檔案名稱 As String
擷取檔案名稱 擷取檔案完整的儲存路徑 擷取檔案所在磁碟
說明
上述範例中,使用 Path所得到的路徑,不含「\」分隔符號,所以在應用 Path屬性時,記得要加上「\」此分隔符號。
ACI0288_Excel2016VBA.indb 5 2016/4/25 下午 04:04:02
4-6
完整檔案名稱 = "D:\TAATCL\Test_範本 .xlsx" If Dir(完整檔案名稱 ) <> "" Then 找找看我在不在 = True If 找找看我在不在 Then MsgBox 完整檔案名稱 & " 我在這裡哦,請小心! " Else MsgBox 完整檔案名稱 & " 找不到,請放心使用! " End IfEnd Sub
使用 VBA擷取檔名與資料夾(路徑)的做法,還有許多語法可以使用,例
如:ChDir、CurDir、GetFile、FileExists、GetFolder⋯等,讀者可以透過微軟
的「Microsoft Visual Basic for Applications說明」查詢相關資訊。
另存新檔
活頁簿的工作處理完成之後,要趕快將其儲存,其中一種方法是 另存新檔。
Sub 另存新檔 ()Dim wkb As Workbook Set wkb = Workbooks.Open("D:\TAATCL\Test_範本 .xlsx") wkb.SaveAs Filename:="D: TAATCL\ANT Test_範本 .xlsx"End Sub
執行之後,檔案名稱已經變更
ACI0288_Excel2016VBA.indb 6 2016/4/25 下午 04:04:02
4-7
Excel V
BA
常用的程式
4
如果要使用原來的檔名直接 儲存檔案,可以使用下列陳述式來處理。
Sub Test( ) ActiveWorkbook.SaveEnd Sub
關閉檔案
當我們使用完某些檔案以後,即會將其關閉。在 Excel VBA中,關閉檔案 的
方法有下列三種選擇:
ActiveWorkbook.Close
關閉檔案,並出現對話方塊,詢問您是否要儲存檔案。
ActiveWorkbook.Close SaveChanges:=True
直接關閉檔案並儲存。
ActiveWorkbook.Close SaveChanges:=False
直接關閉檔案,不要儲存。
4-1-3 調整視窗的顯示位置Microsoft的視窗作業環境,能夠在世間大行其道,是其「視覺化」的操作介
面讓電腦應用容易上手。使用 Excel VBA如果同時開啟數個檔案,仍然可以安排
這些檔案在螢幕(視窗)上的顯示位置。
活頁簿的視窗編號或名稱
同時開啟數個 Excel活頁簿檔案之後,可以執行 檢視 >視窗 >切換視窗 指
令,在清單中即會看到各個活頁簿對應的視窗編號。在 Excel VBA中,則是以
「Windows (1)」代表編號 1的活頁簿視窗,以此類推。另外,為了確保開啟視窗
時不發生錯誤,也可以使用視窗名稱來辦識,Excel VBA中是以「Windows ("活
頁簿名稱 ")」代表其名稱。
ACI0288_Excel2016VBA.indb 7 2016/4/25 下午 04:04:02
4-8
一共開啟 5個活頁簿檔案
編號 1的活頁簿
VBA的用法
ACI0288_Excel2016VBA.indb 8 2016/4/25 下午 04:04:02
4-9
Excel V
BA
常用的程式
4
作用中的視窗(啟動視窗)
作用中的視窗與作用中的檔案,一般作業中可以將其視為同一件事情,但在
Excel VBA中,會分別以不同的陳述式表示,但其結果相同。
Sub 啟動視窗 () Workbooks("Test_範本 .xlsx").Activate '啟動活頁簿 Windows("Ch04_VBA.xlsm").Activate '啟動視窗End Sub
最大化 /最小化視窗視需要可以將視窗以最小化或最大化方式呈現,Excel VBA 中是以
「WindowState」屬性描述,然後再加上所要的常數。
Sub 調整視窗 () Windows(1).WindowState = xlMaximized '視窗最大化 Windows(2).WindowState = xlMinimized '視窗最小化 Windows(2).WindowState = xlNormal '還原視窗End Sub
關閉視窗
關閉視窗與關閉檔案,在一般作業是指同一件事情,而在 Excel VBA的定義
也是一樣,但表示方法卻不相同。
Sub 關閉視窗 ( ) Windows(1).close '關閉視窗 Windows("Test_範本 .xlsx").close '關閉視窗 Workbooks("Ch04_VBA.xlsm").close '關閉檔案End Sub
ACI0288_Excel2016VBA.indb 9 2016/4/25 下午 04:04:03
4-10
4-2 處理 Excel工作表使用試算表軟體一定會用到 工作表,另外,若要顯示圖表,則會用到 圖表
工作表。由此可知工作表與圖表是試算表軟體中的重要元件。Excel VBA也將
工作表 與 圖表 物件包含於 活頁簿 物件集合中,工作表 物件本身也是一個物件
集合,其名稱為「Sheets」;圖表 物件集合,其名稱為「Charts」。
4-2-1 工作表的命名Excel 2016的每一個新活頁簿其預設值擁有一張工作表,工作表名稱預設
為「工作表 1」、「工作表 2」、「工作表 3」⋯等,執行 常用 >儲存格 >格式 >重
新命名工作表 指令,可以變更工作表的名稱。
1
2
在 Excel VBA中則可以使用「工作表名稱」或「工作表索引編號」的表示
方式,處理工作表的相關事情。由於「工作表索引編號」會因為工作表 新增、
搬移、刪除⋯等動作而變更,所以使用時必須特別留意!
ACI0288_Excel2016VBA.indb 10 2016/4/25 下午 04:04:03
4-11
Excel V
BA
常用的程式
4
使用「工作表名稱」指定工作表
當我們以人工方式變更 Excel的「工作表名稱」之後,可以透過 Excel VBA
直接使用這些「工作表名稱」指定其代表的工作表。
Sub 指定工作表 () Worksheets("月報 ").Activate Sheets("週報 ").Select Charts("銷售圖 ").SelectEnd Sub
另外,也可以在 VB編輯視窗中,選到所要的工作表物件,在其 屬性 窗格之
「Name」屬性欄,定義其「工作表物件名稱」(與「工作表名稱」不同);如此,
在處理工作表物件名稱時,其相關陳述式中的描述將會不同,請參考圖例。
原來的 Name屬性
變更後的Name屬性
ACI0288_Excel2016VBA.indb 11 2016/4/25 下午 04:04:03
4-12
使用索引編號指定工作表
工作表物件在 Excel VBA中,會自動賦予一個「工作表索引編號」,其順
序是在 Excel活頁簿檔案中,依照活頁簿工作表標籤所在的位置,由左至右
依序定義。「Worksheets (1)」為活頁簿中的第一頁(最左邊的)工作表,而
「Worksheets (Worksheets.Count)」為最後一頁工作表,且所有的工作表均包
括在索引計數之中,即使是隱藏的工作表也不例外。
Sub 工作表索引編號 A() Worksheets(1).Select MsgBox ActiveWorkbook.Worksheets(2).NameEnd Sub
執行結果
Sub 工作表索引編號 B() For K = 1 To 4 MsgBox ActiveWorkbook.Worksheets(K).Name & _ " 工作表序號 =" & ActiveWorkbook.Worksheets(K).Index Next KEnd Sub
ACI0288_Excel2016VBA.indb 12 2016/4/25 下午 04:04:04
4-13
Excel V
BA
常用的程式
4
上圖中,我們從活頁簿工作表標籤看到的順序為:參照應用(編號 1)、週報
(編號 2)、月報(編號 3)、4-4-4(編號 4),其編號會因工作表的搬移、複製、新
增、刪除而改變。
索引編號 1的工作表
但是在 VB編輯視窗的 專案總管 中,所看到
的順序則是:Sheet2(月報)、Sheet3(週報)、
Sheet4(參照應用)、Sheet6(4-4-4),且不會隨
便更動。因此,在使用工作表索引編號時,必須謹
慎以免發生錯誤。
說明
Sheets是指活頁簿中的所有工作表與圖表;WorkSheets則僅是指一般工作表,但不含圖表。
ACI0288_Excel2016VBA.indb 13 2016/4/25 下午 04:04:04
4-14
檢查相同名稱的工作表
在同一個活頁簿中,不能存在相同名稱的二張工作表。因此,若要透過
Excel VBA變更工作表名稱時,必須注意是否已存在相同名稱的工作表,否則程
式執行時會出現錯誤訊息。
Sub 檢查相同名稱的工作表 ()Dim 工作表 As Worksheet For Each 工作表 In Worksheets If 工作表 .Name = "月報 " Then 存在 = True Next 工作表 If 存在 = True Then MsgBox "***月報工作表存在 ***" Else MsgBox "月報工作表不存在 " End IfEnd Sub
執行結果
上述範例程式,是先使用「For Each⋯Next」陳述式檢查活頁簿中所有的
工作表名稱,然後再使用所得結果判斷指定的工作表名稱是否存在。
4-2-2 選取與啟動工作表使用滑鼠選取工作表,當工作表被選取時,即稱為「作用中」的工作表。這
個動作,在 Excel VBA中可以使用「Select」或「Activate」選取工作表,並啟
動此工作表。
Sub 選取與啟動工作表 ( ) Sheets("月報 ").Select Sheets("週報 ").ActivateEnd Sub
ACI0288_Excel2016VBA.indb 14 2016/4/25 下午 04:04:04
4-15
Excel V
BA
常用的程式
4
4-2-3 顯示與隱藏工作表執行 常用 >儲存格 >格式 >隱藏及取消隱藏 >隱藏工作表 指令,可以隱藏作
用中的工作表;當然也可以再執行 常用 >儲存格 >格式 >隱藏及取消隱藏 >取消
隱藏工作表 指令重新顯示。
執行結果作用中的工作表
隱藏作用中工作表
1
2
3
4
ACI0288_Excel2016VBA.indb 15 2016/4/25 下午 04:04:04
4-16
使用 Excel VBA也可以進行相同的工作,還可以進一步設定「隱藏」指令,
讓使用者無法經由執行 常用 >儲存格 >格式 >隱藏及取消隱藏 >取消隱藏工作
表 指令顯示被隱藏的工作表,僅能經由 VBA程式重新設定其「顯示」屬性。
Sub 顯示與隱藏工作表 () Sheets("月報 ").Visible = False ' 隱藏 Sheets("月報 ").Visible = True ' 顯示 Sheets("週報 ").Visible = xlVeryHidden ' 加重隱藏無法以手動方式恢復顯示End Sub
程式執行過程中,「週報」工作表已隱藏,而且 取消隱藏工作表 指令無法
使用。執行結果,請參考下圖。
取消隱藏的工作表
1
2
3
4
5
ACI0288_Excel2016VBA.indb 16 2016/4/25 下午 04:04:05
4-17
Excel V
BA
常用的程式
4透過 專案總管 與 屬性 窗格,也可以將選取的工作表的隱藏或取消隱藏,其
中 Visible屬性值是 -1時為 顯示、0為 隱藏、2為 加重隱藏。
說明
如果要重新顯示「週報」工作表,只要再加入下列程式即可。
Sheets("週報 ").Visible = True '重新顯示
1
2
4-2-4 工作表的其他作業既然一個活頁簿可以包含許多張工作表,當然就可以進行 新增、刪除、搬移、
複製 或 保護⋯等作業。
新增、刪除、搬移與複製工作表
複製、搬移、新增或刪除工作表,是使用 Excel經常會碰到的事情。在 Excel
VBA針對Worksheet亦有對應的 Copy、Move、Add、Delete方法,請記得在執
行這幾項工作之前,先選取所要的工作表,以避免執行錯誤。有關 Copy、Move、
Add與 Delete的陳述式如下所示:
Sub 新增刪除工作表 () Worksheets("工作表 2").Copy after:=Worksheets(1) Sheets("工作表 2").Move before:=Sheets(1) Sheets.Add Worksheets(1).DeleteEnd Sub
接下頁
ACI0288_Excel2016VBA.indb 17 2016/4/25 下午 04:04:05
4-18
工作表 2原來在活頁簿中的位置
執行結果工作表 2換到這裡複製的工作表 2
ACI0288_Excel2016VBA.indb 18 2016/4/25 下午 04:04:06
4-19
Excel V
BA
常用的程式
4
使用 鍵時,是指選取連續的數頁工作表,其 Excel VBA的陳述式列示
如下:
Sub Test( ) Worksheets(Array(1,2,3)).SelectEnd Sub
如果想要跳著選取多頁工作表,則可使用下列 Excel VBA的陳述式:
Sub Test( ) Worksheets(Array(1,3,5)).SelectEnd Sub
說明
群組工作表
可以使用 或 鍵並配合滑鼠點選的方式,選取多頁工作表。
同時選取多頁工作表
此處 Array(x,y,z)的 x,y,z引數,是對應於工作表的序號。
保護工作表
為了確保工作表中的內容不被隨意破壞,可以執行 校閱 >變更 >保護工作表
指令,讓使用者無法任意破壞工作表,在 Excel VBA中可以使用下列陳述式:
ACI0288_Excel2016VBA.indb 19 2016/4/25 下午 04:04:06
4-20
Sub 保護工作表 ( ) Sheets("月報 ").Select Range("A2:E4").Locked = True ActiveSheet.Protect Password:="abc123",DrawingObjects:=True, _ Contents:=True,Scenarios:=True, _ UserInterfaceOnly:=TrueEnd Sub
執行程式之後,若要在 A2:E4儲存格範圍中輸入資料,會出現警告訊息
如果執行 校閱 > 變更 >取消保護工作表 指令,會出現要求輸入取消保護密碼的對話方塊,輸入正確就能在原保護的範圍中輸入資料
ACI0288_Excel2016VBA.indb 20 2016/4/25 下午 04:04:06
4-21
Excel V
BA
常用的程式
44-3 儲存格的參照位址不論是在一般的作業過程或是使用 Excel VBA的過程,儲存格 參照位址 的使
用都非常重要,如果觀念不清楚會嚴重影響試算的最後結果,或得到完全不同的
顯示範圍。
4-3-1 參照位址的表示方式什麼是 參照位址?工作表 中是最基本的單位是 儲存格,為了使用方便,
Excel針對每一個儲存格皆賦予 參照位址,如此,才能在公式中辨識與計算。儲
存格的 參照位址,一般都是以 欄名列號 為其代表,舉例來說:位於 B欄、第 5
列的儲存格,其 參照位址 為 B5。事實上,參照位址有三種方式表示,分別為 絕
對參照、相對參照 與 混合參照。
絕對參照
絕對參照 的意義是指,在公式中的儲存格參照位址,不會隨著儲存格本身位
址的改變而變更。當複製儲存格時,如果不希望其公式的 參照位址 隨著儲存格位
址不同而改變,就必須在欄名、列號的前方加上「$」符號。此種用法,可以確保
工作表的計算值不會產生 參照錯誤 的情況。一般計算利息或幣值轉換常用到的固
定利率或匯率,即可使用此類型的參照。
說明
工作表的保護作業,必須要伴隨儲存格的保護設定一併處理。
公式完全沒有改變
D4儲存格複製到 F6儲存格
ACI0288_Excel2016VBA.indb 21 2016/4/25 下午 04:04:07
4-22
相對參照
相對參照 的意義是指,在公式中的儲存格參照位址,會隨著公式所在儲存
格位址的變更而改變,其表示法為 A1。這裡所謂的 相對,是指相對其公式的所
在位址。舉例來說,D4儲存格的公式為「=E22+B27」,此公式內容所有參照位
址皆為 相對參照。它所代表的意義,改以口語敘述如下:
在 D4儲存格所顯示的數值是:於右邊一欄上方 2列(E22)的數值,加上
左邊二欄下方 3列(B27)的數值。
由上述口語話的說明,可以使用另一 R1C1寫法表示,其中(R代表「列」,
C代表「欄」)。
R4C4=R[-2]C[1]+R[3]C[-2]
在 相對參照 說明上是相當清楚的,但請記得左、右、上、下之間的關係
(向左、向上,以 負號 (-)表示;向右、向下,以 正號 (+)表示)。參考下圖,將
D19(數值為 25)儲存格複製到 F21儲存格,結果其數值變為 370,這表示用
以計算的公式已隨儲存格的位址改變而變更。
D19儲存格公式為「=E17+B22」 複製到 F21儲存格公式為「=G24+D29」
混合參照
混合參照 的意義是指,在公式中的儲存格參照位址,視定義隨著公式所在
的儲存格位置而變化,有時我們只需要固定某一欄參照,而改變列參照;或固定
某一列參照,僅改變欄參照,這種情形即稱之為 混合參照,例如:$A1、A$1。
混合參照 的應用是綜合 相對參照 與 絕對參照 的結果,所以當公式中具有
混合參照時,使用者本身必須相當清楚這些儲存格資料,是否已滿足需求,否則
非常容易發生錯誤!
ACI0288_Excel2016VBA.indb 22 2016/4/25 下午 04:04:07
4-23
Excel V
BA
常用的程式
4
4-3-2 R1C1與 A1表示法的意義參照方式的表示方法,有 A1與 R1C1表示方法二種,使用不同的表示方法,
其 VBA的寫法也完全不同。這個特性,請讀者特別留意,在此僅以範例再敘述一
次相關的概念。
D34儲存格公式為「=E$32+B$37」複製到 F36儲存格,公式變為「=G$32+D$37」
絕對與相對參照的應用
上圖範例中,C4:E8儲存格範圍是用來計算「各單價 *數量」的值。因此,
在單價上使用絕對參照到第 3列,各類水果使用相對參照到各欄位名稱,例如:
C$3;數量則使用絕對參照到 B欄位,各月份則使用相對參照到各列號,例如:
$B4。如此一來,整個計算範圍可運用單一公式再輔以滑鼠拖曳填滿的方式,完成
完成全部的計算工作。
如將其設定為 R1C1的表示法,會發現在 C4:E8的儲存格範圍中,所有公式
皆為「=R3C*RC2」,這是不同的表示方法必然的結果。R3C表示儲存格在第 3列
上的各個欄位;RC2表示儲存格在 B欄上的各個列號。
ACI0288_Excel2016VBA.indb 23 2016/4/25 下午 04:04:07
4-24
看完上述範例的說明,在 Excel VBA 同樣有 R1C1 與 A1 表示方法,
Formula屬性是指 A1表示方法、FormulaR1C1屬性則是指 R1C1表示方法。
所謂 A1是代表從指標儲存格算起 1欄 1列的位址,而 R1C1則是以欄數與列數
的數目來表示儲存格的位址。換句話說,不同的 Formula屬性,其屬性傳回值
就會不同。下列範例是從同一個儲存格公式得到不同的回應顯示。
「欄名」已經顯示為數字,不再是英文字母
ACI0288_Excel2016VBA.indb 24 2016/4/25 下午 04:04:08
4-25
Excel V
BA
常用的程式
4
範例 儲存格 R1C1、A1表示方法
Sub 儲存格 R1C1_A1參照 1() Sheets("工作表 2").Select Range("C3").Formula = "= A2 * B3" Range("C3").Select MsgBox ActiveCell.Formula & " 其值為 " & ActiveCell.Value MsgBox ActiveCell.FormulaR1C1 & " 其值為 " & ActiveCell.Value Sheets("工作表 2").Select Range("A1:D10").Select Range("C3").Select Range("C3").Range("D3").SelectEnd Sub
執行結果
在「Range("A1:D10").Select」與「Range("C3").Select」的陳述式中,可以
直接判斷其儲存格範圍是 A1:D10與 C3,因為此時 Range屬性的對象是現行工作
表物件的左上角原始指標位址(A1)。
在「Range("C3").Range("D3").Select」的陳述式中,實際的儲存格位址是
F4,其原因是「Range("D2")」屬性的對象是以現行工作表物件的 C3儲存格為指
標儲存格,再以 C為基準算出 4欄;以第三列為基準算出 2列的位址。因此,如
果將陳述式寫成下列方式,則是多此一舉。
Range("F4").Range("A1").SelectActiveCell.Range("A1").Select
ACI0288_Excel2016VBA.indb 25 2016/4/25 下午 04:04:08
4-43
Excel V
BA
常用的程式
4
Excel VBA中對應的用法,請參考下列範例。此範例是要尋找所有內含公式
的儲存格。
Sub 特殊選取 () Sheets("參照應用 ").Select Range("C3").Select Selection.SpecialCells(xlCellTypeFormulas).SelectEnd Sub
4-5-5 特殊選取Excel工作表中,若按 鍵,會出現 到 對話方塊,再按【特殊】鈕,則會
出現 特殊目標 對話方塊,如此即可選取特殊要求的儲存格。
執行結果
ACI0288_Excel2016VBA.indb 43 2016/4/25 下午 04:04:13
4-44
4-5-6 選取欄與列選取整欄或整列儲存格範圍,也是經常會碰到的工作。在 Excel VBA可以
使用 Columns與 Rows屬性處理。
Sub 選取欄與列 () Columns("B:B").Select Columns("D:F").Select Rows("8:8").Select Rows("3:5").Select Range("a1").Value = Rows.CountEnd Sub
說明
SpecialCells括弧內可以是下表所列的 XlCellType常數之一:
xlCellTypeAllFormatConditions 任何格式的儲存格
xlCellTypeAllValidation 具有驗證準則的儲存格
xlCellTypeBlanks 空儲存格
xlCellTypeComments 包含註解的儲存格
xlCellTypeConstants 包含常數的儲存格
xlCellTypeFormulas 包含公式的儲存格
xlCellTypeLastCell 已用範圍的最後一個儲存格
xlCellTypeSameFormatConditions 有相同格式的儲存格
xlCellTypeSameValidation 有相同驗證準則的儲存格
xlCellTypeVisible 所有可見儲存格
如果不是很熟悉 SpecialCells的用法,可以試著使用「錄寫巨集」的方式處理,如此就會得到相關的 VBA程式。
執行結果
選取範圍的儲存格總數
ACI0288_Excel2016VBA.indb 44 2016/4/25 下午 04:04:14
4-45
Excel V
BA
常用的程式
4
4-5-7 Union、Intersect與 AreasExcel VBA對於不連續的儲存格範圍,有許多屬性或方法無法執行。此時,
可以使用 Union方法;若要在多重範圍中尋找相互重疊的儲存格,則可以使用
Intersect方法。
Sub 聯集與交集 () Dim 聯集 As Range, 交集 As Range, 我不連續 As Range Set 聯集 = Union(Range("B2:C6"), Range("E2:F3")) 聯集 .Interior.Color = vbGreen Set 交集 = Intersect(Range("B2:C6"), Range("C3:D6")) 交集 .Interior.Color = vbBlueEnd Sub
如果要選取不連續的欄或列儲存格範圍,可以配合 Union 方法。下表是
Columns與 Rows屬性常用到的參照方式。
參照 含義
Columns("A") 工作表的第 1欄
Columns(3) 工作表的第 3欄
Columns 工作表上的所有欄位
Rows(2) 工作表的第 2列
Rows 工作表上的所有列數
執行結果
說明
若要針對多重範圍,分別執行設定或編輯工作,可先使用 Areas屬性傳回集合物件,再使用「For⋯Each⋯Next」陳述式處理,這部份的操作請參考 3-3-3節。
ACI0288_Excel2016VBA.indb 45 2016/4/25 下午 04:04:14
4-49
Excel V
BA
常用的程式
4
4-7-1 活頁簿物件之事件程序撰寫活頁簿物件之事件程序,請依循下列步驟處理。此範例是當指定的活頁
簿為作用中時,出現「歡迎使用」的訊息對話方塊。
STEP1 快按二下 ThisWorkbook物件,在 物件 清單中,選擇Workbook。
4-7 事件程序的重要應用使用 VBA的特點之一,即是希望其自動執行經常性的工作,但有些時候,又
得手動進行額外的操作,才會繼續執行指定的巨集。此時,靈活應用事件狀況,以
決定巨集執行的時機是個不錯的方法。
Excel VBA中,開啟活頁簿、選取工作表⋯等都是事件;而程式設計者可以
選定某特定物件(例如:工作表),在此物件專屬的 程式碼 窗格中,撰寫所要執
行的 事件程序。
說明
要撰寫 事件程序,請先進入 VB編輯視窗,在 專案總管 視窗中選擇所要設計的物件,在其名稱上快按二下,即可進入些物件專屬的 程式碼 窗格。
1
2
ACI0288_Excel2016VBA.indb 49 2016/4/25 下午 04:04:15
4-50
STEP3 撰寫自己的程式碼,請參考下圖所示的範例。
STEP2 在 程序 清單中,選擇所要撰寫的事件狀態,例如:Activate。
STEP4 當使用者在 Excel編輯環境,只要切換到此活頁簿,即會顯示「歡迎使
用」訊息方塊。
ACI0288_Excel2016VBA.indb 50 2016/4/25 下午 04:04:15
4-51
Excel V
BA
常用的程式
4
4-7-2 工作表物件之事件程序撰寫工作表物件之事件程序,請依循下列步驟處理。此範例是選到此工作表
時,出現一個「您選到我了」的訊息對話方塊。
STEP1 快按二下工作表物件(例如:Sheet4(參照應用 )),在 物件 清單中,選擇
Worksheet。
1
2
STEP2 在 程序 清單中,選擇所要的事件狀態,例如:BeforeRightClick。
STEP3 撰寫自己的程式碼,請參考下圖所示的範例。
ACI0288_Excel2016VBA.indb 51 2016/4/25 下午 04:04:16