VBA語言的基礎認識

2024-07-30 11:49 更新

第一節(jié):標識符

一、定義

標識符是一種標識變量、常量、過程、函數(shù)、類等語言構成單位的符號,利用它可以完成對變量、常量、過程、函數(shù)、類等引用。

二、命名規(guī)則

(1)字母打頭,由字母、數(shù)字和下劃線組成,如?A987b_23Abc?

(2)字符長度小于40,(Excel2002以上中文版本等,可以用漢字且長度可達254個字符)

(3)不能與VB保留字重名,如?public?,?private?,?dim?,?goto?,?next?,?with?,?integer?,?single?等

第二節(jié):運算符

定義:運算符是代表VB某種運算功能的符號。
(1)賦值運算符 ?=?
(2)數(shù)學運算符 ?&?(強制字符連接)、?+? (運算符兩邊都是字符時連接字符)、?+?(運算符兩邊都是數(shù)字時為加法運算符)、?-?(減)、?Mod?(取余)、?\?(整除)、?*?(乘)、?/?(除)、?-?(負號)、?^?(指數(shù))
(3)邏輯運算符?Not?(非)、?And?(與)、?Or?(或)、?Xor?(異或)、?Eqv?(相等)、?Imp?(隱含)
(4)關系運算符 ?= ?(相同)、?<>?(不等)、?>?(大于)、?<?(小于)、?>=?(不小于)、?<=?(不大于)、?Like?(判斷給定的字符串是否與指定的模式相匹配)、?Is?(判斷該數(shù)據(jù)是數(shù)字還是是字符)
(5)位運算符  ?Not?(邏輯非)、?And?(邏輯與)、?Or?(邏輯或)、?Xor?(邏輯異或)、?Eqv?(邏輯等)、?Imp?(蘊含)

第三節(jié):數(shù)據(jù)類型

VBA共有12種數(shù)據(jù)類型,具體見下表,此外用戶還可以根據(jù)以下類型用Type自定義數(shù)據(jù)類型。

 數(shù)據(jù)類型
類型標識符  字節(jié) 
 字符串型 String 字符長度(0-65400) 
 字節(jié)型 Byte 無 
 布爾型 Boolean 無 
 整數(shù)型 Integer
 長整數(shù)型 Long
 單精度型 Single ! 
 雙精度型 Double
 日期型 Date 無  8 (范圍為公元100/1/1-99/12/31) 
 貨幣型 Currency
 小數(shù)點型 Decimal 無  14 
 變體型 Variant 無  以上任意類型,可變 
 對象型 Object 無 

第四節(jié):變量與常量

(1)VBA允許使用未定義的變量,默認是變體變量
(2)在模塊通用說明部分,加入Option Explicit語句可以強迫用戶進行變量定義

(3)變量定義語句及變量作用域


dim
一般變量作用域的原則是,在哪部分定義就在哪部分起作用,模塊中定義則在該模塊起作用。
(4)常量為變量的一種特例,用Const定義,且定義時賦值,程序中不能改變值,作用域也如同變量作用域。如下定義:Const Pi=3.1415926 as single

第五節(jié):數(shù)組

數(shù)組是包含相同數(shù)據(jù)類型的一組變量的集合,對數(shù)組中的單個變量引用通過數(shù)組索引下標進行。在內存中表現(xiàn)為一個連續(xù)的內存塊,必須用Global或Dim語句來定義。定義規(guī)則如下:
?Dim 數(shù)組名([lower to ]upper [, [lower to ]upper, ….]) as type ;?Lower缺省值為0。二維數(shù)組是按行列排列,如XYZ(行,列)。
除了以上固定數(shù)組外,VBA 還有一種功能強大的動態(tài)數(shù)組,定義時無大小維數(shù)聲明;在程序中再利用Redim語句來重新改變數(shù)組大小,原來數(shù)組內容可以通過加preserve關鍵字來保留。
如下例:
?Dim array1() as double : Redim array1(5) : array1(3)=250 : Redim preserve array1(5,10)?

