【轉】VBA 入門 (一)

來源:互聯網
上載者:User

標籤:個數   ace   div   磁碟   判斷   預設   until   精度   read   

VBA語言的基礎認識由 vietdung90 建立,最後一次修改 2016-10-18 【轉自W3CSCHOOL】第一節:標識符

一、定義

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

 

二、命名規則

(1)字母打頭,由字母、數字和底線組成,如A987b_23Abc

 

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

 

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

 

第二節:運算子定義:運算子是代表VB某種運算功能的符號。 (1)賦值運算子  = (2)數學運算子 &、+ (字元串連符)、+(加)、-(減)、Mod(取餘)、\(整除)、*(乘)、/
(除)、-(負號)、^(指數) (3)邏輯運算子Not(非)、And(與)、Or(或)、Xor(異或)、Eqv(相等)、Imp(隱含)
(4)關係運算子 = (相同)、<>(不等)、>(大於)、<(小於)、>=(不小於)、<=(不大於)、
Like、Is (5)位元運算符  Not(邏輯非)、And(邏輯與)、Or(邏輯或)、Xor(邏輯異或)、Eqv(邏輯
等)、Imp(隱含)

第三節:資料類型VBA共有12種資料類型,具體見下表,此外使用者還可以根據以下類型用Type自訂資料類型。 第四節:變數與常量(1)VBA允許使用未定義的變數,預設是變體變數 (2)在模組通用說明部分,加入Option Explicit語句可以強迫使用者進行變數定義 (3)變數定義語句及變數範圍一般變數範圍的原則是,那部分定義就在那部分起作用,模組中定義則在該模組那作用。 (4)常量為變數的一種特例,用Const定義,且定義時賦值,程式中不能改變值,範圍也如同變數範圍。如下定義:Const Pi=3.1415926 as single 第五節:數組數組是包含相同資料類型的一組變數的集合,對數組中的單個變數引用通過數組索引下標進行。在記憶體中表現為一個連續的記憶體塊,必須用Global或Dim語句來定義。定義規則如下:
Dim 數組名([lower to ]upper [, [lower to ]upper, ….]) as type ;Lower預設值為0。二
維數組是按行列排列,如XYZ(行,列)。
除了以上固定數組外,VBA 還有一種功能強大的動態數組,定義時無大小維數聲明;在程式中再利用Redim語句來重新改變數組大小,原來數組內容可以通過加preserve關鍵字來保留。
如下例:
Dim array1() as double : Redim array1(5) : array1(3)=250 : Redim preserve array1(5,10) 第六節:注釋和指派陳述式(1)備註陳述式是用來說明程式中某些語句的功能和作用;VBA中有兩種方法標識為備註陳述式。
√單引號 ’  ;如:’定義全域變數;可以位於別的語句之尾,也可單獨一行
√Rem ;如:Rem定義全域變數;只能單獨一行
(2)指派陳述式是進行對變數或對象屬性賦值的語句,採用賦值號 =,如X=123:Form1.caption=”
我的視窗”
對對象的賦值採用:set myobject=object 或  myobject:=object 第七節:書寫規範(1)VBA不區分標識符的字母大小寫,一律認為是小寫字母;
(2)一行可以書寫多條語句,各語句之間以冒號 :  分開;
(3)一條語句可以多行書寫,以空格加底線 _  來標識下行為續行;
(4)標識符最好能簡潔明了,不造成歧義。 第八節:判斷語句 (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  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 Case
(3)Choose 函數
choose(index, choce-1,choice-2,…,choice-n),可以用來選擇自變數串列中的一個值,並將其返回,index 必要參數,數值運算式或欄位,它的運算結果是一個數值,且界於 1 和可選擇的項目數之間。choice 必要參數,Variant運算式,包含可選擇項目的其中之一。如:GetChoice = Choose(Ind, "Speedy", "United", "Federal")

(4)Switch函數
Switch(expr-1, value-1[, expr-2, value-2 _ [, expr-n,value-n]])switch 函數和 Choose 函數類似,但它是以兩個一組的方式返回所要的值,在串列中,最先為
TRUE 的值會被返回。 expr 必要參數,要加以計算的 Variant 運算式。value 必要參數。如果相關的運算式為 True,則返回此部分的數值或運算式,沒有一個運算式為 True,Switch 會返回一個 Null值。 第九節:迴圈語句(1)For Next語句  以指定次數來重複執行一組語句
For counter = start To end [Step step]                  'step 預設值為1
[statements]
[Exit For]
[statements]
Next [counter]

如1:For Words = 10 To 1 Step  -1                               '建立 10 次迴圈 
      For Chars = 0 To 9                                        '建立 10 次迴圈
           MyString = MyString & Chars                      '將數字添加到字串中
      Next Chars                                                   'Increment counter       MyString = MyString & " "                                '添加一個空格
Next  Words (2)For Each…Next 語句  主要功能是對一個數組或集合對象進行,讓所有元素重複執行一次語句

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時,重複執行區塊命令
Do {while |until} condition‘ while 為當型迴圈,until為直到型迴圈,顧名思義,不多說啦
Statements
Exit do
Statements
Loop
或者使用下面文法:
Do                                    ‘ 先do 再判斷,即不論如何先幹一次再說
Statements
Exit do
Statements
Loop {while |until} condition 第十節 其他類語句和錯誤語句處理 一.其他迴圈語句
結構化程式使用以上判斷和迴圈語句已經足夠,建議不要輕易使用下面的語句,雖然 VBA 還支援。
(1)Goto line 該語句為跳轉到line語句行
(2) On expression gosub destinatioinlist 或者 on expression goto destinationlist 語句為根據 exprssion運算式值來跳轉到所要的行號或行標記
(3)Gosub line…line…Return語句,  Return 返回到 Gosub line行,如下例:
Sub gosubtry()
      Dim num
      Num=inputbox(“輸入一個數字,此值將會被判斷迴圈”)
      If num>0 then Gosub Routine1 :Debug.print num:Exit  sub
      Routine1:
      Num=num/5
      Return
End sub
(4)while…wend語句,只要條件為TRUE,迴圈就執行,這是以前VB老文法保留下來的,如下

例:
while condition      ‘while I<50
[statements]        ‘I=I+1
wend                  ‘Wend

二.錯誤語句處理
執行階段有時會有錯誤的情況發生,利用OnError語句來處理錯誤,啟動一個錯誤的處理常式。
文法如下:
On Error Goto Line        ‘當錯誤發生時,會立刻轉移到line行去
On Error Resume Next    ‘當錯誤發生時,會立刻轉移到發生錯誤的下一行去
On Erro Goto 0             ‘當錯誤發生時,會立刻停止過程中任何錯誤處理過程

第十一節 過程和函數過程是構成程式的一個模組,往往用來完成一個相對獨立的功能。過程可以使程式更清晰、更具結構性。VBA具有四種過程:子程序、Function函數、Property屬性過程和Event事件程序。

一.Sub過程
子程序的參數有兩種傳遞方式:按值傳遞(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
      Callpassword(x1,y1)     ‘調用過程方式:1.Call   過程名(參數1,  參數2…);2.  過程名 參數1, 參數2…
      debug.print x1,y1         ‘結果是12、112,y1按地址傳遞改變了值,而x1按值傳遞,未改變原值
End sub
二.Function函數
函數實際是實現一種映射,它通過一定的映射規則,完成運算並返回結果。參數傳遞也兩種:按值傳遞(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
       x=x+100
       if y=150 then password=true else password=false
End Function
Sub call_password ()
      Dim x1 as integer
      Dim y1 as integer
      x1=12
      y1=100
      if password then ‘調用函數:1. 作為一個運算式放在=右端 ; 2. 作為參數使用
      debug.print x1
      end if
End sub
三.Property屬性過程和Event事件程序
這是VB在對象功能上添加的兩個過程,與對象特徵密切相關,也是VBA比較重要組成,技術比較複雜,可以參考相關書籍。 第十二節內建函式在VBA程式語言中有許多內建函數,可以協助程式代碼設計和減少代碼的編寫工作。
一.測試函數
IsNumeric(x)          ‘是否為數字,  返回Boolean結果,True  or False      
IsDate(x)              ‘是否是日期,  返回Boolean結果,True  or False
IsEmpty(x)         ‘是否為Empty, 返回Boolean結果,True  or False
IsArray(x)             ‘指出變數是否為一個數組。
IsError(expression)  ‘指出運算式是否為一個錯誤值
IsNull(expression)    ‘指出運算式是否不包含任何有效資料 (Null)。
IsObject(identifier)  ‘指出標識符是否表示物件變數
二.數學函數
Sin(X)、Cos(X)、Tan(X)、Atan(x)  三角函數,單位為弧度
Log(x) 返回x的自然對數
Exp(x)返回 
Abs(x) 返回絕對值
Int(number)、Fix(number) 都返回參數的整數部分,區別:Int 將 -8.4 轉換成 -9,而 Fix 將
-8.4 轉換成 -8
Sgn(number) 返回一個 Variant (Integer),指出參數的加號或減號
Sqr(number) 返回一個 Double,指定參數的平方根
VarType(varname) 返回一個 Integer,指出變數的子類型
Rnd(x)返回0-1之間的單精確度資料,x為隨機種子
三.字串函數
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,其中包含有與指定的字元代碼相關的字元

四.轉換函式
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)                             轉換為資料型
Str(number)                           轉換為String

五.時間函數
Now            返回一個 Variant (Date),根據電腦系統設定的日期和時間來指定日期和時間。
Date           返回包含系統日期的 Variant (Date)。
Time           返回一個指明當前系統時間的 Variant (Date)。
Timer          返回一個 Single,代表從午夜開始到現在經過的秒數。
TimeSerial(hour, minute, second) 返回一個 Variant (Date),包含具有具體時、分、秒的時間。
DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]]) 返回 Variant(Long) 的值,表示兩個指定日期間的時間間隔數目
Second(time) 返回一個 Variant (Integer),其值為 0 到 59 之間的整數,表示一分鐘之中的某個秒
Minute(time) 返回一個 Variant (Integer),其值為 0 到 59 之間的整數,表示一小時中的某分鐘
Hour(time)  返回一個 Variant(Integer),其值為 0 到 23 之間的整數,表示一天之中的某一鐘點
Day(date)   返回一個 Variant(Integer),其值為 1 到 31 之間的整數,表示一個月中的某一日
Month(date) 返回一個 Variant(Integer),其值為 1 到 12 之間的整數,表示一年中的某月
Year(date)  返回 Variant (Integer),包含表示年份的整數。
Weekday(date, [firstdayofweek]) 返回一個 Variant (Integer),包含一個整數,代表某個日期是星期幾

