53
19 19 VBA VBA 第第第第 第第第第 19-1 VBA 19-1 VBA 第第第 第第第 19-2 19-2 第第 第第 VBA VBA 第第 第第 19-3 VBA 19-3 VBA 第第第第第第 第第第第第第 19-4 VBA 19-4 VBA 第第第第第第第第 第第第第第第第第 19-5 VBA 19-5 VBA 第第第第 第第第第 19-6 VBA 19-6 VBA 第第第第第第第 第第第第第第第 19-7 Access 19-7 Access 第第第 第第第 19-8 19-8 第第第第第第第 第第第第第第第

第 19 章 VBA程式設計

  • Upload
    thyra

  • View
    130

  • Download
    3

Embed Size (px)

DESCRIPTION

第 19 章 VBA程式設計. 19-1 VBA 的基礎 19-2 建立 VBA 程式 19-3 VBA 的程序與函數 19-4 VBA 的變數與資料型態 19-5 VBA 的運算子 19-6 VBA 的流程控制指令 19-7 Access 的物件 19-8 公用模組的說明. 19-1 VBA的基礎. 19-1-1 微軟的 VBA 19-1-2 VBA 的編輯程式. 19-1-1 微軟的VBA - 說明. - PowerPoint PPT Presentation

Citation preview

Page 1: 第 19 章   VBA程式設計

第第 1919 章 章 VBAVBA程式設計程式設計 19-1 VBA19-1 VBA 的基礎的基礎 19-2 19-2 建立建立 VBAVBA 程式程式 19-3 VBA19-3 VBA 的程序與函數的程序與函數 19-4 VBA19-4 VBA 的變數與資料型態的變數與資料型態 19-5 VBA19-5 VBA 的運算子的運算子 19-6 VBA19-6 VBA 的流程控制指令的流程控制指令 19-7 Access19-7 Access 的物件的物件 19-8 19-8 公用模組的說明公用模組的說明

Page 2: 第 19 章   VBA程式設計

19-1 VBA19-1 VBA的基礎的基礎 19-1-1 19-1-1 微軟的微軟的 VBAVBA 19-1-2 VBA19-1-2 VBA 的編輯程式的編輯程式

Page 3: 第 19 章   VBA程式設計

19-1-1 19-1-1 微軟的微軟的 VBA-VBA- 說明說明 「「 VBAVBA 」(」( Visual Basic for ApplicationsVisual Basic for Applications ))是是 OfficeOffice 家族支援的程式語言,主要的目的是讓家族支援的程式語言,主要的目的是讓使用者能夠輕鬆使用者能夠輕鬆擴充擴充 OfficeOffice 軟體的功能軟體的功能。。

VBAVBA 是使用是使用 Visual BasicVisual Basic 語法的程式語言語法的程式語言,這,這是一種附屬在是一種附屬在 OfficeOffice 應用程式的語言,例如:應用程式的語言,例如:WordWord、、 ExcelExcel和和 AccesAcces 等。等。

以本書的以本書的 AccessAccess 來說,來說, VBAVBA 可以讓使用者撰寫可以讓使用者撰寫程式碼程式碼存取存取 AccessAccess 物件,執行計算、欄位驗證物件,執行計算、欄位驗證和設定操作和設定操作等重複性工作。提供資料庫系統更佳等重複性工作。提供資料庫系統更佳的操作環境,以符合使用者的需求。的操作環境,以符合使用者的需求。

Page 4: 第 19 章   VBA程式設計

19-1-1 19-1-1 微軟的微軟的 VBA-VBA- 種類種類 AccessAccess的的 VBAVBA 程式稱為程式稱為【【模組模組】】物件,物件,簡單的說,模組是由簡單的說,模組是由 VBAVBA 宣告、程序或函宣告、程序或函數所組成的集合數所組成的集合,在資料庫的,在資料庫的 VBAVBA 專案可專案可以顯示模組清單,分為以顯示模組清單,分為 Microsoft AccessMicrosoft Access物件的類別模組和一般模組物件的類別模組和一般模組 22 種基本類型,種基本類型,如下所示:如下所示:

• 類別模組類別模組• 一般模組一般模組

Page 5: 第 19 章   VBA程式設計

19-1-1 19-1-1 微軟的微軟的 VBA-VBA- 類別模組類別模組類別模組類別模組 在在 AccessAccess 資料庫建立的表單或報表物件擁有對資料庫建立的表單或報表物件擁有對應的表單和報表模組。應的表單和報表模組。 表單和報表模組表單和報表模組是是存放表單或報表的事件程序存放表單或報表的事件程序。。當使用者在表單和報表執行動作產生事件時,就當使用者在表單和報表執行動作產生事件時,就是使用事件程序進行處理。是使用事件程序進行處理。

Page 6: 第 19 章   VBA程式設計

19-1-1 19-1-1 微軟的微軟的 VBA-VBA- 一般模組一般模組 一般模組與其它物件無關,它是在資料庫一般模組與其它物件無關,它是在資料庫的的【【模組模組】】清單新增的模組,通常是一些清單新增的模組,通常是一些資料庫經常處理的函數或操作程序,其中資料庫經常處理的函數或操作程序,其中宣告成宣告成 PublicPublic 的程序與函數的程序與函數可以可以在整個資在整個資料庫的任何地方被其它模組呼叫料庫的任何地方被其它模組呼叫,如果是,如果是函數還可以在運算式中使用。函數還可以在運算式中使用。