第六節(jié):注釋和賦值語句

(1)注釋語句是用來說明程序中某些語句的功能和作用;VBA中有兩種方法標識為注釋語句。
√單引號 ’  ;如:’定義全局變量;可以位于別的語句之尾,也可單獨一行
√Rem ;如:Rem定義全局變量;只能單獨一行
(2)賦值語句是進行對變量或對象屬性賦值的語句,采用賦值號 =,如X=123:Form1.caption=”
我的窗口”
對對象的賦值采用:set myobject=object 或  myobject:=object

第七節(jié):書寫規(guī)范

(1)VBA不區(qū)分標識符的字母大小寫,一律認為是小寫字母;
(2)一行可以書寫多條語句,各語句之間以冒號 :  分開;
(3)一條語句可以多行書寫,以空格加下劃線 _  來標識下行為續(xù)行;
(4)標識符最好能簡潔明了,不造成歧義。

第八節(jié):判斷語句

(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] ...
    [Els]
        [elsestatements]]
End If
如1:
If Number < 10  Then
     Digits = 1
ElseIf Number < 100  Then
     Digits = 2
Else
     Digits = 3
End If
(2)Select Case…Case…End Case語句
如1:
Select Case  Pid
   Case  “A101”
   Price=200
   Case  “A102”
   Price=300
   ……
   Case Else
   Price=900
End Select

(3)Choose 函數(shù)
?choose(index, choice-1,choice-2,…,choice-n)?

可以用來選擇自變量串列中的一個值,并將其返回,index 必要參數(shù),數(shù)值表達式或字段,它的運算結果是一個數(shù)值,且界于 1 和可選擇的項目數(shù)之間。choice 必要參數(shù),Variant表達式,包含可選擇項目的其中之一。如:?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ù)類似,但它是以兩個一組的方式返回所要的值,在串列中,最先為
TRUE 的值會被返回。 expr 必要參數(shù),要加以計算的 Variant 表達式。value 必要參數(shù)。如果相關的表達式為 True,則返回此部分的數(shù)值或表達式,沒有一個表達式為 True,Switch 會返回一個 Null值。

第九節(jié):循環(huán)語句

