Visual Basic for Applications

Visual Basic for Applications（VBA）是 Visual Basic 的一種巨集語言，主要能用來擴充套件 Windows 的應用程式功能，特別是 Microsoft Office 軟體。也可說是一種應用程式視覺化的 Basic Script。 1994 年發行的 Excel 5.0 版本中，即具備了 VBA 的巨集功能。

資料型別

1.1 基本資料型別

即 Primary Type Data，下述列表的括號內為位元組數：

Byte (1)：無符號型別，取值範圍 0-255
Boolean (2)
Integer (2)
Long (4)
Single (4)
Double (8)
Currency (8)
Decimal (14)
Date (8)
String
Object (4)
Variant （根據分配確定）

1.2 自定義的資料型別

相當於 C 語言的 struct，例如：

Type 自定義型別名

元素名 As 型別

…

元素名 As 型別

End Type

1.3 陣列

Option Base 0 ' 陣列索引值從 0 開始

Option Base 1 ' 陣列索引值從 1 開始

Dim MyArray (10) ' 宣告一個陣列變數，10 是最大的可用的陣列索引值

MyArray (5) = 101 ' 給陣列的元素賦值

Dim Data (10,5) ' 宣告一個二維陣列變數

Data (1,1) = "A001" ' 給陣列元素賦值

Dim cArr (-11 To 20, 1 To 3) As String ' 宣告一個陣列，定義陣列索引值的上下界

Dim dArr As String ' 宣告動態陣列

ReDim dArr (0 To 5, 1 To 2) ' 改變動態陣列的尺寸預設把原資料清除。如果保留原來的資料，必須加上引數 Preserve。

' 使用 Preserve 引數時只能改變最後一維的大小

If UBound (vTemp) = -1 Then

' 判斷陣列變數 vTemp 是否為 空陣列

End If

Erase MyArrar, Data 'Erase 語句清除陣列元素，釋放變數佔用的空間

常量

日期常量由符號 “#” 將字元括起來，如 #2012-1-1#。

系統定義常量有 3 個：True、False 和 Null。

固有常量是程式設計時引用的物件庫定義的常量。所有固有常量都可以在宏或 VBA 程式碼中使用。通常，固有常量透過前兩個字母來指明定義該常量。來自 VB 庫的常量則以 “vb” 開頭。來自 Access 的常量以 “ac” 開頭。可以使用物件瀏覽器來檢視所有物件庫中的固有常量列表。

可以自行定義常量。如：

Global Const 符號常量名稱 = 常量值

呼叫 DLL

例如：

Private Declare Function getFrequency Lib "kernel32" _ Alias "QueryPerformanceFrequency" (cyFrequency As Currency) As Long

Private Declare Function getTickCount Lib "kernel32" _ Alias "QueryPerformanceCounter" (cyTickCount As Currency) As Long

控制結構

4.1 if 語句

if 條件 1 then

語句 1

elseif 條件 2 then

語句 2

elseif ...

...

else

語句 n

end if

4.2 Select Case 語句

Select Case 表示式

Case 表示式列表 1

語句 1

Case 表示式列表 2

語句 2

...

Case 表示式列表 n

語句 n

End Select

其中的表示式列表可以為：

表示式 例： "A"
用逗號分隔的一組列舉表示式 例：2,4,6,8
表示式 1 To 表示式 2 例：60 To 100
Is 關係運算符表示式 例：Is

For 迴圈控制變數 = 初值 To 終值 Step 步長

Do ' 用於模擬 continue

語句塊

If 條件 Then Exit Do ' 用於模擬 continue

語句塊

Loop While False ' 用於模擬 continue

Next

4.3 With 語句

With 物件引用

語句塊

End With

4.4 On Error 語句

On Error Goto 出錯處理語句的 label ' 跳轉到出錯處理語句

或

On Error Resume Next ' 遇到錯誤，不管錯誤，繼續往下執行

4.5 具有控制作用的函式

IIf (條件式，表示式 1, 表示式 2)
Switch (條件式 1, 表示式 1, 條件式 2, 表示式 2,..., 條件式 n, 表示式 n)
Choose (索引式，選項 1, 選項 2,..., 選項 n) ' 這是基於 1 的索引

過程與函式

Sub 過程名 (參數列)

語句塊

Exit Sub

語句塊

End Sub

Function 函式名 (參數列) As Type

語句塊

函式名 = 表示式

Exit Function

End Function

可以是 Private、Public、Friend、Static 等修飾。

呼叫函式 / 過程時，可以加括號或者不加括號。如果呼叫表示式作為一行的一部分，那麼必須用引數，例如函式呼叫的返回值賦給變數。 呼叫過程時， 可以使用 / 不使用 call 關鍵字。使用 call 語句呼叫過程，如果無引數，則不加括號；如果有引數，必須加括號。如果呼叫時用括號包住單個引數，則該引數強行按值傳遞。需要特別注意，不用 call 不加括號的呼叫，形參與實參是傳值 (passed by value) 而不是傳引用 (passed by reference)，這會導致一些物件的方法呼叫失敗。例如：

