跳至內容

Visual Basic for Applications

維基百科,自由的百科全書
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

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

參考文獻

[編輯]

外部連結

[編輯]