(1)For Next語句  以指定次數(shù)來重復執(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 counter
      MyString = MyString & " "                                '添加一個空格
Next  Words
(2)For Each…Next 語句  主要功能是對一個數(shù)組或集合對象進行,讓所有元素重復執(zhí)行一次語句
For Each element In  group
Statements
[Exit for]
Statements
Next  [element]
如1:
For Each rang2 In  range1
     With range2.interior
             .colorindex=6
             .pattern=xlSolid
     End with
Next
這上面一例中用到了 With…End With  語句,目的是省去對象多次調用,加快速度;
語法為:
With object
[statements]
End With
(3)Do…loop語句 在條件為true時,重復執(zhí)行區(qū)塊命令
Do {while |until} condition' while 為當型循環(huán),until為直到型循環(huán),顧名思義,不多說啦
Statements
Exit do
Statements
Loop
或者使用下面語法:
Do                                    ' 先do 再判斷,即不論如何先干一次再說
Statements
Exit do
Statements
Loop {while |until} condition

第十節(jié) 其他類語句和錯誤語句處理

一.其他循環(huán)語句
結構化程序使用以上判斷和循環(huán)語句已經(jīng)足夠,建議不要輕易使用下面的語句,雖然 VBA 還支持。
(1)Goto line 該語句為跳轉到line語句行
(2) On expression gosub destinatioinlist 或者 on expression goto destinationlist 語句為根據(jù) exprssion表達式值來跳轉到所要的行號或行標記
(3)Gosub line…line…Return語句,  Return 返回到 Gosub line行,如下例:
Sub gosubtry()
      Dim num
      Num=inputbox(“輸入一個數(shù)字,此值將會被判斷循環(huán)”)
      If num>0 then Gosub Routine1 :Debug.print num:Exit  sub
      Routine1:
      Num=num/5
      Return
End sub
(4)while…wend語句,只要條件為TRUE,循環(huán)就執(zhí)行,這是以前VB老語法保留下來的,如下
例:
while condition      ‘while I<50
[statements]        ‘I=I+1
wend                  ‘Wend
二.錯誤語句處理
執(zhí)行階段有時會有錯誤的情況發(fā)生,利用OnError語句來處理錯誤,啟動一個錯誤的處理程序。
語法如下:
On Error Goto Line        ‘當錯誤發(fā)生時,會立刻轉移到line行去
On Error Resume Next    ‘當錯誤發(fā)生時,會立刻轉移到發(fā)生錯誤的下一行去
On Erro Goto 0             ‘當錯誤發(fā)生時,會立刻停止過程中任何錯誤處理過程

第十一節(jié) 過程和函數(shù)

過程是構成程序的一個模塊,往往用來完成一個相對獨立的功能。過程可以使程序更清晰、更具結構性。VBA具有四種過程:Sub 過程、Function函數(shù)、Property屬性過程和Event事件過程。
一.Sub過程
Sub 過程的參數(shù)有兩種傳遞方式:按值傳遞(ByVal)和按地址傳遞(ByRef)。如下例:
Sub password(x As Integer, ByRef y As Integer)
    If y = 100 Then
        y = x + y
    Else
        y = x - y
    End If
    x = x + 100
End Sub

Sub call_password()
    Dim x1 As Integer
    Dim y1 As Integer
    x1 = 12
    y1 = 100
    Call password(x1, y1) ' 或直接寫成 password x1, y1
    Debug.Print x1, y1 ' 結果應該是112、212,因為x1是按值傳遞,y1是按引用傳遞
End Sub
二.Function函數(shù)
函數(shù)實際是實現(xiàn)一種映射,它通過一定的映射規(guī)則,完成運算并返回結果。參數(shù)傳遞也兩種:按值傳遞(ByVal)和按地址傳遞(ByRef)。如下例:
Function password(ByVal x As Integer, ByRef y As Integer) As Boolean
    If y = 100 Then
        y = x + y
    Else
        y = x - y
    End If
    x = x + 100
    If y = 150 Then
        password = True
    Else
        password = False
    End If
End Function

Sub call_password()
    Dim x1 As Integer
    Dim y1 As Integer
    x1 = 12
    y1 = 100
    If password(x1, y1) Then
        Debug.Print x1
    End If
End Sub
三.Property屬性過程和Event事件過程
這是VB在對象功能上添加的兩個過程,與對象特征密切相關,也是VBA比較重要組成,技術比較復雜,可以參考相關書籍。

第十二節(jié)內部函數(shù)

在VBA程序語言中有許多內置函數(shù),可以幫助程序代碼設計和減少代碼的編寫工作。

一.測試函數(shù)

IsNumeric(x)          ‘是否為數(shù)字,  返回Boolean結果,True  or False      
IsDate(x)              ‘是否是日期,  返回Boolean結果,True  or False
IsEmpty(x)         ‘是否為Empty, 返回Boolean結果,True  or False
IsArray(x)             ‘指出變量是否為一個數(shù)組。
IsError(expression)  ‘指出表達式是否為一個錯誤值
IsNull(expression)    ‘指出表達式是否不包含任何有效數(shù)據(jù) (Null)。
IsObject(identifier)  ‘指出標識符是否表示對象變量
二.數(shù)學函數(shù)
Sin(X)、Cos(X)、Tan(X)、Atan(x)  三角函數(shù),單位為弧度
Log(x) 返回x的自然對數(shù)
Exp(x)返回 
Abs(x) 返回絕對值
Int(number)、Fix(number) 都返回參數(shù)的整數(shù)部分,區(qū)別:Int 將 -8.4 轉換成 -9,而 Fix 將
-8.4 轉換成 -8
Sgn(number) 返回一個 Variant (Integer),指出參數(shù)的正負號
Sqr(number) 返回一個 Double,指定參數(shù)的平方根
VarType(varname) 返回一個 Integer,指出變量的子類型
Rnd(x)返回0-1之間的單精度數(shù)據(jù),x為隨機種子
三.字符串函數(shù)
Trim(string)                       去掉string左右兩端空白
Ltrim(string)                      去掉string左端空白
Rtrim(string)                      去掉string右端空白
Len(string)                        計算string長度
Left(string, x)                    取string左段x個字符組成的字符串
Right(string, x)                   取string右段x個字符組成的字符串
Mid(string, start,x)              取string從start位開始的x個字符組成的字符串
Ucase(string)                     轉換為大寫
Lcase(string)                      轉換為小寫
Space(x)                           返回x個空白的字符串
Asc(string)                         返回一個 integer,代表字符串中首字母的字符代碼
Chr(charcode)                     返回 string,其中包含有與指定的字符代碼相關的字符
四.轉換函數(shù)
CBool(expression)                   轉換為Boolean型
CByte(expression)                  轉換為Byte型
CCur(expression)                    轉換為Currency型
CDate(expression)                  轉換為Date型
CDbl(expression)                    轉換為Double型
CDec(expression)                   轉換為Decemal型
CInt(expression)                    轉換為Integer型
CLng(expression)                   轉換為Long型
CSng(expression)                   轉換為Single型
CStr(expression)                    轉換為String型
CVar(expression)                    轉換為Variant型
Val(string)                             轉換為數(shù)據(jù)型
Str(number)                           轉換為String
五.時間函數(shù)
Now            返回一個 Variant (Date),根據(jù)計算機系統(tǒng)設置的日期和時間來指定日期和時間。
Date           返回包含系統(tǒng)日期的 Variant (Date)。
Time           返回一個指明當前系統(tǒng)時間的 Variant (Date)。
Timer          返回一個 Single,代表從午夜開始到現(xiàn)在經(jīng)過的秒數(shù)。
TimeSerial(hour, minute, second) 返回一個 Variant (Date),包含具有具體時、分、秒的時間。
DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]]) 返回 Variant(Long) 的值,表示兩個指定日期間的時間間隔數(shù)目
Second(time) 返回一個 Variant (Integer),其值為 0 到 59 之間的整數(shù),表示一分鐘之中的某個秒
Minute(time) 返回一個 Variant (Integer),其值為 0 到 59 之間的整數(shù),表示一小時中的某分鐘
Hour(time)  返回一個 Variant(Integer),其值為 0 到 23 之間的整數(shù),表示一天之中的某一鐘點
Day(date)   返回一個 Variant(Integer),其值為 1 到 31 之間的整數(shù),表示一個月中的某一日
Month(date) 返回一個 Variant(Integer),其值為 1 到 12 之間的整數(shù),表示一年中的某月
Year(date)  返回 Variant (Integer),包含表示年份的整數(shù)。
Weekday(date, [firstdayofweek]) 返回一個 Variant (Integer),包含一個整數(shù),代表某個日期是星期幾

