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 

**數組**
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  
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)，這會導致一些對象的方法調用失敗。例如：
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的常用內置函數列表參見： date=20170203162526 
*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 date=20200614165406 -  Office VBA 語言參考中文版for MS Office 2013 date=20170703035530 -  Office VBA 對像庫的引用for MS Office 2013-  VBA & Visual Basic Scripting 中文版語言參考 date=20200614165413 

**外部連結**
官方網站：
** Docs - Office Dev Center date=20210525071108 
** 文檔 - Office 開發人員中心 date=20210507010446