第十三節 檔案操作檔案
Dir[(pathname[,attributes])] ;pathname 選擇性參數,用來指定檔案名稱的字串運算式,可能包含目錄或檔案夾、以及磁碟機。如果沒有找到  pathname,則會返回零長度字串 ("");

attributes 選擇性參數。常數或數值運算式,其總和用來指定檔案屬性。如果省略,則會返回匹配 pathname 但不包含屬性的檔案。

刪除
Kill pathname   從磁碟中刪除檔案, pathname 參數是用來指定一個檔案名稱

RmDir pathname  從磁碟中刪除目錄,pathname 參數是用來指定一個檔案夾
開啟

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 函數可得到下一個可用的檔案號。 reclength 可選。小於或等於 32,767(位元組)的一個數。對於用隨機訪問方式開啟的檔案,該值就是記錄長度。對於循序檔,該值就是緩衝字元數。
說明 對檔案做任何 I/O 操作之前都必須先開啟檔案。Open  語句分配一個緩衝區供檔案進行I/O 之用,並決定緩衝區所使用的訪問方式。如果 pathname 指定的檔案不存在,那麼,在用Append、Binary、Output、或 Random 方式開啟檔案時,可以建立這一檔案。如果檔案已由其它進程開啟,而且不允許指定的訪問類型,則 Open 操作失敗,而且會有錯誤發生。如果 mode是 Binary 方式,則 Len 子句會被忽略掉。
重要 在 Binary、Input 和 Random 方式下可以用不同的檔案號開啟同一檔案,而不必先將該檔案關閉。在 Append 和 Output 方式下,如果要用不同的檔案號開啟同一檔案,則必須在開啟檔案之前先關閉該檔案。

讀入
Input #filenumber, varlist 從已開啟的循序檔中讀出資料並將資料指定給變數
Get [#]filenumber, [recnumber], varname將一個已開啟的磁碟檔案讀入一個變數之中。

寫入
Write #filenumber, [outputlist] 將資料寫入循序檔
Print #filenumber, [outputlist] 將格式化顯示的資料寫入循序檔中
Put [#]filenumber, [recnumber], varname 將一個變數的資料寫入磁碟檔案中。

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

其他檔案函數
LOF(filenumber)  返回一個 Long,表示用 Open 語句開啟的檔案的大小,該大小以位元組為單
位。
EOF(filenumber)  返回一個 Integer,它包含 Boolean 值 True,表明已經到達為 Random 或
順序 Input 開啟的檔案的結尾。
Loc(filenumber)   返回一個 Long,在已開啟的檔案中指定當前讀/寫位置
Seek(filenumber)  返回一個 Long,在 Open 語句開啟的檔案中指定當前的讀/寫位

【轉】VBA 入門 (一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.