第十三節(jié) 文件操作

文件
Dir[(pathname[,attributes])] ;pathname 可選參數(shù),用來指定文件名的字符串表達式,可能包含目錄或文件夾、以及驅動器。如果沒有找到  pathname,則會返回零長度字符串 ("");
attributes 可選參數(shù)。常數(shù)或數(shù)值表達式,其總和用來指定文件屬性。如果省略,則會返回匹配 pathname 但不包含屬性的文件。

刪除
Kill pathname   從磁盤中刪除文件, pathname 參數(shù)是用來指定一個文件名

RmDir pathname  從磁盤中刪除目錄,pathname 參數(shù)是用來指定一個文件夾

打開

Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] 能夠對文件輸入/輸出 (I/O)。
pathname 必要。字符串表達式,指定文件名,該文件名可能還包括目錄、文件夾及驅動器。
mode 必要。關鍵字,指定文件方式,有 Append、Binary、Input、Output、或 Random 方式。如果未指定方式,則以 Random 訪問方式打開文件。
access 可選。關鍵字,說明打開的文件可以進行的操作,有 Read、Write、或 ReadWrite 操作。
lock 可選。關鍵字,說明限定于其它進程打開的文件的操作,有 Shared、LockRead、LockWrite、和 Lock Read Write 操作。

