Visual Basic for Applications
Visual Basic for Applications(VBA)是Visual Basic的一種巨集語言,主要能用來擴展Windows的應用程式功能,特別是Microsoft Office軟體。也可說是一種應用程式視覺化的Basic Script。 1994年發行的Excel 5.0版本中,即具備了VBA的巨集功能。
編程範型 | Multi-paradigm編程語言 |
---|---|
實作者 | Microsoft |
面市時間 | 1993年 |
當前版本 | 7.1(Microsoft Office 2021) |
型態系統 | 靜態/動態混合,強/弱混合 |
操作系統 | Microsoft Windows, Mac OS X |
許可證 | 專有EULA |
網站 | learn |
啟發語言 | |
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,不等邏輯比較運算<>
參考文獻
外部連結
- 官方網站: