Visual Basic for Applications

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

Visual Basic for Applications(VBA)
編程範型Multi-paradigm編程語言
實作者Microsoft
面市時間1993年
當前版本7.1(Microsoft Office 2021)
型態系統靜態/動態混合,強/弱混合
操作系統Microsoft Windows, Mac OS X
許可證專有EULA
網站learn.microsoft.com/en-us/office/vba 編輯維基數據鏈接
啟發語言
QuickBASIC, Visual Basic

數據類型

基本數據類型

即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 < 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語句。通常可如此寫程序:

 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的常用內置函數列表參見:[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,不等邏輯比較運算<>

參考文獻

外部連結