因為因為一般模組與物件無關一般模組與物件無關,所以建立的程,所以建立的程序與函數並不能在控制項屬性的事件作為序與函數並不能在控制項屬性的事件作為事件程序。事件程序。

Page 7: 第 19 章   VBA程式設計

19-1-2 VBA19-1-2 VBA 的編輯程式的編輯程式 VBAVBA 程式碼的模組設計檢視會啟動程式碼的模組設計檢視會啟動 VBAVBA 編輯程編輯程式進行編輯,在開啟的式進行編輯,在開啟的 AccessAccess 資料庫選資料庫選【【模模組組】】,按上方的,按上方的【【新增新增】】鈕就可以啟動鈕就可以啟動 VBAVBA 編輯編輯程式,如下圖所示:程式,如下圖所示:

Page 8: 第 19 章   VBA程式設計

19-2 19-2 建立建立 VBAVBA程式程式 19-2-1 19-2-1 在在 AccessAccess 新增與執行模組新增與執行模組 19-2-2 19-2-2 使用巨集執行使用巨集執行 VBAVBA 函數函數

Page 9: 第 19 章   VBA程式設計

19-2-1 19-2-1 在在 AccessAccess 新增與執行模組新增與執行模組 在在 AccessAccess 建立模組物件就是在撰寫建立模組物件就是在撰寫 VBAVBA 程式碼,程式碼,在本節範例的在本節範例的 VBAVBA 函數很簡單,只是顯示函數很簡單,只是顯示【【第一第一個個 VBAVBA 程式程式】】訊息文字的視窗後,然後傳回訊息文字的視窗後,然後傳回TrueTrue 值。值。

Page 10: 第 19 章   VBA程式設計

19-2-2 19-2-2 使用巨集執行使用巨集執行 VBAVBA 函數函數 在在 AccessAccess 新增模組的函數(程序新增模組的函數(程序 SubSub 不行)後,不行)後,在在【【運算式建立幫手運算式建立幫手】】可以選擇函數來建立運算可以選擇函數來建立運算式,換句話說,式,換句話說, AccessAccess 物件只要是可以使用運物件只要是可以使用運算式的地方,就可以呼叫和執行建立的模組函數。算式的地方,就可以呼叫和執行建立的模組函數。

Page 11: 第 19 章   VBA程式設計

19-3 VBA19-3 VBA的程序與函數的程序與函數 -- 說明說明 VBAVBA 模組的模組的程式碼單位程式碼單位是是 SubSub 程序或程序或

FunctionFunction 函數函數,每一個,每一個程式碼單位程式碼單位需要指需要指定一個定一個名稱名稱,以便在運算式或事件處理時,以便在運算式或事件處理時可以使用名稱來呼叫程序或函數。可以使用名稱來呼叫程序或函數。

Page 12: 第 19 章   VBA程式設計

19-3 VBA19-3 VBA的程序與函數的程序與函數 -- 程序與函程序與函數數 11

SubSub 副程序副程序 SubSub 程序是一個程式區塊的程序是一個程式區塊的 VBAVBA 程式碼,程式碼,使用使用 SubSub和和 End SubEnd Sub 包圍,程序並沒有包圍,程序並沒有傳回值,在括號中可以加上傳入參數,如傳回值,在括號中可以加上傳入參數,如下所示:下所示:

Public Sub ShowMsg()Public Sub ShowMsg() MsgBox "MsgBox " 第一個第一個 VBAVBA 程式程式 ""End SubEnd Sub

Page 13: 第 19 章   VBA程式設計

19-3 VBA19-3 VBA的程序與函數的程序與函數 -- 程序與函程序與函數數 22

FunctionFunction 函數函數 FunctionFunction 函數只是改為函數只是改為 FunctionFunction和和 End End

FunctionFunction 包圍,括號中可以加上傳入參數,函數包圍,括號中可以加上傳入參數,函數需要傳回值,函數的傳回值是將函數名稱指定成需要傳回值,函數的傳回值是將函數名稱指定成傳回值,如下所示:傳回值,如下所示:Private Function Add2N(MaxValue As Integer) As Private Function Add2N(MaxValue As Integer) As

IntegerInteger Dim i, TotalValue As IntegerDim i, TotalValue As Integer For i = 1 To MaxValue Step 1For i = 1 To MaxValue Step 1 TotalValue = TotalValue + iTotalValue = TotalValue + i NextNext Add2N = TotalValueAdd2N = TotalValueEnd FunctionEnd Function

Page 14: 第 19 章   VBA程式設計

19-3 VBA19-3 VBA的程序與函數的程序與函數 -- 程序與函程序與函數數 33

程式和函數的存取修飾子程式和函數的存取修飾子 在程序和函數之前可以加上存取修飾子在程序和函數之前可以加上存取修飾子

PrivatePrivate和和 PublicPublic ,其存取範圍的說明,,其存取範圍的說明,如下所示:如下所示:• PrivatePrivate::程序與函數只可以在同一個模組中程序與函數只可以在同一個模組中使用,不能在其它模組進行呼叫。使用,不能在其它模組進行呼叫。• PublicPublic::程序與函數可以在資料庫的任何地程序與函數可以在資料庫的任何地方進行呼叫。方進行呼叫。

Page 15: 第 19 章   VBA程式設計

