21
1-1 關於 VBA 歡迎各位讀者進入 VBA 的世界,在此可藉由 VBA,將 Access 功能發揮於極致,讓不可能的任務成真。 1-1-1 為何要學習 VBA VBA Access 中可算是「終極功能創造者」,可以說是無所不能, 任何所需功能,皆可使用 VBA ,就理論而言,以下是數項使用 VBA 的原因。 l 巨集功能之不足 巨集是 Access 資料庫自動化設計的第一步,但巨集可完成的功能 仍有限制,因為巨集僅是在 Access 提供之多項指令中,進行選擇。 通常可使用滑鼠完成的設計,不論使用之工具為何,可完成的設計, 必定有限,因為無法隨心所欲,製作所需功能,因為這是「在模式內 做事」。 l 彈性化設計 這是使用 VBA 的最大目的,因為應用系統的各項功能,不可能 「寫死」。舉個很簡單的例子,就是在 Word 中輸入文字時,文字格 式會立即反應在「格式」工具列中,包括使用之字體、大小、粗斜體 等,讀者可為每一文字設定分別使用不同格式,同時目前格式均會顯 示在「格式」工具列中,為什麼?因為讀者可想像 Word 背後有一個 判斷格式內容的引擎,當插入點移至每一文字之後,就可取得其前一 文字的各種格式,並反應在「格式」工具列,這就是彈性運用。 Access 資料庫中,若在查詢內使用如「 Forms![ 表單 1]![ 文字 1] 」之準則,表示該查詢執行時,須由「表單 1 」取得資料做為參數, 這是很方便的設計,但衍伸而來的問題是此查詢就只可搭配「表單 1 」,因為參數必須來自「表單 1 」,若有其他位置須使用同一查詢, 就須另行設計。 查詢中使用來自表單的資料做為參數之設計,與使用者操作無 關,只是設計人員在開發時,為求精簡資料庫而應有的考慮。另一設 計是不使用參數,轉而使用 VBA,傳遞參數,尤其在查詢式表單及 報表的搭配時,以 VBA 傳遞參數是常用的設計方式,請見「 Access 2000 專案開發」之說明。 l 統一的 Basic

1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

Embed Size (px)

Citation preview

Page 1: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

1-1 關於 VBA

歡迎各位讀者進入 VBA 的世界,在此可藉由 VBA,將 Access 之功能發揮於極致,讓不可能的任務成真。

1-1-1 為何要學習 VBA

VBA 在 Access 中可算是「終極功能創造者」,可以說是無所不能,

任何所需功能,皆可使用 VBA,就理論而言,以下是數項使用 VBA的原因。

l 巨 集 功 能 之 不 足

巨集是 Access 資料庫自動化設計的第一步,但巨集可完成的功能

仍有限制,因為巨集僅是在 Access 提供之多項指令中,進行選擇。通常可使用滑鼠完成的設計,不論使用之工具為何,可完成的設計,

必定有限,因為無法隨心所欲,製作所需功能,因為這是「在模式內

做事」。

l 彈 性 化 設 計

這是使用 VBA 的最大目的,因為應用系統的各項功能,不可能

「寫死」。舉個很簡單的例子,就是在 Word 中輸入文字時,文字格式會立即反應在「格式」工具列中,包括使用之字體、大小、粗斜體

等,讀者可為每一文字設定分別使用不同格式,同時目前格式均會顯

示在「格式」工具列中,為什麼?因為讀者可想像 Word 背後有一個判斷格式內容的引擎,當插入點移至每一文字之後,就可取得其前一

文字的各種格式,並反應在「格式」工具列,這就是彈性運用。

在 Access 資料庫中,若在查詢內使用如「Forms![表單 1]![文字

1]」之準則,表示該查詢執行時,須由「表單 1」取得資料做為參數,這是很方便的設計,但衍伸而來的問題是此查詢就只可搭配「表單

1」,因為參數必須來自「表單 1」,若有其他位置須使用同一查詢,就須另行設計。

查詢中使用來自表單的資料做為參數之設計,與使用者操作無

關,只是設計人員在開發時,為求精簡資料庫而應有的考慮。另一設

計是不使用參數,轉而使用 VBA,傳遞參數,尤其在查詢式表單及

報表的搭配時,以 VBA 傳遞參數是常用的設計方式,請見「 Access

2000 專案開發」之說明。

l 統一的 Basic

Page 2: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

Basic 在 Office 家族中是統一的語言,在 Access 中,模組就是使

用 VBA,也就是 Basic。但在 Word、 Excel、 PowerPoint 等軟體中,

VBA 指的是巨集,而巨集在 Access 則另有其意義,這是 Access 與其

他 Office 系列軟體之差別。

不論如何, VBA 仍是統一的,即讀者只要在任一軟體中學會使用

VBA,就可在 Office 之 VBA 環境中,遊刃有餘,因為基本觀念及設計方式均相同。

<<說明>>

有太多非使用 VBA 不可的理由,最重要的是若資料庫僅供個人

使用,建議讀者使用精靈即可。但做為真正的應用系統,精靈是不夠

的,反過來說,精靈的製作結果通常離實用階段尚有一段距離,這段

就須使用巨集或 VBA,加以彌補及強化。

1-1-2 什麼是寫程式

寫程式一向被認為就是電腦高手,只有科班出身的人,方有學寫

程式的機會。事實並非如此,因為 Basic 程式碼很簡單,不是艱深而看不懂的程式語言。

程式的目是命令電腦,依據各行程式的敘述,逐一執行的文字,

重點就在如何命令電腦。由於必須是電腦看得懂的文字 (方可命令

它 ),所以「程式就等於是電腦語言」,另一說法是設計人員配合電腦,所有遊戲規則都是電腦所定義,無法以人的思維模式予以套用,或設

想程式「應該如何如何」。基於此,程式的每個字眼,至何處應如何

動作,使用那個敘述,皆有一定,但亦不須死記。

筆者在程式設計方面是半路出家,第一個學的語言是 ACCESS 2.0

中的 ACCESS Basic,自 Access 7.0 版起,則已改為 VBA。剛開始不

知何謂程式,只知程式是由上而下逐行執行,還好的是 Access 是可見的軟體中,精靈最多的一個。精靈代勞之後,就會產生程式碼,類

似 Excel 等軟體的錄製巨集功能,亦會自動產生程式碼。

Basic 的好處是很多字眼皆與現實生活或使用者在電腦上操作看

到的內容相似,如在 Excel VBA 中有 Worksheet,就是指工作表,

Workbook 是活頁簿;Word VBA中的 Document 指的是文件,Paragraph

指的是段落等。再如 I f 可直譯為如果, Then 可直譯為然後。多數名詞一望即知其義,可猜個大概。

當然不是每個字都可用猜的,沒關係,以滑鼠選取看不懂的字,

再按下 F1,該字的輔助說明就會顯示在螢幕上,雖然有些輔助說明

Page 3: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

實在直譯得不怎麼樣,有些甚至是英文的。同時不能怕英文,因為電

腦只會說及看外國話。多數入門者,在看到一堆程式後,就會視如天

書,跟我不同國而放棄,萬萬須強迫看完數行,懂了之後,會有像跨

越一座山的快感。且若是自己摸索,必定印象深刻,上課學的通常會

還給老師。此話不是鼓勵所有人皆自學程式,而是在上課之外,亦須

坐在電腦前面征服它,嚐試寫數行程式及執行它。

若要看到執行結果,最方便的方法是使用 MsgBox,這是所有 Basic通用的函數,如:

Sub Test()

MsgBox "我學會程式了 "

End Sub

將上述三行,加在 Excel 或 Access 的 Visual Basic 編輯器內,再

