Visual Basic for Applications
編程範型 | Multi-paradigm編程語言 |
---|---|
實作者 | Microsoft |
釋出時間 | 1993年 |
當前版本 | 7.1(Microsoft Office 2021) |
型態系統 | 靜態/動態混合,強/弱混合 |
作業系統 | Microsoft Windows, Mac OS X |
許可證 | 專有EULA |
網站 | learn |
啟發語言 | |
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,不等邏輯比較運算<>
參考文獻
[編輯]外部連結
[編輯]- 官方網站: