Visual Basic for Applications

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

## 數據類型

### 基本數據類型

即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 （根據分配確定）

### 自定義的數據類型

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

```
Type 自定义类型名
     元素名  As 类型
      …
     [元素名 As 类型]
End Type 
```

### 陣列

```vb
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
```

## 控制結構

### if 語句

```
if 條件1 then
   語句1
elseif 條件2 then
   語句2
elseif ...
    ...
else
   語句n
end if
```

### 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 < 60

### Do...Loop 語句

```
Do While或Until 條件
   語句塊1
   Exit Do
   語句塊2
Loop

Do
   語句塊1
   Exit Do
   語句塊2
Loop While或Until 條件
```

### For...Next語句

```
For 循環控制變量=初值To 終值Step 步長
   語句塊 ‘Exit For語句可以跳出循環體
Next
```

### For Each … Next語句

```
For Each 循環控制變量 In 集合變量
   語句塊 
   Exit For語句可以跳出循環體
Next 循環控制變量
```

### 跳出本次循環的continue語句

VBA沒有類似C語言的continue語句。通常可如此寫程序：

```vb
 For 循環控制變量=初值 To 終值 Step 步長
    Do '用于模拟continue
        語句塊 
        If 条件 Then Exit Do '用于模拟continue
        語句塊 
    Loop While False '用于模拟continue
 Next
```

### With語句

```
With 對象引用
   語句塊
End With
```

### On Error語句

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

或

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

### 具有控制作用的函數

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

## 其他語句

### 註釋語句

使用REM或者單引號開始的行。

### 語句的連寫與續行

如果一行包括多條語句，用冒號分割各個語句。跨多行的語句，在行末用「空格加下劃線」表示續行。

## 過程與函數

```
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)，這會導致一些對象的方法調用失敗。例如：

```vb
    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，不等邏輯比較運算<>

## 參考文獻

- VBA Language Reference for MS Office 2013
- Office VBA 語言參考中文版for MS Office 2013
- Office VBA 對像庫的引用for MS Office 2013
- VBA & Visual Basic Scripting 中文版語言參考

## 外部連結

- Docs - Office Dev Center
- 文檔 - Office 開發人員中心

## 基本資料

- 日語原文：Visual Basic for Applications（VBA）
- 編程范型：Multi-paradigm編程語言
- 發行時間：1993年
- 開發者：Microsoft
- 軟體版本週期：7.1(Microsoft Office 2021)
- 類型系統：靜態/動態混合，強/弱混合
- 受影響於：QuickBASIC, Visual Basic
- 作業系統：Microsoft Windows, Mac OS X
- 許可證：專有EULA