將游標置於其內及按下 F5 鍵,就會顯示一個對話方塊。重點是讀者在初學程式時,會想知道程式到底有無執行,因為一般程式由頭執行

至尾,不會顯示在螢幕上,MsgBox 可將其後內容顯示為對話方塊,表示它已執行,這是最立即的表現方式。

1-1-3 寫程式之前

如上所述,寫程式是「以電腦看得懂的語法,命令它」,所以寫

程式前必須有準備動作,包括了解語法及思考方式等,請見如下說明。

l 了 解 基 本 語 法

基本語法是所有 Basic 相同的部份,所以只要了解一套即可通用

於所有環境的 Basic。基本語法包括常見的 I f … Then、Do … Loop 及其

他多種不同關鍵字的組合,還好的是 Basic 基本語法大多為英文單字,由字面可大概了解其義,有關基本語法的說明,請見本書附錄。

l 關 於 物 件

這是使用 VB 或 VBA 的重點,如讀者可在 Word、 Excel、

PowerPoint、Access 等軟體中使用 VBA,相同的是基本語法,差異處

就是物件,如在 Excel VBA 中,可處理的物件就是 XLS 檔案的各式

內容,如 Workbook(活頁簿 )、Worksheet(工作表 )、Range(儲存格 )等;

在 Word VBA 則有 Document(文件 )、 Paragraph(段落 )等;在 Access

VBA 則有 Forms (表單 )、Reports(報表 )等。所以物件是在不同環境內可使用的資源,有關物件的詳細說明請見下節。

l 執 行 位 置

Page 4: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

寫程式之前尚須了解應寫在何處?在 Access 中,程式主要是寫在表單、報表、控制項之各個事件內,所以思考方式是「在什麼時機下,

執行我的程式」,此一時機就是事件,因為每一事件皆有其固定的啟

動時機,所以讀者亦須了解常用事件之啟動時機,方可在正確位置執

行所需動作。

<<說明>>

以上是第一次寫程式前的準備動作,總之一切遊戲規則均是

Access 所定義,設計人員須了解在 Access 內有那些資源。

1-1-4 開始寫程式

一切均確定及了解後,即可開始寫程式。這是對初學者而言,可

說是極難入手的動作。綜合以上所述,試舉一例,就是「假設表單中

有單價、數量、小計等三個文字方塊,如何設計輸入單價及數量後,

立即顯示小計」。以下是分析此功能及寫程式的步驟:

l 確 定 執 行 位 置

在本例中,使用者可在「單價」及「數量」內輸入數字,而計算

依據即為輸入之數字,所以讀者須知道那一個事件會更改事件後立即

執行,就是兩個文字方塊的 AfterUpdate,這個事件會發生在更改資料及插入點離開時,所以這個事件通常用來「檢查及取得資料」之用。

但若是表單的 AfterUpdate 事件,就會發生在儲存記錄之後。

衍伸而來的差別是文字方塊的 AfterUpdate 發生時,並未儲存檔

案,僅是更改資料,表單的 AfterUpdate 事件則只會發生在已儲存記錄之後

l 撰 寫 程 式

接下來是撰寫程式,但首先須找到正確位置,讀者可開啟「單價」

文字方塊的屬性表,切換至「AfterUpdate」,按下 按鈕,再於清單

中選取「 [事件程序 ]」,如圖 1-1:

Page 5: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

圖 1-1 在 AfterUpdate 事件使用 VBA

如圖 1-1 所示,所有事件屬性的清單會顯示現用資料庫的所有巨

集及一個「事件程序」,若為後者,表示將在事件中使用 VBA。指定

「事件程序」後,再按下 按鈕,即可開啟 Visual Basic 編輯器,同

時插入點會停留在「單價 _AfterUpdate」程序中,如圖 1-2:

圖 1-2 在事件程序撰寫程式

圖 1-2 之狀態是插入點在「單價_AfterUpdate」程序內,這就是「單

價」文字方塊的「 AfterUpdate」事件程序,並可立即輸入程式。

