1,標(biāo)識(shí)符:是一種標(biāo)識(shí)變量、常量、過程、函數(shù)、類等語言構(gòu)成單位的符號(hào),利用它可以完成對(duì)變量、常量、過程、函數(shù)、類等的引用。命名規(guī)則如下: A, 字母打頭,由字母、數(shù)字和下劃線組成,如 A987b_23Abc B, 字符長(zhǎng)度小于40,(Excel2002以上中文版等,可以用漢字且長(zhǎng)度可達(dá)254個(gè)字符) C, 不能與VB保留字重名,如public, private, dim, goto, next, with, integer, single等
2,運(yùn)算符:是代表VB某種運(yùn)算功能的符號(hào)。
A, 賦值運(yùn)算符 =
B, 數(shù)學(xué)運(yùn)算符 &、+ (字符連接符)、+(加)、-(減)、Mod(取余)、\(整除)、*(乘)、/(除)、-(負(fù)號(hào))、^(指數(shù))
C, 邏輯運(yùn)算符Not(非)、And(與)、Or(或)、Xor(異或)、Eqv(相等)、Imp(隱含)
D, 關(guān)系運(yùn)算符 = (相同)、<>(不等)、>(大于)、<(小于)、>=(不小于)、<=(不大于)、Like、Is
E, 位運(yùn)算符 Not(邏輯非)、And(邏輯與)、Or(邏輯或)、Xor(邏輯異或)、Eqv(邏輯等)、Imp(隱含)
3,數(shù)據(jù)類型:VBA共有12種數(shù)據(jù)類型,具體見下表,此外用戶還可以根據(jù)以下類型用Type自定義數(shù)據(jù)類型。
數(shù)據(jù)類型 | 類型標(biāo)識(shí)符 | 字節(jié) |
字符串型 String | $ | 字符長(zhǎng)度(0-65400) |
字節(jié)型 Byte | 無 | 1 |
布爾型 Boolean | 無 | 2 |
整數(shù)型 Integer | % | 2 |
長(zhǎng)整數(shù)型 Long | & | 4 |
單精度型 Single | ! | 4 |
雙精度型 Double | # | 8 |
日期型 Date | 無 | 8 公元100/1/1-9999/12/31 |
貨幣型 Currency | @ | 8 |
小數(shù)點(diǎn)型 Decimal | 無 | 14 |
變體型 Variant | 無 | 以上任意類型,可變 |
對(duì)象型 Object | 無 | 4 |
4, 變量與常量:
1)VBA允許使用未定義的變量,默認(rèn)是變體變量Variant。
2)在模塊通用說明部份,加入 Option Explicit 語句可以強(qiáng)迫用戶進(jìn)行變量定義。
3)變量定義語句及變量作用域
Dim 變量 as 類型 '定義為局部變量,如 Dim xyz as integerPrivate 變量 as 類型 '定義為私有變量,如 Private xyz as bytePublic 變量 as 類型 '定義為公有變量,如 Public xyz as singleGlobal 變量 as 類型 '定義為全局變量,如 Globlal xyz as dateStatic 變量 as 類型 '定義為靜態(tài)變量,如 Static xyz as double
一般變量作用域的原則是,那部份定義就在那部份起作用,模塊中定義則在該模塊那作用。
4)常量為變量的一種特例,用Const定義,且定義時(shí)賦值,程序中不能改變值,作用域也如同變量作用域。如下定義:Const Pi=3.1415926 as single
5,數(shù)組:是包含相同數(shù)據(jù)類型的一組變量的集合,對(duì)數(shù)組中的單個(gè)變量引用通過數(shù)組索引下標(biāo)進(jìn)行。在內(nèi)存中表現(xiàn)為一個(gè)連續(xù)的內(nèi)存塊,必須用Global或Dim語句來定義。定義規(guī)則如下: Dim 數(shù)組名([lower to ]upper [, [lower to ]upper, ….]) as type ;Lower缺省值為0。二維數(shù)組是按行列排列,如XYZ(行,列)。
除了以上固定數(shù)組外,VBA還有一種功能強(qiáng)大的動(dòng)態(tài)數(shù)組,定義時(shí)無大小維數(shù)聲明;在程序中再利用Redim語句來重新改變數(shù)組大小,原來數(shù)組內(nèi)容可以通過加preserve關(guān)鍵字來保留。如下例: Dim array1() as double : Redim array1(5) : array1(3)=250 : Redim preserve array1(5,10)
6,注釋和賦值語句
1)注釋語句是用來說明程序中某些語句的功能和作用;VBA中有兩種方法標(biāo)識(shí)為注釋語句。
ü 單引號(hào) ’ ;如:’定義全局變量;可以位于別的語句之尾,也可單獨(dú)一行
ü Rem ;如:Rem定義全局變量;只能單獨(dú)一行
2)賦值語句是進(jìn)行對(duì)變量或?qū)ο髮傩再x值的語句,采用賦值號(hào) =,如X=123:Form1.caption=”我的窗口”。對(duì)對(duì)象的賦值采用:set myobject=object 或 myobject:=object
7,書寫規(guī)范:
1)VBA不區(qū)分標(biāo)識(shí)符的字母大小寫,一律認(rèn)為是小寫字母;
2)一行可以書寫多條語句,各語句之間以冒號(hào) : 分開;
3)一條語句可以多行書寫,以空格加下劃線 _ 來標(biāo)識(shí)下行為續(xù)行;
4)標(biāo)識(shí)符最好能簡(jiǎn)潔明了,不造成歧義。
8,判斷語句
1)If…Then…Else語句
If condition Then [statements][Else elsestatements]如1:If A>B And C<D Then A=B+2 Else A=C+2如2:If x>250 Then x=x-100或者,可以使用塊形式的語法:If condition Then[statements][ElseIf condition-n Then[elseifstatements] ...[Else[elsestatements]]End If如1:If Number < 10 ThenDigits = 1ElseIf Number < 100 ThenDigits = 2ElseDigits = 3End If
2)Select Case…Case…End Case語句
如1:Select Case PidCase “A101”Price=200Case “A102”Price=300……Case ElsePrice=900End Case
3)Choose 函數(shù): choose(index, choce-1,choice-2,…,choice-n),可以用來選擇自變量串列中的一個(gè)值,并將其返回,index 必要參數(shù),數(shù)值表達(dá)式或字段,它的運(yùn)算結(jié)果是一個(gè)數(shù)值,且界于 1 和可選擇的項(xiàng)目數(shù)之間。choice 必要參數(shù),Variant表達(dá)式,包含可選擇項(xiàng)目的其中之一。如: GetChoice = Choose(Ind, "Speedy", "United", "Federal")
4)Switch函數(shù): Switch(expr-1, value-1[, expr-2, value-2 _ [, expr-n,value-n]]) switch函數(shù)和Choose函數(shù)類似,但它是以兩個(gè)一組的方式返回所要的值,在串列中,最先為TRUE的值會(huì)被返回。 expr 必要參數(shù),要加以計(jì)算的 Variant 表達(dá)式。value 必要參數(shù)。如果相關(guān)的表達(dá)式為 True,則返回此部分的數(shù)值或表達(dá)式,沒有一個(gè)表達(dá)式為 True,Switch 會(huì)返回一個(gè) Null值。
9,循環(huán)語句
1)For Next語句 以指定次數(shù)來重復(fù)執(zhí)行一組語句
For counter = start To end [Step step] ' step 缺省值為1[statements][Exit For][statements]Next [counter]如1:For Words = 10 To 1 Step -1 ' 建立 10 次循環(huán)For Chars = 0 To 9 ' 建立 10 次循環(huán)MyString = MyString & Chars ' 將數(shù)字添加到字符串中Next Chars ' Increment counterMyString = MyString & " " ' 添加一個(gè)空格Next Words
2)For Each…Next語句:主要功能是對(duì)一個(gè)數(shù)組或集合對(duì)象進(jìn)行,讓所有元素重復(fù)執(zhí)行一次語句
For Each element In groupStatements[Exit for]StatementsNext [element]如1:For Each rang2 In range1With range2.interior.colorindex=6.pattern=xlSolidEnd withNext這上面一例中用到了 With…End With 語句,目的是省去對(duì)象多次調(diào)用,加快速度;語法為:With object[statements]End With
3)Do…loop語句 在條件為true時(shí),重復(fù)執(zhí)行區(qū)塊命令
Do {while |until} condition ' while 為當(dāng)型循環(huán),until為直到型循環(huán),顧名思義,不多說啦StatementsExit doStatementsLoop或者使用下面語法Do ' 先do 再判斷,即不論如何先干一次再說StatementsExit doStatementsLoop {while |until} condition
10,其他類語句和錯(cuò)誤語句處理
A, 其他循環(huán)語句:結(jié)構(gòu)化程序使用以上判斷和循環(huán)語句已經(jīng)足夠,建議不要輕易使用下面的語句,雖然VBA還支持。
1)Goto line 該語句為跳轉(zhuǎn)到line語句行
2)On expression gosub destinatioinlist 或者 on expression goto destinationlist 語句為根據(jù) exprssion表達(dá)式值來跳轉(zhuǎn)到所要的行號(hào)或行標(biāo)記
3)Gosub line…line…Return語句, Return 返回到 Gosub line行,如下例:
Sub gosubtry()Dim numNum=inputbox(“輸入一個(gè)數(shù)字,此值將會(huì)被判斷循環(huán)”)If num>0 then Gosub Routine1 :Debug.print num:Exit subRoutine1:Num=num/5ReturnEnd sub
4)while…wend語句,只要條件為TRUE,循環(huán)就執(zhí)行,這是以前VB老語法保留下來的,如下例: while condition 'while I<50 [statements] 'I=I+1 wend 'Wend
B, 錯(cuò)誤語句處理:執(zhí)行階段有時(shí)會(huì)有錯(cuò)誤的情況發(fā)生,利用On Error語句來處理錯(cuò)誤,啟動(dòng)一個(gè)錯(cuò)誤的處理程序。語法如下:
On Error Goto Line '當(dāng)錯(cuò)誤發(fā)生時(shí),會(huì)立刻轉(zhuǎn)移到line行去On Error Resume Next '當(dāng)錯(cuò)誤發(fā)生時(shí),會(huì)立刻轉(zhuǎn)移到發(fā)生錯(cuò)誤的下一行去On Erro Goto 0 '當(dāng)錯(cuò)誤發(fā)生時(shí),會(huì)立刻停止過程中任何錯(cuò)誤處理過程
11,過程和函數(shù):過程是構(gòu)成程序的一個(gè)模塊,往往用來完成一個(gè)相對(duì)獨(dú)立的功能。過程可以使程序更清晰、更具結(jié)構(gòu)性。VBA具有四種過程:Sub 過程、Function函數(shù)、Property屬性過程和Event事件過程。
A, Sub過程:Sub 過程的參數(shù)有兩種傳遞方式:按值傳遞(ByVal)和按地址傳遞(ByRef)。如下例: {{ Sub password (ByVal x as integer, ByRef y as integer) If y=100 then y=x+y else y=x-y x=x+100 End sub
Sub call_password () Dim x1 as integer Dim y1 as integer x1=12 y1=100 Call password (x1,y1) ‘調(diào)用過程方式:1. Call 過程名(參數(shù)1, 參數(shù)2…) ; 2. 過程名 參數(shù)1, 參數(shù)2… debug.print x1,y1 ‘結(jié)果是12、112,y1按地址傳遞改變了值,而x1按值傳遞,未改變?cè)?End sub }}
B, Function函數(shù):函數(shù)實(shí)際是實(shí)現(xiàn)一種映射,它通過一定的映射規(guī)則,完成運(yùn)算并返回結(jié)果。參數(shù)傳遞也兩種:按值傳遞(ByVal)和按地址傳遞(ByRef)。如下例:
Function password(ByVal x as integer, byref y as integer) as booleanIf y=100 then y=x+y else y=x-yx=x+100if y=150 then password=true else password=falseEnd FunctionSub call_password ()Dim x1 as integerDim y1 as integerx1=12y1=100if password then ‘調(diào)用函數(shù):1. 作為一個(gè)表達(dá)式放在=右端 ; 2. 作為參數(shù)使用debug.print x1end ifEnd sub
C, Property屬性過程和Event事件過程:這是VB在對(duì)象功能上添加的兩個(gè)過程,與對(duì)象特征密切相關(guān),也是VBA比較重要組成,技術(shù)比較復(fù)雜,可以參考相關(guān)書籍。
12,內(nèi)部函數(shù)在VBA程序語言中有許多內(nèi)置函數(shù),可以幫助程序代碼設(shè)計(jì)和減少代碼的編寫工作。
A.測(cè)試函數(shù)IsNumeric(x) ‘是否為數(shù)字, 返回Boolean結(jié)果,True or FalseIsDate(x) ‘是否是日期, 返回Boolean結(jié)果,True or FalseIsEmpty(x) ‘是否為Empty, 返回Boolean結(jié)果,True or FalseIsArray(x) ‘指出變量是否為一個(gè)數(shù)組。IsError(expression) ‘指出表達(dá)式是否為一個(gè)錯(cuò)誤值IsNull(expression) ‘指出表達(dá)式是否不包含任何有效數(shù)據(jù) (Null)。IsObject(identifier) ‘指出標(biāo)識(shí)符是否表示對(duì)象變量B.?dāng)?shù)學(xué)函數(shù)Sin(X)、Cos(X)、Tan(X)、Atan(x) 三角函數(shù),單位為弧度Log(x) 返回x的自然對(duì)數(shù)Exp(x)返回 exAbs(x) 返回絕對(duì)值Int(number)、Fix(number) 都返回參數(shù)的整數(shù)部分,區(qū)別:Int 將 -8.4 轉(zhuǎn)換成 -9,而 Fix 將-8.4 轉(zhuǎn)換成 -8Sgn(number) 返回一個(gè) Variant (Integer),指出參數(shù)的正負(fù)號(hào)Sqr(number) 返回一個(gè) Double,指定參數(shù)的平方根VarType(varname) 返回一個(gè) Integer,指出變量的子類型Rnd(x)返回0-1之間的單精度數(shù)據(jù),x為隨機(jī)種子C.字符串函數(shù)Trim(string) 去掉string左右兩端空白Ltrim(string) 去掉string左端空白R(shí)trim(string) 去掉string右端空白Len(string) 計(jì)算string長(zhǎng)度Left(string, x) 取string左段x個(gè)字符組成的字符串Right(string, x) 取string右段x個(gè)字符組成的字符串Mid(string, start,x) 取string從start位開始的x個(gè)字符組成的字符串Ucase(string) 轉(zhuǎn)換為大寫Lcase(string) 轉(zhuǎn)換為小寫Space(x) 返回x個(gè)空白的字符串Asc(string) 返回一個(gè) integer,代表字符串中首字母的字符代碼Chr(charcode) 返回 string,其中包含有與指定的字符代碼相關(guān)的字符D.轉(zhuǎn)換函數(shù)CBool(expression) 轉(zhuǎn)換為Boolean型CByte(expression) 轉(zhuǎn)換為Byte型CCur(expression) 轉(zhuǎn)換為Currency型CDate(expression) 轉(zhuǎn)換為Date型CDbl(expression) 轉(zhuǎn)換為Double型CDec(expression) 轉(zhuǎn)換為Decemal型CInt(expression) 轉(zhuǎn)換為Integer型CLng(expression) 轉(zhuǎn)換為L(zhǎng)ong型CSng(expression) 轉(zhuǎn)換為Single型CStr(expression) 轉(zhuǎn)換為String型CVar(expression) 轉(zhuǎn)換為Variant型Val(string) 轉(zhuǎn)換為數(shù)據(jù)型Str(number) 轉(zhuǎn)換為StringE.時(shí)間函數(shù)Now 返回一個(gè) Variant (Date),根據(jù)計(jì)算機(jī)系統(tǒng)設(shè)置的日期和時(shí)間來指定日期和時(shí)間。Date 返回包含系統(tǒng)日期的 Variant (Date)。Time 返回一個(gè)指明當(dāng)前系統(tǒng)時(shí)間的 Variant (Date)。Timer 返回一個(gè) Single,代表從午夜開始到現(xiàn)在經(jīng)過的秒數(shù)。TimeSerial(hour, minute, second) 返回一個(gè) Variant (Date),包含具有具體時(shí)、分、秒的時(shí)間。DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])返回 Variant (Long) 的值,表示兩個(gè)指定日期間的時(shí)間間隔數(shù)目Second(time) 返回一個(gè) Variant (Integer),其值為 0 到 59 之間的整數(shù),表示一分鐘之中的某個(gè)秒Minute(time) 返回一個(gè) Variant (Integer),其值為 0 到 59 之間的整數(shù),表示一小時(shí)中的某分鐘Hour(time) 返回一個(gè) Variant (Integer),其值為 0 到 23 之間的整數(shù),表示一天之中的某一鐘點(diǎn)Day(date) 返回一個(gè) Variant (Integer),其值為 1 到 31 之間的整數(shù),表示一個(gè)月中的某一日Month(date) 返回一個(gè) Variant (Integer),其值為 1 到 12 之間的整數(shù),表示一年中的某月Year(date) 返回 Variant (Integer),包含表示年份的整數(shù)。Weekday(date, [firstdayofweek]) 返回一個(gè) Variant (Integer),包含一個(gè)整數(shù),代表某個(gè)日期是星期幾
13, 文件操作
1)文件
Dir[(pathname[, attributes])] ;pathname 可選參數(shù),用來指定文件名的字符串表達(dá)式,可能包含目錄或文件夾、以及驅(qū)動(dòng)器。如果沒有找到 pathname,則會(huì)返回零長(zhǎng)度字符串 ("");
attributes 可選參數(shù)。常數(shù)或數(shù)值表達(dá)式,其總和用來指定文件屬性。如果省略,則會(huì)返回匹配 pathname 但不包含屬性的文件。
2)刪除
Kill pathname 從磁盤中刪除文件, pathname 參數(shù)是用來指定一個(gè)文件名
RmDir pathname 從磁盤中刪除刪除目錄,pathname 參數(shù)是用來指定一個(gè)文件夾
3)打開
Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] 能夠?qū)ξ募斎?輸出 (I/O)。
pathname 必要。字符串表達(dá)式,指定文件名,該文件名可能還包括目錄、文件夾及驅(qū)動(dòng)器。
mode 必要。關(guān)鍵字,指定文件方式,有 Append、Binary、Input、Output、或 Random 方式。如果未指定方式,則以 Random 訪問方式打開文件。
access 可選。關(guān)鍵字,說明打開的文件可以進(jìn)行的操作,有 Read、Write、或 Read Write 操作。
lock 可選。關(guān)鍵字,說明限定于其它進(jìn)程打開的文件的操作,有 Shared、Lock Read、Lock Write、和 Lock Read Write 操作。
filenumber 必要。一個(gè)有效的文件號(hào),范圍在 1 到 511 之間。使用 FreeFile 函數(shù)可得到下一個(gè)可用的文件號(hào)。 reclength 可選。小于或等于 32,767(字節(jié))的一個(gè)數(shù)。對(duì)于用隨機(jī)訪問方式打開的文件,該值就是記錄長(zhǎng)度。對(duì)于順序文件,該值就是緩沖字符數(shù)。說明 對(duì)文件做任何 I/O 操作之前都必須先打開文件。Open 語句分配一個(gè)緩沖區(qū)供文件進(jìn)行 I/O 之用,并決定緩沖區(qū)所使用的訪問方式。如果 pathname 指定的文件不存在,那么,在用 Append、Binary、Output、或 Random 方式打開文件時(shí),可以建立這一文件。如果文件已由其它進(jìn)程打開,而且不允許指定的訪問類型,則 Open 操作失敗,而且會(huì)有錯(cuò)誤發(fā)生。如果 mode 是 Binary 方式,則 Len 子句會(huì)被忽略掉。
重要 在 Binary、Input 和 Random 方式下可以用不同的文件號(hào)打開同一文件,而不必先將該文件關(guān)閉。在 Append 和 Output 方式下,如果要用不同的文件號(hào)打開同一文件,則必須在打開文件之前先關(guān)閉該文件。
4)讀入
Input #filenumber, varlist 從已打開的順序文件中讀出數(shù)據(jù)并將數(shù)據(jù)指定給變量
Get [#]filenumber, [recnumber], varname將一個(gè)已打開的磁盤文件讀入一個(gè)變量之中。
5)寫入
Write #filenumber, [outputlist] 將數(shù)據(jù)寫入順序文件
Print #filenumber, [outputlist] 將格式化顯示的數(shù)據(jù)寫入順序文件中
Put [#]filenumber, [recnumber], varname 將一個(gè)變量的數(shù)據(jù)寫入磁盤文件中。
6)關(guān)閉 Close [filenumberlist] 關(guān)閉 Open 語句所打開的輸入/輸出 (I/O) 文件
注意 如果今后想用 Input # 語句讀出文件的數(shù)據(jù),就要用 Write # 語句而不用 Print # 語句將數(shù)據(jù)寫入文件。因?yàn)樵谑褂?Write # 時(shí),將數(shù)據(jù)域分界就可確保每個(gè)數(shù)據(jù)域的完整性,因此可用 Input # 再將數(shù)據(jù)讀出來。使用 Write # 還能確保任何地區(qū)的數(shù)據(jù)都被正確讀出。Write 與 Print # 語句不同,當(dāng)要將數(shù)據(jù)寫入文件時(shí),Write # 語句會(huì)在項(xiàng)目和用來標(biāo)記字符串的引號(hào)之間插入逗號(hào)。Write # 語句在將 outputlist 中的最后一個(gè)字符寫入文件后會(huì)插入一個(gè)新行字符,即回車換行符,(Chr(13) + Chr(10))。
7)其他文件函數(shù) LOF(filenumber) 返回一個(gè) Long,表示用 Open 語句打開的文件的大小,該大小以字節(jié)為單位。
EOF(filenumber) 返回一個(gè) Integer,它包含 Boolean 值 True,表明已經(jīng)到達(dá)為 Random 或順序 Input 打開的文件的結(jié)尾。
Loc(filenumber) 返回一個(gè) Long,在已打開的文件中指定當(dāng)前讀/寫位置
Seek(filenumber) 返回一個(gè) Long,在 Open 語句打開的文件中指定當(dāng)前的讀/寫位置
聯(lián)系客服