filenumber 必要。一個有效的文件號,范圍在 1 到 511 之間。使用 FreeFile 函數(shù)可得到下一個可用的文件號。 reclength 可選。小于或等于 32,767(字節(jié))的一個數(shù)。對于用隨機訪問方式打開的文件,該值就是記錄長度。對于順序文件,該值就是緩沖字符數(shù)。


說明 對文件做任何 I/O 操作之前都必須先打開文件。Open  語句分配一個緩沖區(qū)供文件進行I/O 之用,并決定緩沖區(qū)所使用的訪問方式。如果 pathname 指定的文件不存在,那么,在用Append、Binary、Output、或 Random 方式打開文件時,可以建立這一文件。如果文件已由其它進程打開,而且不允許指定的訪問類型,則 Open 操作失敗,而且會有錯誤發(fā)生。如果 mode是 Binary 方式,則 Len 子句會被忽略掉。

重要 在 Binary、Input 和 Random 方式下可以用不同的文件號打開同一文件,而不必先將該文件關閉。在 Append 和 Output 方式下,如果要用不同的文件號打開同一文件,則必須在打開文件之前先關閉該文件。

讀入
Input #filenumber, varlist 從已打開的順序文件中讀出數(shù)據(jù)并將數(shù)據(jù)指定給變量
Get [#]filenumber, [recnumber], varname將一個已打開的磁盤文件讀入一個變量之中。

寫入
Write #filenumber, [outputlist] 將數(shù)據(jù)寫入順序文件
Print #filenumber, [outputlist] 將格式化顯示的數(shù)據(jù)寫入順序文件中
Put [#]filenumber, [recnumber], varname 將一個變量的數(shù)據(jù)寫入磁盤文件中。


關閉
Close [filenumberlist] 關閉 Open 語句所打開的輸入/輸出 (I/O) 文件
注意 如果今后想用 Input # 語句讀出文件的數(shù)據(jù),就要用 Write # 語句而不用 Print # 語句將數(shù)據(jù)寫入文件。因為在使用 Write# 時,將數(shù)據(jù)域分界就可確保每個數(shù)據(jù)域的完整性,因此可用 Input# 再將數(shù)據(jù)讀出來。使用 Write#  還能確保任何地區(qū)的數(shù)據(jù)都被正確讀出。Write與 Print # 語句不同,當要將數(shù)據(jù)寫入文件時,Write # 語句會在項目和用來標記字符串的引號之間插入逗號。Write # 語句在將 outputlist 中的最后一個字符寫入文件后會插入一個新行字符,即回車換行符,(Chr(13) + Chr(10))。


其他文件函數(shù)
LOF(filenumber)  返回一個 Long,表示用 Open 語句打開的文件的大小,該大小以字節(jié)為單
位。

EOF(filenumber)  返回一個 Integer,它包含 Boolean 值 True,表明已經(jīng)到達為 Random 或
順序 Input 打開的文件的結尾。

Loc(filenumber)   返回一個 Long,在已打開的文件中指定當前讀/寫位置

Seek(filenumber)  返回一個 Long,在 Open 語句打開的文件中指定當前的讀/寫位

 


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號