19-3 VBA19-3 VBA的程序與函數的程序與函數 -- 呼叫程序呼叫程序與函數與函數 在其它模組的在其它模組的 VBAVBA 程式碼可以呼叫函數或程式碼可以呼叫函數或副程序,只有呼叫程序時才需要使用副程序,只有呼叫程序時才需要使用 CallCall ,,如下所示:如下所示:

Call ShowMsg()Call ShowMsg() 函數因為擁有傳回值,所以通常是使用指函數因為擁有傳回值,所以通常是使用指定敘述方式來進行呼叫,並且是放在指定定敘述方式來進行呼叫,並且是放在指定敘述的右邊,如下所示:敘述的右邊,如下所示:

TotalValue = Add2N(10)TotalValue = Add2N(10)

Page 16: 第 19 章   VBA程式設計

19-3 VBA19-3 VBA的程序與函數的程序與函數 -- 跳出程序跳出程序與函數與函數 我們可以中斷程序或函數的執行,程序使我們可以中斷程序或函數的執行,程序使用的指令,如下所示:用的指令,如下所示:

Exit SubExit Sub 如為函數,其使用的指令如下所示:如為函數,其使用的指令如下所示:

Exit FunctionExit Function

Page 17: 第 19 章   VBA程式設計

19-3 VBA19-3 VBA的程序與函數的程序與函數 -- 內建函數內建函數11

DLookUp()DLookUp() 函數函數 DLookUp()DLookUp() 函數可以從指定的記錄範圍取函數可以從指定的記錄範圍取得特定的欄位值,其語法如下所示:得特定的欄位值,其語法如下所示:

DLookUp(DLookUp( 運算式運算式 , , 資料來源資料來源 , , 條件條件 )) 上述上述 DLookUp()DLookUp() 函數的使用範例,如下所函數的使用範例,如下所示:示:

DLookUp("DLookUp(" 使用者密碼使用者密碼 ","","員工資料員工資料 ","","員工編員工編號號 ='" & [='" & [ 選擇員工姓名選擇員工姓名 ] & "'")] & "'")

Page 18: 第 19 章   VBA程式設計

19-3 VBA19-3 VBA的程序與函數的程序與函數 -- 內建函數內建函數22

DCount()DCount() 函數函數 DCount()DCount() 函數可以在指定的記錄範圍中計函數可以在指定的記錄範圍中計算其記錄數,函數的參數和算其記錄數,函數的參數和 DLookUP()DLookUP() 相相同,如下所示:同,如下所示:

DCount(DCount( 運算式運算式 , , 資料來源資料來源 , , 條件條件 )) 上述上述 DCount()DCount() 函數的使用範例,如下所函數的使用範例,如下所示:示:

DCount("DCount(" 客戶編號客戶編號 ","","客戶訂單查詢客戶訂單查詢 ")")

Page 19: 第 19 章   VBA程式設計

19-4 VBA19-4 VBA的變數與資料型態的變數與資料型態

19-4-1 19-4-1 變數型態與宣告變數型態與宣告 19-4-2 19-4-2 指定敘述指定敘述

Page 20: 第 19 章   VBA程式設計

19-4-1 19-4-1 變數型態與宣告變數型態與宣告 -- 變數的宣變數的宣告告 11

變數在程式中可以儲存執行的暫存資料,變數在程式中可以儲存執行的暫存資料,它的命名原則,如下所示:它的命名原則,如下所示:• 不能超過不能超過 255255 字元,而且不區分大小寫。字元,而且不區分大小寫。• 名稱中間不能有標點符號的句點、分號、逗號名稱中間不能有標點符號的句點、分號、逗號或空白,而且第或空白,而且第 11 個字元不可以是數字。個字元不可以是數字。• 不能使用不能使用 AccessAccess和和 VBAVBA 的關鍵字和內建函數的關鍵字和內建函數的名稱。的名稱。

在在 VBAVBA 程式使用程式使用【【 DimDim 】】指令宣告變數,指令宣告變數,使用使用【【 AsAs 】】指定資料型態,如下所示:指定資料型態,如下所示:Dim j, TotalValue As IntegerDim j, TotalValue As IntegerDim str As StringDim str As String

Page 21: 第 19 章   VBA程式設計

19-4-1 19-4-1 變數型態與宣告變數型態與宣告 -- 變數的宣變數的宣告告 22

如果同時宣告的變數不只一個,請使用”如果同時宣告的變數不只一個,請使用” ,”,”逗號逗號分隔,變數分隔,變數 strstr 為字串,如果沒有使用為字串,如果沒有使用 AsAs ,如下,如下所示:所示:Dim i, CountDim i, Count

上述程式碼宣告上述程式碼宣告 22 個資料型態為個資料型態為 VariantVariant 的變數,的變數,可以儲存任何資料型態的資料。可以儲存任何資料型態的資料。 事實上,事實上, VBAVBA 程式碼的變數不需要宣告也可以直程式碼的變數不需要宣告也可以直接在指定敘述使用,只要有需要就可以在程式碼接在指定敘述使用,只要有需要就可以在程式碼中使用變數,如此常常會造成程式維護的困擾,中使用變數,如此常常會造成程式維護的困擾,為了要求程式碼中的每一個變數都需要事先宣告,為了要求程式碼中的每一個變數都需要事先宣告,請使用下列指令,如下所示:請使用下列指令,如下所示:

Option ExplicitOption Explicit

Page 22: 第 19 章   VBA程式設計

19-4-1 19-4-1 變數型態與宣告變數型態與宣告 -- 變數的資變數的資料型態料型態型態 說明 範圍Boolean 布林值 True或 FalseByte 正整數 0到 255間的正整數Integer 整數 -32,768到 32,768間的整數Currency 貨幣 -922,337,203,685,477.5808到 922,337,203,685,477.5807Long 長整數 -2,147,483,648到 2,147,483,647間的整數Single 單精度的浮點數 負數範圍為-3.402823E38到-1.401298E-45,正數範圍

1.401298E-45到 3.402823E38Double 雙精度的浮點數 負數範圍為-1.79769313486232E308到-

4.94065645841247E-324,正數範圍4.94065645841247E-324到 1.79769313486232E308

Date 日期 西元 100年 1月 1日到西元 9999年 12月 31日String 字串 固定長度為 65536,可變長度為 20億字元Object 物件 物件的參考Variant 未定型態 依指定敘述的資料而定

Page 23: 第 19 章   VBA程式設計

19-4-1 19-4-1 變數型態與宣告變數型態與宣告 -- 常數的宣常數的宣告告 常數是使用一個名稱取代固定值的數字或常數是使用一個名稱取代固定值的數字或字串,與其說是一個變數,不如說是名稱字串,與其說是一個變數,不如說是名稱轉換,將一些值使用有意義的名稱取代,轉換,將一些值使用有意義的名稱取代,常數在宣告時同時需要指定其值,如下所常數在宣告時同時需要指定其值,如下所示:示:

Const PI As Single = 3.1415926Const PI As Single = 3.1415926 上述程式碼宣告圓周率的常數上述程式碼宣告圓周率的常數 PIPI 。。

Page 24: 第 19 章   VBA程式設計

19-4-2 19-4-2 指定敘述指定敘述 在宣告變數後就可以指定變數值,稱為指在宣告變數後就可以指定變數值,稱為指定敘述。指定敘述是”定敘述。指定敘述是” =”=” 等號,其目的是等號,其目的是指定變數的值,如下所示:指定變數的值,如下所示:

i = 101i = 101str = "str = " 無宗憲無宗憲 ""

上述程式碼指定變數值,變數分別是整數上述程式碼指定變數值,變數分別是整數和字串資料型態的變數。和字串資料型態的變數。

Page 25: 第 19 章   VBA程式設計

19-5 VBA19-5 VBA的運算子的運算子

19-5-1 19-5-1 運算子的優先順序運算子的優先順序 19-5-2 19-5-2 算術與字串運算子算術與字串運算子 19-5-3 19-5-3 比較運算子比較運算子 19-5-4 19-5-4 邏輯運算子邏輯運算子

Page 26: 第 19 章   VBA程式設計

19-5 VBA19-5 VBA的運算子的運算子 VBAVBA 指定敘述的等號右邊若為運算式或條指定敘述的等號右邊若為運算式或條件運算式都是由運算子和運算元所組件運算式都是由運算子和運算元所組成,成, VBAVBA 擁有算術、比較、連結和邏輯運擁有算術、比較、連結和邏輯運算子,如下所示:算子,如下所示:

A + B – 1A + B – 1A >= BA >= BA > B And A > 1A > B And A > 1

上述運算式中上述運算式中 AA 、、 BB 變數和數值變數和數值 11 都是運都是運算元,算元, ++ 、、 -- 為運算子。為運算子。

Page 27: 第 19 章   VBA程式設計

19-5-1 19-5-1 運算子的優先順序運算子的優先順序 正常的情況,如果沒有優先順序的差異,運算式正常的情況,如果沒有優先順序的差異,運算式依照出現的順序,由左到右依序執行。依照出現的順序,由左到右依序執行。 括號內比括號外的先執行,通常括號的目的是為括號內比括號外的先執行,通常括號的目的是為了推翻現有的優先順序,在括號內是依照正常的了推翻現有的優先順序,在括號內是依照正常的優先順序執行。優先順序執行。 當運算式超過一個運算子時,算術運算子最先,當運算式超過一個運算子時,算術運算子最先,接著是比較運算子,最後才是邏輯運算子。接著是比較運算子,最後才是邏輯運算子。 對於運算子內的各種運算,比較運算子的優先順對於運算子內的各種運算,比較運算子的優先順序相同,算術和邏輯運算子,請參考後面表格,序相同,算術和邏輯運算子,請參考後面表格,位在前面列的優先順序比較高,就是先執行。位在前面列的優先順序比較高,就是先執行。 算術運算子中加和減法優先順序相同,乘和除法算術運算子中加和減法優先順序相同,乘和除法擁有相同的優先順序,不過乘除高於加減。擁有相同的優先順序,不過乘除高於加減。

Page 28: 第 19 章   VBA程式設計

19-5-2 19-5-2 算術與字串運算子算術與字串運算子 字串連結運算子”字串連結運算子” &”&” 並不是算術運算子,它的並不是算術運算子,它的優先順序在算術運算子之後,在比較運算子之前,優先順序在算術運算子之後,在比較運算子之前,運算子依照優先順序排序,如下表所示:運算子依照優先順序排序,如下表所示:運算子 說明 運算式範例^ 指數 5 ^ 2 = 25- 負號 -7* 乘法 5 * 6 = 30/ 除法 7 / 2 = 3.5\ 整數除法 7 \ 2 = 3MOD 餘數 7 MOD 2 = 1+ 加法 4 + 3 = 7- 減法 4 – 3 = 1& 字串連結 "ab" & "cd" = "abcd"

Page 29: 第 19 章   VBA程式設計

19-5-3 19-5-3 比較運算子比較運算子 比較運算子沒有優先順序的分別,通常都是使用比較運算子沒有優先順序的分別,通常都是使用在迴圈和條件敘述的判斷條件,其中在迴圈和條件敘述的判斷條件,其中 IsIs 運算子並運算子並非比較物件,而是檢查非比較物件,而是檢查 22 個物件是否參考到相同個物件是否參考到相同物件,如下表所示:物件,如下表所示:運算子 說明= 等於<> 不等於< 小於> 大於<= 小於等於>= 大於等於Is 物件比較Like 子字串比較

Page 30: 第 19 章   VBA程式設計

19-5-4 19-5-4 邏輯運算子邏輯運算子 如果迴圈和條件敘述的判斷條件不只一個,如果迴圈和條件敘述的判斷條件不只一個,需要使用邏輯運算子來連結多個條件,運需要使用邏輯運算子來連結多個條件,運算子依照優先順序排序,如下表所示:算子依照優先順序排序,如下表所示:運算子 說明Not 非,傳回運算元相反的值,通常配合運算式的布林值And 且,連結的 2個運算元都為 True,則運算式為 TrueOr 或,連結的 2個運算元中,任一個為 Ture,則運算式為 TrueXor 連結的 2個運算元中,只有一個為真,不同時都為 True則運算式為

True,否則為 FalseEqv 2個運算元相等同為 True或 False則為 True,否則為 False

Page 31: 第 19 章   VBA程式設計

19-6 VBA19-6 VBA的流程控制指令的流程控制指令 19-6-1 VBA19-6-1 VBA 的條件控制指令的條件控制指令 19-6-2 VBA19-6-2 VBA 的迴圈控制指令的迴圈控制指令

Page 32: 第 19 章   VBA程式設計

19-6 VBA19-6 VBA的流程控制指令的流程控制指令 程式碼的流程控制只是配合條件判斷來執程式碼的流程控制只是配合條件判斷來執行不同區塊的程式碼,或是像迴圈一般重行不同區塊的程式碼,或是像迴圈一般重複執行區塊的程式碼,流程控制指令主要複執行區塊的程式碼,流程控制指令主要分為分為 22 類,如下所示:類,如下所示:

•條件控制:條件控制:條件控制是一個選擇題,可能為單條件控制是一個選擇題,可能為單一選擇或多選一,依照條件運算子的結果,決一選擇或多選一,依照條件運算子的結果,決定執行哪一個區塊的程式碼。定執行哪一個區塊的程式碼。•迴圈控制:迴圈控制:迴圈控制是重複執行區塊的程式碼,迴圈控制是重複執行區塊的程式碼,擁有結束條件可以結束迴圈的執行。擁有結束條件可以結束迴圈的執行。

Page 33: 第 19 章   VBA程式設計

19-6-1 19-6-1 VBAVBA 的條件控制指令的條件控制指令 -If/Then-If/Then 條件條件敘述敘述

VBAVBA 的條件敘述部分可以分為是否選、二的條件敘述部分可以分為是否選、二選一或多選一等幾種條件敘述指令。選一或多選一等幾種條件敘述指令。 If/ThenIf/Then 條件敘述是一種是否執行的條件,條件敘述是一種是否執行的條件,決定是否執行區塊內的程式碼,如果決定是否執行區塊內的程式碼,如果 IfIf 條條件為件為 TrueTrue ,就執行,就執行 Then...End IfThen...End If 間的程間的程式碼,如下所示:式碼,如下所示:

If TestValue > 0 ThenIf TestValue > 0 Then UserName = "UserName = " 無宗憲無宗憲 ""End IfEnd If

Page 34: 第 19 章   VBA程式設計

19-6-1 19-6-1 VBAVBA 的條件控制指令的條件控制指令 -If/Then/Else-If/Then/Else條件敘述條件敘述

If/ThenIf/Then 條件只是執行或不執行選擇的單一選擇,條件只是執行或不執行選擇的單一選擇,不只如此,如果有排它的不只如此,如果有排它的 22 個執行區塊需要二選個執行區塊需要二選一,只需加上一,只需加上 ElseElse即可,如果即可,如果 IfIf 條件為條件為 TrueTrue ,,就執行就執行 Then...ElseThen...Else間的程式碼,間的程式碼, FalseFalse 執行執行Else...End IfElse...End If間的程式碼,如下所示:間的程式碼,如下所示:If TestValue > 0 ThenIf TestValue > 0 Then UserName = "UserName = " 無宗憲無宗憲 ""ElseElse UserName = "UserName = " 胡瓜胡瓜 ""End IfEnd If

Page 35: 第 19 章   VBA程式設計

19-6-1 VBA19-6-1 VBA 的條件控制指令的條件控制指令 --多選多選一的條件敘述一的條件敘述 (If/Then/ElseIf(If/Then/ElseIf 條件敘條件敘述述 )) If/Then/ElseIfIf/Then/ElseIf 條件敘述是條件敘述是 If/ThenIf/Then 條件敘述的延伸,使用條件敘述的延伸,使用 ElseIfElseIf 指指令建立多選一條件,如下所示:令建立多選一條件,如下所示:

If thisDay = 1 ThenIf thisDay = 1 Then str="str="星期日星期日 ""ElseIf thisDay = 2 ThenElseIf thisDay = 2 Then str="str="星期一星期一 ""ElseIf thisDay = 3 ThenElseIf thisDay = 3 Then str="str="星期二星期二 ""ElseIf thisDay = 4 ThenElseIf thisDay = 4 Then str="str="星期三星期三 ""ElseIf thisDay = 5 ThenElseIf thisDay = 5 Then str="str="星期四星期四 ""ElseIf thisDay = 6 ThenElseIf thisDay = 6 Then str="str="星期五星期五 ""ElseIf thisDay = 7 ThenElseIf thisDay = 7 Then str="str="星期六星期六 ""ElseElse Msgbox "Msgbox " 無法分辨星期無法分辨星期 ""End IfEnd If

Page 36: 第 19 章   VBA程式設計

19-6-1 VBA19-6-1 VBA 的條件控制指令的條件控制指令 --多選多選一的條件敘述一的條件敘述 (Select/Case(Select/Case 條件敘條件敘述述 ))

VBAVBA 還有另一種多選一的條件敘述還有另一種多選一的條件敘述 Select/CaseSelect/Case ,,這種條件敘述比較簡潔,依照照符合的條件執行這種條件敘述比較簡潔,依照照符合的條件執行不同區塊的程式碼,如下所示:不同區塊的程式碼,如下所示:Select Case thisDaySelect Case thisDay Case 1: str="Case 1: str=" 星期日星期日 "" Case 2: str="Case 2: str=" 星期一星期一 "" Case 3: str="Case 3: str=" 星期二星期二 "" Case 4: str="Case 4: str=" 星期三星期三 "" Case 5: str="Case 5: str=" 星期四星期四 "" Case 6: str="Case 6: str=" 星期五星期五 "" Case 7: str="Case 7: str=" 星期六星期六 "" Case ElseCase Else Msgbox "Msgbox " 無法分辨星期無法分辨星期 ""End SelectEnd Select

Page 37: 第 19 章   VBA程式設計

19-6-2 19-6-2 VBAVBA 的迴圈控制指令的迴圈控制指令 -For/Step/Nex-For/Step/Nex

tt迴圈迴圈 For/Step/NextFor/Step/Next迴圈敘述可以執行固定次數的迴迴圈敘述可以執行固定次數的迴圈,以圈,以 StepStep量增加或減少,如果量增加或減少,如果 StepStep為為 11 可以可以省略省略 StepStep 指令,例如:使用指令,例如:使用 For/Step/NextFor/Step/Next迴迴圈每次增加圈每次增加 11 ,執行,執行 11 到到 1010次相加的迴圈,如次相加的迴圈,如下所示:下所示:

Dim i, TotalDim i, TotalFor i = 1 To 10 Step 1For i = 1 To 10 Step 1 Total = Total + iTotal = Total + iNextNext

上述上述 For/Step/NextFor/Step/Next迴圈是從迴圈是從 11 加到加到 1010 計算總計算總和,如果使用負數的和,如果使用負數的 StepStep ,如下所示:,如下所示:For i = 10 To 1 Step -1For i = 10 To 1 Step -1 Total = Total + iTotal = Total + iNextNext

Page 38: 第 19 章   VBA程式設計

19-6-2 VBA19-6-2 VBA 的迴圈控制指令的迴圈控制指令 -For -For Each/In/NextEach/In/Next 迴圈迴圈

For EachFor Each迴圈和迴圈和 For NextFor Next迴圈敘述十分相似,迴圈敘述十分相似,只不過迴圈主要是使用在物件和集合物件用來顯只不過迴圈主要是使用在物件和集合物件用來顯示所有元素,特別適合哪些不知道共有多少元素示所有元素,特別適合哪些不知道共有多少元素的集合物件,如下所示:的集合物件,如下所示:Public Sub ClearTextField(frm As Form)Public Sub ClearTextField(frm As Form) Dim ctl As ControlDim ctl As Control For Each ctl In frm.ControlsFor Each ctl In frm.Controls If ctl.ControlType = acTextBox ThenIf ctl.ControlType = acTextBox Then ctl.Value = ""ctl.Value = "" End IfEnd If Next ctlNext ctlEnd SubEnd Sub

Page 39: 第 19 章   VBA程式設計

19-6-2 VBA19-6-2 VBA 的迴圈控制指令的迴圈控制指令 - - Do/While...Until/LoopDo/While...Until/Loop 迴圈迴圈 11

Do/While...Until/LoopDo/While...Until/Loop 迴圈擁有多種組合,迴圈擁有多種組合,當迴圈執行到條件為當迴圈執行到條件為 FalseFalse 時,可以在迴時,可以在迴圈開始或結束使用圈開始或結束使用 WhileWhile或或 UntilUntil 測試迴測試迴圈條件,如果在迴圈尾測試條件,迴圈至圈條件,如果在迴圈尾測試條件,迴圈至少執行一次,請注意!這種迴圈需要自己少執行一次,請注意!這種迴圈需要自己處理迴圈的結束條件和計數器。處理迴圈的結束條件和計數器。

Page 40: 第 19 章   VBA程式設計

19-6-2 VBA19-6-2 VBA 的迴圈控制指令的迴圈控制指令 - - Do/While...Until/LoopDo/While...Until/Loop 迴圈迴圈 22

WhileWhile 當條件成立時當條件成立時 Do/LoopDo/Loop 迴圈使用迴圈使用 WhileWhile 條件,條件是在條件,條件是在迴圈開頭時檢查,如下所示:迴圈開頭時檢查,如下所示:

i = 1 i = 1 Total = 0Total = 0Do While i <=10Do While i <=10 Total = Total + iTotal = Total + i i = i + 1 i = i + 1 LoopLoop

Page 41: 第 19 章   VBA程式設計

19-6-2 VBA19-6-2 VBA 的迴圈控制指令的迴圈控制指令 - - Do/While...Until/LoopDo/While...Until/Loop 迴圈迴圈 33

UntilUntil 直到條件成立直到條件成立 Do/LoopDo/Loop 迴圈使用迴圈使用 UntilUntil 條件,條件是在條件,條件是在迴圈尾進行檢查,如下所示:迴圈尾進行檢查,如下所示:

i = 1 i = 1 Total = 0Total = 0DoDo Total = Total + iTotal = Total + i i = i + 1 i = i + 1 Loop Until i > 10Loop Until i > 10

Page 42: 第 19 章   VBA程式設計

19-6-2 VBA19-6-2 VBA 的迴圈控制指令的迴圈控制指令 - - While/WendWhile/Wend 迴圈迴圈

While/WendWhile/Wend 迴圈控制是在迴圈開始時測迴圈控制是在迴圈開始時測試條件,以決定是否繼續執行迴圈的程式試條件,以決定是否繼續執行迴圈的程式碼,在功能上和碼,在功能上和 Do/LoopDo/Loop 迴圈相同,如下迴圈相同,如下所示:所示:i = 1 i = 1 Total = 0Total = 0While i <= 10While i <= 10 Total = Total + iTotal = Total + i i = i + 1 i = i + 1 WendWend

Page 43: 第 19 章   VBA程式設計

19-6-2 VBA19-6-2 VBA 的迴圈控制指令的迴圈控制指令 - Exit - Exit Do/ForDo/For 指令指令 11

Exit ForExit For :跳離:跳離 For/NextFor/Next 迴圈迴圈 迴圈在尚來到達結束條件時,可以使用迴圈在尚來到達結束條件時,可以使用

Exit ForExit For 指令強迫跳出指令強迫跳出 For/NextFor/Next 迴圈,結迴圈,結束迴圈的執行,如下所示:束迴圈的執行,如下所示:For i = 1 To 100 Step 1For i = 1 To 100 Step 1 … … Exit ForExit For … …NextNext

Page 44: 第 19 章   VBA程式設計

19-6-2 VBA19-6-2 VBA 的迴圈控制指令的迴圈控制指令 - Exit - Exit Do/ForDo/For 指令指令 22

Exit DoExit Do :跳離:跳離 Do/LoopDo/Loop 迴圈迴圈 如果沒有使用如果沒有使用 WhileWhile或或 UntilUntil 指令在迴圈指令在迴圈頭尾測試條件,單純的頭尾測試條件,單純的 Do/LoopDo/Loop 迴圈是一迴圈是一個無窮迴圈,此時可以使用個無窮迴圈,此時可以使用 Exit DoExit Do 指令指令結束迴圈的執行,如下所示:結束迴圈的執行,如下所示:

DoDo … ….. Exit DoExit Do … …..LoopLoop

Page 45: 第 19 章   VBA程式設計

19-7 19-7 使用使用 AccessAccess 的物件的物件 -- 說明說明 AccessAccess 物件模型是從最上層的物件模型是從最上層的 ApplicationApplication 物物件開始,件開始, ApplicationApplication 物件就是物件就是 AccessAccess 建立的建立的應用程式,在其下擁有幾種主要物件,如下表所應用程式,在其下擁有幾種主要物件,如下表所示:示:物件 說明

Forms Forms物件是表單集合物件,資料庫允許擁有多個 Form物件,每一個 Form物件之下分為控制項的 Controls集合物件(擁有多個 Control物件)和類別模組的Modules集合物件

Reports Reports物件是報表集合物件,資料庫允許擁有多個 Report物件,每一個 Report物件之下分為控制項的 Controls集合物件和類別模組的Modules集合物件

Modules Modules物件是模組集合物件,資料庫允許擁有多個Module物件DoCmd DoCmd物件可以在 VBA執行巨集指令Screen Screen物件是目前游標所在的物件參考,使用 Screen物件的

ActiveControl屬性可以取得游標所在的表單、報表或控制項的物件參考

Page 46: 第 19 章   VBA程式設計

19-7 19-7 使用使用 AccessAccess 的物件的物件 --FormForm和和ReportReport 物件物件

VBAVBA 程式碼可以使用程式碼可以使用 FormForm和和 ReportReport 物件存取表單和報物件存取表單和報表物件的控制項內容或屬性值,如下所示:表物件的控制項內容或屬性值,如下所示:curSource = Forms(“curSource = Forms(“ 表單名稱”表單名稱” ).Controls(“).Controls(“ 控制項名控制項名稱”稱” ).). 控制項屬性控制項屬性curSource = Forms(“curSource = Forms(“ 表單名稱”表單名稱” )!)! 控制項名稱控制項名稱 .. 控制項控制項屬性屬性curSource = Forms!curSource = Forms! 表單名稱表單名稱 !! 控制項名稱控制項名稱 .. 控制項屬性控制項屬性 上述上述 33 列程式碼都可以取得表單物件指定控制項的屬性值,列程式碼都可以取得表單物件指定控制項的屬性值,如果表單擁有子表單,此時的程式碼如下所示:如果表單擁有子表單,此時的程式碼如下所示:curQuantity = Forms(“curQuantity = Forms(“ 表單名稱”表單名稱” ).Controls(“).Controls(“ 子表單子表單名稱”名稱” ).Form!).Form! 控制項名稱控制項名稱curQuantity = Forms!curQuantity = Forms! 表單名稱表單名稱 !! 子表單名稱子表單名稱 .Form!.Form! 控控制項名稱制項名稱

Page 47: 第 19 章   VBA程式設計

19-7 19-7 使用使用 AccessAccess 的物件的物件 --DoCmdDoCmd物件物件 DoCmdDoCmd 物件可以在物件可以在 VBAVBA 程式碼執行巨集指令,程式碼執行巨集指令,例如:開啟報表物件,其程式碼如下所示:例如:開啟報表物件,其程式碼如下所示:

Dim strFormName As StringDim strFormName As StringstrFormName = “strFormName = “ 表單名稱”表單名稱”DoCmd.OpenForm strFormName, acNormalDoCmd.OpenForm strFormName, acNormal

上述程式碼使用正常方式開啟表單物上述程式碼使用正常方式開啟表單物件,件, acNormalacNormal 是巨集指令引數的常數,如果需是巨集指令引數的常數,如果需要關閉此表單且不儲存,其程式碼如下所示:要關閉此表單且不儲存,其程式碼如下所示:DoCmd.Close acForm, strFormName, acSaveNoDoCmd.Close acForm, strFormName, acSaveNo

Page 48: 第 19 章   VBA程式設計

19-8 19-8 公用模組的說明公用模組的說明 -IsLoaded()-IsLoaded()函數函數 11IsLoaded()IsLoaded() 函數函數 IsLoaded()IsLoaded() 函數可以檢查表單物件是否開函數可以檢查表單物件是否開啟,其語法如下所示:啟,其語法如下所示:

IsLoaded(“IsLoaded(“ 表單名稱”表單名稱” ))

Page 49: 第 19 章   VBA程式設計

19-8 19-8 公用模組的說明公用模組的說明 -IsLoaded()-IsLoaded()函數函數 22Function IsLoaded(ByVal strFormName As String) As Function IsLoaded(ByVal strFormName As String) As

BooleanBoolean ' Returns True if the specified form is open in Form ' Returns True if the specified form is open in Form

view or Datasheet view.view or Datasheet view. Const conObjStateClosed = 0Const conObjStateClosed = 0 Const conDesignView = 0Const conDesignView = 0 If SysCmd(acSysCmdGetObjectState, acForm, If SysCmd(acSysCmdGetObjectState, acForm,

strFormName) <>strFormName) <> conObjStateClosed ThenconObjStateClosed Then If Forms(strFormName).CurrentView <> If Forms(strFormName).CurrentView <>

conDesignView ThenconDesignView Then IsLoaded = TrueIsLoaded = True End IfEnd If End IfEnd IfEnd FunctionEnd Function

Page 50: 第 19 章   VBA程式設計

19-8 19-8 公用模組的說明公用模組的說明 --CheckRecords()CheckRecords() 函數函數 11

CheckRecords()CheckRecords() 函數函數 CheckRecords()CheckRecords() 函數使用函數使用 DCount()DCount() 函函數檢查指定查詢物件是否找到任何記錄,數檢查指定查詢物件是否找到任何記錄,其語法如下所示:其語法如下所示:

CheckRecords(“CheckRecords(“ 欄位名稱”欄位名稱” , “, “查詢物件名稱查詢物件名稱”” ))

Page 51: 第 19 章   VBA程式設計

19-8 19-8 公用模組的說明公用模組的說明 --CheckRecords()CheckRecords() 函數函數 22

Function CheckRecords(ByVal ControlName As Function CheckRecords(ByVal ControlName As String, String,

strQueryName As String) As BooleanstrQueryName As String) As Boolean

Dim DCounters As IntegerDim DCounters As Integer

DCounters = DCount(ControlName, DCounters = DCount(ControlName, strQueryName)strQueryName)

If DCounters = 0 ThenIf DCounters = 0 Then CheckRecords = TrueCheckRecords = True ElseElse CheckRecords = FalseCheckRecords = False End IfEnd IfEnd FunctionEnd Function

Page 52: 第 19 章   VBA程式設計

19-8 19-8 公用模組的說明公用模組的說明 --IsReportLoaded()IsReportLoaded() 函數函數 11

IsReportLoaded()IsReportLoaded() 函數函數 IsReportLoaded()IsReportLoaded() 函數可以檢查報表物件函數可以檢查報表物件是否已經開啟,其語法如下所示:是否已經開啟,其語法如下所示:

IsReportLoaded(“IsReportLoaded(“ 報表名稱”報表名稱” ))

Page 53: 第 19 章   VBA程式設計

19-8 19-8 公用模組的說明公用模組的說明 --IsReportLoaded()IsReportLoaded() 函數函數 22

Function IsReportLoaded(ByVal Function IsReportLoaded(ByVal ReportNames As String) As BooleanReportNames As String) As Boolean

Const ObjStateClosed = 0Const ObjStateClosed = 0

If SysCmd(acSysCmdGetObjectState, If SysCmd(acSysCmdGetObjectState, acReport, ReportNames) <> acReport, ReportNames) <>

ObjStateClose ThenObjStateClose Then IsReportLoaded = TrueIsReportLoaded = True End IfEnd If

End FunctionEnd Function