在本例中,目的是執行相乘,乘法符號在程式內是「*」號,而

在程式內取得文字方塊資料的語法是「 Me![單價 ]」,其中「Me」是執

行此段程式的表單或報表,「單價」則是控制項名稱,所以「Me![控

制項名稱 ]」就是在程式內取得目前表單內,某控制項所含資料的標準語法。本例程式可以是如下內容:

Sub 單價_AfterUpdate()

Me![合計 ]=Me![單價 ] * Me![數量 ]

End Sub

l 避 免 錯 誤 的 設 計

但如上程式的設計還不夠,因為使用者可能在「單價」及「數量」

輸入空白或非數字,空白在程式內之語法是 Null,這是較特殊的資

料,它像病毒一樣,若運算式中有任一者為 Null,則結果也會是 Null,因為它會傳染。故應有設計如下:

Sub 單價_AfterUpdate()

If IsNumeric(Me![單價 ])=True And IsNumeric(Me![數量 ]) Then

Page 6: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

Me![合計 ]=Me![單價 ] * Me![數量 ]

End If

End Sub

在以上程式中,使用「 IsNumeric」函數判斷「單價」及「數量」

欄位之值是否為數字,若是方執行計算。由於 Null 不是數字,故是

否為 Null 之判斷不須另行設計,若要判斷是否為 Null,可使用 IsNull函數。

使用程式的目的是自動化處理,但大多數的自動化設計,均會因

自動化而有其他考慮。以本例而言,使用者可在「單價」及「數字」

等欄位輸入資料,並以此做為程式計算依據,所以計算前須先確定輸

入資料是否正確。只要是使用者可手動輸入之資料,均有可能錯誤,

為確保執行無誤,必須先行檢查。

l 其 他 設 計

在以上說明的例子,僅是簡單的乘法運算,目的是計算「合計」,

所以在表單上的「合計」文字方塊,即應不允許使用者輸入資料,因

其值是由程式計算而來,故須將「鎖定」屬性設為「是」。

<<說明>>

以上是基於一個使用目的,撰寫程式的步驟及應有考慮。對初學

者而言,較難是找到寫程式的正確位置及防止錯誤的設計,二者均須

靠經驗。所以寫程式的目的是達到自動化處理,但除此之外,尚有許

多相關 KNOW-HOW,一般而言,以上就是撰寫程式的流程,只不過在不同目的之下,會有不同的考慮及設計。

Page 7: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

1-2 VB 家族

VBA 的全名是「Visual Basic for Applications」,基本語法就是

Basic 的形式,在微軟的各式軟體中,可說學會 Basic 後,就可一招

半式闖江湖,因為同樣的語法可使用在多個位置及環境,而 Basic 也是所有程式語言中,最簡單且最易自學者。

1-2-1 Visaual Basic

這是 Basic 的最早期成員,目的是開發可在任何電腦執行的應用

程式,目前 (1999 年底 )最新版本為 6.0,其特色是可編譯為 EXE 檔,

這也是 Visual Basic 與其他 Basic 的最大差別。

Visual Basic 的可處理範圍相當廣泛,包括資料庫、製作 OCX 檔

案等,有關資料庫的部份可參考「VB 6.0 與資料庫開發聖經」一書,

如圖 1-3 是 Visual Basic 的設計視窗

圖 1-3 Visual Basic 之專案

在圖 1-3 中,目前正顯示此專案的表單,「表單」可以是對話方塊或最大化的視窗,左方是工具箱、右方則是專案總管及屬性表。

圖 1-3 顯示的是設計模式時之表單,若要撰寫程式,可在所需位置按兩下左鍵,如要為「確定」按鈕定義功能,可在此按鈕上按兩下

Page 8: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

左鍵,即會進入此按鈕的 Click 事件。

1-2-2 VBA

這是可使用在 Office 各軟體的 Basic 版本,也是本書討論主題。

由於 VBA 是附屬於各軟體,所以 VBA 的任務是強化應用系統,此處