Dim cn As ADODB.Connection

Set cn = CurrentProject.Connection

Dim rs As New ADODB.Recordset

rs.Open "SELECT * FROM myTable" , cn

Dim ExcelApp As New Excel.Application

Dim ExcelWst As Worksheet

Set ExcelWst = ExcelApp.Workbooks.Add.Worksheets (1)

ExcelWst.Range ("A2").CopyFromRecordset (rs) ' 失敗，無法執行該行

ExcelWst.Range ("A2").CopyFromRecordset rs ' 可成功執行該行

常用內建函式

VBA 的常用內建函式列表參見：

MsgBox
InputBox
舍入函式：Fix 向 0 取整，Int 向下取整，Round 四捨五入
Rnd 返回 0-1 內的單精度隨機數
字串函式：
Filter：對字串的一維陣列的過濾
InStr (Start, ,, Compare) 與 InStrRev： 查詢子串
Len 字串長度
Join：連線一維陣列中的所有子字串
Left,Right,Mid 擷取子字串
Space (數值) 生成空格字串
Ucase,Lcase 大小寫轉換函式
Ltrim, Rtrim,Trim 刪除首尾空格
Replace
Split：分割一個字串成為一維陣列
StrComp：字串比較
StrConv：字串轉換
String (number, character)：制定字元重複若干次
StrReverse
日期 / 時間有關函式：
Year, Month, Day, WeekDay,Hour,Minute,Second 擷取日期時間分量
DateAdd 日期 / 時間增量函式
DateDiff (,,,W1,W2) 日期 / 時間的距離函式
DatePart (,,w1,w2) 時間分割函式
DateSerial (,,) 合成日期；DateValue (“字串表示式”) 返回日期；
Date,Time,Now,Timer 返回日期時間
DateValue
TimeSerial：由時間序列得到時間物件
TimeValue：由時間字串得到時間物件
Weekday：獲得日期的周幾
WeekdayName
轉換函式：CBool、CByte、CCur、 CDate、 CDbl、CDec、CInt、 CLng、CLngLng、CLngPtr、CSng、CStr、CVar、CVErr、Asc 返回第一個字元的 Ascii 編碼值、Chr (ASCII 碼) 返回字元、Hex、Oct、Str 返回字串、Val (string)、Format、FormatCurrency、FormatDateTime、FormatNumber、FormatPercent、MonthName
Nz (表示式或欄位屬性值，規定值) 如果是空，則返回 0 或者 "" 或者函式的第二個引數值
驗證函式：isNumeric、isDate、isNull、isEmpty IsArray、IsError、IsMissing、IsObject
數學函式：Abs、Sqr、Tan、Atn（即 atan）、Sin、Cos、Exp（e 為基的指數）、Log 自然對數
Array: 構造一個 Array 物件
CallByName: get or set a property, or invoke a method at run time using a string name.

控制流：Choose: 類似於 C 語言的 select 語句、IIf 相當於 IF-ELSE 語句、Switch
Command：獲取命令列引數
CreateObject：建立 ActiveX 物件
CurDir：返回指定驅動器的當前工作路徑
由基本數學函式匯出的函式：Sec、Cosec、Cotangent、Cotan、Arcsin、Arccos、Arcsec、Arccosec、Arccotan、HSin、HCos、HTan、HSec、HCosec、HCotan、HArcsin、HArccos、HArctan、HArcsec、HArccosec、HArccotan、LogN
DoEvents：暫時把 CPU 控制權交回給系統。
Environ：返回環境變數的值
檔案操作：
Dir：返回滿足條件的所有檔案、目錄的名字
EOF
FileAttr
FileDateTime
FileLen
FreeFile Function
GetAttr：返回檔案、目錄的屬性值
Input：讀取檔案
Loc：檔案指標位置
LOF：檔案開啟時的指標位置
Seek：檔案指標定位
Spc：使用 Print 做 position output
Tab：用於 Print 函式
Error: 錯誤號對應的錯誤訊息
Windows Registry 中的資料：GetAllSettings、SaveSetting、DeleteSetting、GetSetting
GetObject：ActiveX 組建的引用
IMEStatus：返回當前 Input Method Editor (IME)。
Macintosh 平臺：MacID、MacScript
金融函式：
DDB：使用 double-declining balance 計算貶值
FV: 計算固定利率的年金
IPmt：計算利率
IRR：計算利率
MIRR：計算利率
NPer：計算週期數
NPV：計算 net present value
Pmt：計算支付數
PPmt：計算本金支付數
PV：計算 present value
Rate：利息率
SLN：straight-line depreciation
SYD：計算 sum-of-years' digits depreciation
Partition：返回字串，表示一個數值名字落在各個 range 內。常用於 SQL select 語句
QBColor：顏色值
RGB：顏色值
TypeName：得到變數的型別名
VarType：得到變數的型別數

表示式

比較特殊的運算子有指數運算 ^，浮點除法 /，整數除法 \，取模運算 Mod，不等邏輯比較運算