Visual_Basic_for_Applications

**V**isual **B**asic for **A**pplications（**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 
```

### 數組

## 常量

日期常量由符號「#」將字符括起來，如 #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 語句。通常可如此寫程序：

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

## 常用內置函數

VBA 的常用內置函數列表參見：[1] （頁面存檔備份，存於網際網路檔案館）

* MsgBox
* InputBox
* 捨入函數：Fix 向 0 取整，Int 向下取整，Round 四捨五入
* Rnd 返回 0-1 內的單精度隨機數
* 字符串函數：
  * Filter：對字符串的一維數組的過濾
  * InStr ([Start,]<Str1>,<Str2>[, 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 (<間隔類型>,<日期 1>,<日期 2>[,W1][,W2]) 日期 / 時間的距離函數
  * DatePart (<分割類型>,<日期>[,w1][,w2]) 時間分割函數
  * DateSerial (<表達式 1>,<表達式 2>,<表達式 3>) 合成日期；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，不等邏輯比較運算 <>

## 參考文獻

## 外部連結

* 官方網站：
  * Docs - Office Dev Center （頁面存檔備份，存於網際網路檔案館）
  * 文檔 - Office 開發人員中心 （頁面存檔備份，存於網際網路檔案館）