的應用系統不是可單獨執行的 EXE 檔,而是 Office 各軟體的檔案,

如在 Word 中,VBA 程式碼是附屬於 DOC 檔案、在 Excel為 XLS 檔

案、在 Access 為 MDB 檔案等。所以 VBA 程式碼必定在各個檔案內,

而編輯 VBA 程式碼的工具是 Visual Basic 編輯器,如圖 1-4:

圖 1-4 Visual Basic 編輯器

筆者是在 Access 中使用「工具」→「巨集」→「Visual Basic 編

輯器」選項,開啟圖 1-4。

圖 1-4 共有三個部份,分別是專案總管、屬性表及程式碼,專案

總管會顯示現用資料庫中,所有已使用 VBA 的表單、報表,再加上模組等,在專案總管之任一物件上按兩下左鍵,即可開啟其程式碼視

窗。

1-2-3 VBScript

這是使用在網頁中的 Basic,如 Access 2000 的資料頁,就可使用

VBScript。此類程式的特性是會隨網頁下載至提出要求的瀏覽器中,

Page 9: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

所以 VBScript 會在前端執行,這也是資料頁結合資料庫的原理,一切均以前端為處理中心。

所以在瀏覽器中,就可查看 VBScript 程式碼,如圖 1-5:

圖 1-5 使用 VBScrpit 程式碼

圖 1-5 是 FrontPage 2000 的 HTML編輯視窗,在程式碼中,由

「<script」及「</script>」標記間的文字即為 VBScript 程式碼。圖

1-5 共有兩個程序,分別是 AfterUpdate 及 check,此二者分別在不同

時機予以啟動,如圖 1-6:

Page 10: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

圖 1-6 執行 VBScript 程式

圖 1-6 之選取部份,目的即為執行 AfterUpdate 程序。此處是一個文字方塊,表示使用者在文字方塊內輸入完資料及游標離開後,立即

執行 AfterUpdate 程序。

<<說明>>

VBScript 是專用於前端網頁的 Basic 程式,正確說法是 DHTML(D

是動態之意 ),可在網頁製作立即互動之效果。

1-2-4 ASP

ASP 與 VBScript 剛好相反,ASP 是在伺服器執行的程式,所以在

瀏覽器提出請求時,ASP 會在伺服器內處理請求,再將結果傳送至瀏

覽器,在瀏覽器也看不到 ASP 程式碼,如圖 1-7:

Page 11: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

圖 1-7 使用 ASP

圖 1-7 也是 FrontPage 2000 的 HTML 編輯視窗,由「 <%」至「%>」

標記間的內容即為 ASP 程式碼。

ASP 的主要目的是在網頁中處理資料庫,而資料庫則是置於伺服

器內,如 Access 應用推廣中心 (http://access.winwalk.com.tw)網站即

使用相當多的 ASP 應用。

<<結論>>

以上就是 VB 家族各成員的簡介,由於 Basic 語法並不難,所以

在各個環境中,多已成為標準程式語言。

Page 12: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

1-3 物件的觀念

在目前的設計環境中,物件的觀念相當重要,澈底了解何謂物件

後,可節省摸索時間。

1-3-1 何謂物件

稍早曾說明,各種不同環境的 Basic 基本語法皆相同,差異處就

是可用物件不同,物件可視為不同 Basic 環境中,提供的資源,設計人員可使用這些物件,建立或組合應用系統。所以筆者曾以積木做為

比喻,就是每一開發環境提供的資源,就像一個個形狀不同的積木,

設計人員再以這些積木,進行組合,如同蓋房子般。

以 Access VBA 為例,目的是控制 mdb 檔案的各式內容,所以在

Access VBA 中,可使用的物件就是資料表、查詢、表單、報表等,但這只是較大的分類,細分之下,如欄位、表單或報表中的控制項等,

也是物件。

可見的物件

可見及不可見物件是非正式的分法,之所以如此分類的原因是對

多數初學者而言,「物件」是最難懂的概念,筆者認為以可見及不可

見為分類,是了解物件的第一步。

若在 Access 資料庫內,可見物件主要就是表單、報表及控制項

等;若在 Excel 中,活頁簿的每一張工作表、工作表中的每一儲存格

等亦皆是物件;在 Word 中,每份文件、文件中的每個段落等,亦皆是物件。

這些「可見」物件的特性是皆會顯示在螢幕上,所以一般使用者

在螢幕的操作,在系統背後,皆是以物件的原理在動作。

若在 Access 中,表單、報表、控制項等的另兩個特性是可被選取

及顯示屬性表,如圖 1-8:

Page 13: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

圖 1-7 使用屬性表

圖 1-7 的狀態是在表單設計視窗選取文字方塊,同時顯示此文字方塊的屬性表,只要是物件,就會有屬性表,所以表單及報表本身、

區段、控制項等皆有屬性表,有關屬性表的意義稍後會詳細說明。

若是在 Word 中,也有屬性表,操作方式是先使用「檢視」→「工

具列」→「控制工具箱」選項,再按下 及 按鈕,如圖 1-8:

Page 14: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

圖 1-8 在 Word 中開啟屬性表

如圖 1-8 所示即為 Word 文件之屬性表,只不過此屬性表內容全

為英文,不像 Access 已完全中文化,這是因為 Access 較常做為開發

工具,而 Word 僅是做為一般應用,較少使用 Word 開發應用系統。

在 Access 之表單或報表設計視窗中,只要是可被選取者,皆是物件,這些是可使用滑鼠,改變其工作狀態的可見物件。

不可見的物件

這些物件大多僅存在於程式內,筆者歸類為「不可見」的原因是

此類物件無法使用滑鼠進行操作,也不會顯示在螢幕上,而是在記憶

體內,程式的大部份處理皆是在記憶體內進行,少數動作可立即更新

至螢幕。

在程式中,物件的內容可有相當多種,分述如後:

l 內 建 物 件:此類物件指的是工具提供的各式物件,如在 Access VBA

內,此類物件通稱為「Microsoft Access」物件,其內容代表目前

已啟動的 Access 環境中,所含有的各式內容,如 Application物件

代表 Access、Forms 代表所有已開啟的表單、Reports 代表所有已

開啟的報表等。如在 Excel VBA 內,就會有代表活頁簿的

Workbook、代表工作表的 Worksheet 等。

l 物 件 變 數:這是變數的多種變化之一,被宣告為物件變數後,就

Page 15: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

可在程式內取得物件內容,如圖 1-9:

圖 1-9 宣告及使用物件變數

在圖 1-9 中,首先使用「Dim」語法,宣告變數 gk 為物件變數,

且型態為 Recordset,第二行即以 Set 語法,取得變數 gk 的內容。

Recordset 之意是記錄集,所以圖 1-9 的第二行,就等於以滑鼠在查詢或資料表上按兩下左鍵後,開啟及顯示在螢幕上的多筆記錄。只

不過在程式中取得的記錄集,僅存在於記憶體內,不會顯示在螢幕上。

物件變數有型態之分,如圖 1-9 之變數 gk 是 Recordset 型態,同時宣告之後,物件內容不可以是其他型態。

l 參 照 程 式 庫:讀者可在 Visual Basic 編輯器內使用「工具」→「設

定引用項目」選項,在此可指定參照之程式庫,如圖 1-10:

Page 16: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

圖 1-10 引用程式庫

如圖 1-10 所示,表示現用資料庫引用了多個程式庫,其中前四個

為建立新資料庫後,自動引用的程式庫,只 Outlook 9.0(也就是

Outlook 2000)是筆者指定,引用之後,即可在程式內宣告及取得

Outlook 提供的物件,如圖 1-11:

圖 1-11 宣告及取得引用之物件

在圖 1- 11中,使用 Public 語法,宣告兩個變數,型態分別為 Outlook

的 Application、Outlook 的 NameSpace,其中 Application及 NameSpace

皆為 Outloo k 程式庫提供的物件,只有在引用之後方可使用。

<<說明>>

本小節說明的是只可在程式中處理的物件,也算是物件的來源,

其實物件都是由程式庫所提供,也就是圖 1-10 中,含有「 ü」符號者,

只不過在 Access 環境中,有部份程式庫是預設引用,所以不須再使

用圖 1-10。

重點是設計人員必須了解在程式中,可引用那些物件,方可設計

最適用的應用系統,因為現在的設計環境,就是使用物件,「堆積」

及「組合」應用系統。有關不同物件的來源,本書稍後將有詳細說明。

1-3-2 物件的數項重點

「物件」是可在程式及表單、報表設計視窗使用的資源,每一物

件皆可視為獨立的個體,以下說明有關物件的數項重點,這些重點不

止適用於 Access VBA,其他 Basic 環境亦均適用。

Page 17: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

上下隸屬關係

如上所述,物件皆是獨立的個體,每一程式庫針對每一物件的定

義,皆是上下隸屬關係,以 Access VBA 為例,最上層物件是

Application,其次是 Forms、Reports …等,如圖 1-12:

圖 1-12 Access 物件關係圖

圖 1-12 是由 Access 之輔助說明中,簡化而來,Application之下

又有二十種物件,有些物件尚有下一層,每一物件均代表目前 Access

環境的內容,如 Screen是螢幕、 Docmd 是巨集指令、CommandBars

是工具列及功能表等。由於這些物件均是在 Access 啟動之後,方會

顯示或處於可使用狀態,所以均歸類在 Application 物件之下。以表單為例,在表單設計視窗中,每一控制項亦均是物件,但由於控制項

是置於表單內,所以表單在此時,也是其下控制項的「容器」。

讀者可以「容器」的概念,設想物件的上下隸屬關係,即除了最

上層外,其下物件均是「置於容器」內,而「容器」則是上層物件。

筆者常以書櫃及書等兩個物件為例,書可置於書櫃內,所以此時的書

櫃對書而言,是為「容器」,因為書是放在書櫃內,所以取書時,必

由書櫃中取出。以下針對物件的重點說明,均將以書及書櫃為例。

群體的觀念

群體其實就是「容器」,「群體」一詞有多數之意,表示有多個物

Page 18: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

件,如 Forms 表示所有已開啟的表單,每一表單均置於 Forms 群體中,

由於是複數,故字尾加上 s,如圖 1-12 有多個字尾加 s 者,即皆為群體。

再以書及書櫃為例,對「書」這個物件而言,群體就是 Books,

每一本書皆是 Book 物件,取書時,是由 Books 中取出。回至 Forms之例子,取得及參照個別表單的語法是:

Forms(“表單 1”).Visible=True

Forms(0).Visible=True

以上兩種語法是所有物件導向程式設計中,取用物件的共通語

法,二者差別是分別使用名稱及索引值 (括號內 ),做為參照依據,索

引值是以物件建立或開啟的順序,由系統予以自動編號,由 0 開始至無限大之值,但通常會使用名稱。

<<說明>>

所以群體是多個物件的集合,容器內可含有一或多個物件,但有

些物件無法量化,永遠只有一個,如 Application 或圖 1-12 中,字尾

沒有 s 者。

物件名稱

圖 1-12 是物件的分類,但在執行時,可能會有多個物件,如 Forms代表所有已開啟的表單,所以可能會有多個表單同時執行,此時每一

表單均為一個 Form 物件,為便於識別,每一物件均有名稱,如表單即為表單名稱,且同類型物件的名稱不可相同,否則將造成混淆。

名稱也是設計應用系統時,不論在設計視窗或程式內,引用物件

的必要條件,如在表單設計視窗內,可使用多個控制項,每一控制項

亦均為物件,所以一個表單擁有的多個控制項,其名稱不可相同,如

圖 1-13:

Page 19: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

圖 1-13 查看控制項名稱

圖 1-13 的狀態是在表單設計視窗中,開啟「物件」清單,此清單會顯示目前表單的所有控制項名稱,選取任一者後,即會自動選取該

物件。如此圖的「物件」清單現顯示為「指令 10」,此按鈕即在被選取狀態,也就是「關閉」按鈕。

圖 1-13 是在表單設計視窗的例子,若在程式中,每一物件亦有其名稱,總之大原則是同一容器內的多個同類型物件,不可同名,就像

每人都有不同的身份證編號,設計人員亦須了解如何由名稱取得物

件,方可在程式內遊刃有餘。

屬性及方法

這是物件各項重點中的重點,也是初學者最不易了解之處。概括

而言,屬性是「靜態規格」,方法是「動態操作」。屬性就是屬性表中

的各個項目,但若是在程式中,由於是不可見物件,所以沒有屬性表。

嚴格而言,屬性表是為方便在表單及報表的設計作業,而提供的工

具,方法則不會顯示在屬性表中,只可使用在程式中。

再以「書」物件為例,其書名、頁數、作者、出版社等,皆可視

為屬性,因為這些均是「書」物件的規格,是成為一本「書」的基本

Page 20: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

要件。所以讀者可在表單中為各個控制項及表單本身,更改屬性,目

的是「定義工作時的初始狀態」,但這只是初始狀態,執行階段仍可

以程式更改屬性,使應用系統更為靈活,如表單及每一控制項均有

Visible(看得見 )屬性,其值為 True 或 False,預設值為前者,表示執

行時將顯示在螢幕上,也可以程式改為 False,就可隱藏。

方法則是動態操作,目的是改變物件的目前狀態,如以「書」物

件為例,由書櫃取書、翻書等皆可視為方法,因為「書」物件的狀態

及位置已因執行這些方法而更改。如將插入點移入某文字方塊內,在

程式內就必須使用 SetFocus 方法,如:

Forms(“表單 1”)![文字 1].SetFocus

不同類型的物件有數量不等的屬性及方法,若是表單、報表及控

制項等,大部份屬性皆會顯示在屬性表中,也有一些是只可使用在程

式的屬性,如表單有 Dirty 屬性,此屬性可判斷目前記錄是否已更改

(True 或 False),但此屬性不會顯示在屬性表中。

最後要說明的是如何在程式中使用屬性及方法,在 Visual Basic

編輯器內,只要輸入物件及按下「 .」符號,即可顯示該物件的所有

屬性及方法,如圖 1-14:

圖 1-14 顯示所有屬性及方法

圖 1-14 的狀態是輸入「Me![指令 6].」之後顯示的下拉式清單,

其中「Me」表示執行此段程式的表單或報表,「指令 6」是控制項名

稱,由於控制項也是物件,所以輸入至「 .」符號後,即會顯示清單,內容就是該物件的所有屬性及方法, 圖示為屬性, 為方法。此時

讀者只可在清單內選取所需屬性或方法,不可以清單以外的內容,否

則將發生錯誤。

<<結論>>

本節說明的是物件各項觀念及重點,若讀者是 VBA 初學者,務

須了解物件,其實在日常生活中,很多經驗皆可套用物件的觀念,只

Page 21: 1-1 쏶꧳ VBA - kuas.edu.tB9q%A4l%AE%D1/Vba1t.pdf · 떧Ꙣ땻ꚡ덝군ꓨ궱걏ꕢ룴ꕘ깡ꅁ닄ꑀ귓뻇ꪺ뭹ꢥ걏ACCESS 2.0 ... Workbook 걏겡궶쎯ꅆWord VBA꒤ꪺDocument

不過在程式中,有些物件不會顯示在螢幕上,只會存在於記憶體內。

了解物件後,方可在後續各章進入 VBA 的世界。