1. 程式人生 > >Excel中VBA程式設計學習筆記(三)

Excel中VBA程式設計學習筆記(三)

 

12、使用InputBox函式進行輸入

語法如下:

InputBox(prompt [,title] [,default] [,xpos] [,ypos] [,helpfile,context])

引數說明:

  1. prompt為提示內容,必選;
  2. title對話方塊標題;
  3. default為對話方塊中預設的文字內容;
  4. xpos和ypos表示對話方塊距離螢幕左上角的距離,預設則居中.

使用示例:

Private Sub b()

   Dim a As String

   a = InputBox("請輸入姓名:", "輸入對話方塊", "張三")

   MsgBox (a)

End Sub

注:如果使用者點選了“取消”按鈕,則返回空串(“”).

13、迴圈及判斷語句

使用exit for;exit loop;exit sub;exit function;exit select等退出對應的迴圈結構

【例一】 if  then

Private Sub test()

   If Sheet1.Cells(1, 1).Value = "1" Then

    Application.Quit

   End If

End Sub

 

【例二】if else then

Private Sub test()

   Dim a As Integer

   a = MsgBox("華工計算機", 1 + 64 + 0, "對話方塊")

   If a = vbOK Then

    MsgBox ("點選了確定")

   Else

     MsgBox ("點選了取消")

   End If

 

         Dim a%

    score = 76

    Debug.Print IIf(score > 60, IIf(score >= 70, IIf(score >= 80, IIf(score >= 90, "優秀", "良好"), "中等"), "及格"), "差")

End Sub

注:IIF跟公示編輯欄輸入的IF語句一樣可以直接巢狀

【例三】select case

Private Sub test()

   Dim num As Integer

   Dim res As String

   res = InputBox("請輸入分數")

   If res <> "" Then '不是點選取消按鈕

     num = CInt(res) '強制轉換為整型

     Select Case (num)

     Case 0 To 59

        MsgBox ("不及格")

     Case Is < 85

         MsgBox ("良好")

     Case Is < 98

         MsgBox ("優秀")

     Case 98, 99, 100

         MsgBox ("特別優秀")

     Case Else  ‘沒有匹配上面所有情況時候執行,可以省略

        MsgBox ("輸入分數不合法")

     End Select

   End If

End Sub

注意:select case中使用的is關鍵字與is比較運算子不同.

【例四】whle wend

Private Sub test()

   Dim i, sum As Integer

   sum = 0

   i = 60

   While i > 12

    sum = sum + i

    i = i - 1

   Wend

   MsgBox (sum)

End Sub

【例五】do loop

Private Sub test()

   Dim i, sum As Integer

   sum = 0

   i = 60

   Do While i >= 12

    sum = sum + i

    i = i - 1

   Loop

   MsgBox (sum)

  

   Do

     i = i + 2

   Loop While i < 100

   MsgBox (i)

  

   Do Until i <= 0

    i = i - 10

   Loop

   MsgBox (i)

  

   i = 2

   Do

    i = i * 2

   Loop Until i > 111

   MsgBox (i)

End Sub

 

do loop的四種迴圈結構

do while … loop迴圈

先測試條件,如果成立則執行迴圈體

do … loop while迴圈

先執行一遍迴圈體,則測試迴圈條件,如果條件成立,則執行迴圈體

do until … while迴圈

先測試條件,如果不成立則執行迴圈體

do … loop until迴圈

先執行一遍迴圈體,則測試迴圈條件,如果條件不成立,則執行迴圈體

 

【例六】for next

Private Sub test()

   Dim i, sum As Integer

   sum = 0

   For i = 1 To 12

    sum = sum + i

   Next

   MsgBox (sum)

 

sum = 0

   For i = 1 To 12 Step 2

    sum = sum + i

   Next

   MsgBox (sum)

End Sub

 

【例七】for each next

Private Sub test()

Sheet1.Range("M1:M86").Select   '設定選中部分

  Dim r

  Dim t As Long

  For Each r In Selection   ‘求所有選中部分數值和

    If IsNumeric(r.Value) Then

        t = t + r.Value

    End If

  Next

  MsgBox (t)

End Sub

 

【例8】使用GOTO語句

Sub test()

    Dim value$, k%

line:

    If k > 3 Then Exit Sub

    value = InputBox("請輸入使用者名稱")

    If value <> "admin" Then

        k = k + 1

        GoTo line

    Else

        MsgBox ("輸入正確")

    End If

End Sub

注:上例中的“line”可以換成任意數字或者字串

【例9】使用GOSUB語句

Sub test()

    Dim value$, k%, counter%

    counter = 1

    Do Until counter = 10

        k = Application.WorksheetFunction.RandBetween(1, 100)

        If k < 60 Or k > 95 Then GoSub line

        ActiveSheet.Range("A" & counter).value = k

        counter = counter + 1

    Loop

    Exit Sub    '此句不可少

line:

    ActiveSheet.Range("A" & counter).Interior.ColorIndex = 3

    Return

End Sub

注:紅色背景部分不可少。GOTO與GOSUB不同的是GOSUB可以使用RETURN。

 

14、錯誤處理

on error語法:

On Error GoTo line

On Error Resume Next

On Error GoTo 0

On Error 語句的語法可以具有以下任何一種形式:

              語句                                                             描述

On Error GoTo line              啟動錯誤處理程式,且該例程從必要的 line 引數中指定的 line 開始。line 引數可以是任何行標籤或行號。如果發生一個執行時錯誤,則控制元件會跳到 line,啟用錯誤處理程式。指定的 line 必須在一個過程中,這個過程與 On Error 語句相同; 否則會發生編譯時間錯誤。

On Error Resume Next        說明當一個執行時錯誤發生時,控制元件轉到緊接著發生錯誤的語句之後的語句,並在此繼續執行。訪問物件時要使用這種形式而不使用 On Error GoTo。

On Error GoTo 0                 禁止當前過程中任何已啟動的錯誤處理程式。

 

說明

如果不使用 On Error 語句,則任何執行時錯誤都是致命的;也就是說,結果會導致顯示錯誤資訊並中止執行。

 一個“允許的”錯誤處理程式是由 On Error 語句開啟的一個處理程式;一個“活動的”錯誤處理程式是處理錯誤的過程中允許的錯誤處理程式。如果在錯誤處理程式處於活動狀態時(在發生錯誤和執行 Resume、Exit Sub、Exit Function 或 Exit Property 語句之間這段時間)又發生錯誤,則當前過程的錯誤處理程式將無法處理這個錯誤。控制元件返回呼叫的過程。如果呼叫過程有一個已啟動的錯誤處理程式,則啟用錯誤處理程式來處理該錯誤。如果呼叫過程的錯誤處理程式也是活動的,則控制元件將再往回傳到前面的呼叫過程,這樣一直進行下去,直到找到一個被允許的但不是活動的錯誤處理程式為止。如果沒有找到被允許而且不活動的錯誤處理程式,那麼在錯誤實際發生的地方,錯誤本身是嚴重的。錯誤處理程式每次將控制元件返回呼叫過程時,該過程就成為當前過程。在任何過程中,一旦錯誤處理程式處理了錯誤,在當前過程中就會從 Resume 語句指定的位置恢復執行。

 注意 一個錯誤處理程式不是 Sub 過程或 Function 過程。它是一段用行標籤或行號標記的程式碼

 

 

Resume語句:

在錯誤處理程式結束後,恢復原有的執行。

語法

Resume [0]

Resume Next

Resume line

Resume 語句的語法可以具有以下任何一種形式:

語句                                                             描述

Resume                        如果錯誤和錯誤處理程式出現在同一個過程中,則從產生錯誤的語句恢復執行。如果錯誤出現在被呼叫的過程中,則從最近一次呼叫包含錯誤處理程式的過程的語句處恢復執行。

Resume Next                如果錯誤和錯誤處理程式出現在同一個程式中,則從緊隨產生錯誤的語句的下個語句恢復執行。如果錯誤發生在被呼叫的過程中,則對最後一次呼叫包含錯誤處理程式的過程的語句(或 On Error Resume Next 語句),從緊隨該語句之後的語句處恢復執行。

Resume line                在必要的 line 引數指定的 line 處恢復執行。line 引數是行標籤或行號,必須和錯誤處理程式在同一個過程中。

 

說明

在錯誤處理程式之外的任何地方使用 Resume 語句都會導致錯誤發生。

 

15、函式(function)定義

Function過程的功能較Sub過程的應用範圍稍小,Function過程僅僅用於返回一個值或者多個數的組合即陣列,而Sub過程可以返回值,還可以對引用的物件進行修改。例如,引用單元格A1的值後對單元格A1設定新的格式,或者修改工作表名稱等。Function可以獲取工作表名稱,但無法修改工作表的名稱。

Function過程可以不使用引數,類似於工作表函式Rand和Now等,但絕大部分函式是需要一個引數或者多個引數的,最多時可達255個引數。

語法:

[Public | Private | Friend] [Static] Function name [(arglist)] [As type]

 

說明:

Public        可選的。表示所有模組的所有其他過程都可以訪問這個 Function 過程。如果是在包含 Option Private 的模組中使用,則這個過程在該工程外是不可使用的

Private     可選的。表示只有包含其宣告的模組的其他過程可以訪問該 Function 過程

Friend       可選的。只能在類模組中使用。表示該 Function 過程在整個過程中都是可見的,但對於物件例項的控制者是不可見的

Static        可選的。表示在呼叫之間將保留 Function 過程的區域性變數值。Static 屬性對在該 Function 外宣告的變數不會產生影響,即使過程中也使用了這些變數

name        必需的。Function 的名稱,遵循標準的變數命名約定

arglist       可選的。代表在呼叫時要傳遞給 Function 過程的引數變數列表。多個變數應用逗號隔開

type 可選的。Function 過程的返回值的資料型別,可以是 Byte、 Boolean 、Integer、Long、Currency、Single、Double、Decimal(目前尚不支援)、Date、String(除定長)、Object、Variant或任何使用者定義型別.

注:可以將自定義的函式儲存為載入巨集,這樣所有工作簿均可用。

【例1】引數不定

如果引數不定,則不能指定引數型別;如果有不定引數,則不定引數一定要寫在最後。

Public Function MyPlus(ParamArray num())

    m = 0

    For Each value In num

       m = m + value

    Next

    MyPlus = m

End Function

呼叫:=MyPlus(12,22,32)

【例2】

Public Function MyJoin(ParamArray num())

    result = ""

    For Each va In num

        For Each v In va

            result = result & v

        Next

    Next

    MyJoin = result

End Function

16、sub過程

語法:

[Private | Public | Friend] [Static] Sub name [(arglist)]

其中“(arglist)”即表示它支援可選的引數,可以不用引數,也可以使用引數;可以使用一個引數,也可以使用多個引數。其中引數(arglist)的具體語法如下:

 [Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]

Optional   可選的。表示引數不是必需的關鍵字。如果使用了該選項,則 arglist 中的後續引數都必須是可選的,而且必須都使用 Optional 關鍵字宣告。如果使用了 ParamArray,則任何引數都不能使用 Optional

ByVal        可選的。表示該引數按值傳遞

ByRef        可選的。表示該引數按地址傳遞。ByRef 是 Visual Basic 的預設選項

ParamArray     可選的。只用於 arglist 的最後一個引數,指明最後這個引數是一個 Variant 元素的 Optional 陣列。使用 ParamArray 關鍵字可以提供任意數目的引數。ParamArray 關鍵字不能與 ByVal、ByRef或 Optional 一起使用

varname  必需的。代表引數的變數的名稱,遵循標準的變數命名約定

type 可選的。傳遞給該過程的引數的資料型別,如果沒有選擇引數 Optional,則可以指定使用者定義型別,或物件型別

defaultvalue     可選的。任何常數或常數表示式。只對 Optional 引數合法。如果型別為 Object,則顯式的預設值只能是 Nothing.

【例一】呼叫多個引數的SUB過程

Sub main()

   HouseCalc 99800, 43100 '直接呼叫法

   Call HouseCalc(380950, 49500) 'Call呼叫法

End Sub

 

Sub HouseCalc(price As Single, wage As Single)

    If 2.5 * wage <= 0.8 * price Then

        MsgBox "You cannot afford this house."

    Else

        MsgBox "This house is affordable."

    End If

End Sub

【例二】呼叫function過程

Sub Main()

  temp = InputBox("請輸入華氏溫度")

  MsgBox "溫度是 " & Celsius(temp) & " 攝氏度"

End Sub

 

Function Celsius(fDegrees)

   Celsius = (fDegrees - 32) * 5 / 9

End Function

【例三】在function過程中使用可選引數

Sub main()

Dim ReturnValue

 

ReturnValue = ReturnTwice()    ' 返回 Null。

ReturnValue = ReturnTwice(2)    ' 返回 4。

End Sub

 

 

Function ReturnTwice(Optional A)

    If IsMissing(A) Then

        ' 如果引數丟失,則返回 Null。

        ReturnTwice = Null

    Else

        ' 如果引數出現,則返回兩倍的值。

        ReturnTwice = A * 2

 

    End If

End Function

注:IsMissing函式返回布林值,指出一個可選的Variant引數是否已經傳給過程.

【例四】在function中使用不定引數

Sub main()

Call sum(2, 3, 4)

End Sub

 

Function sum(ParamArray a()) As Single

 

Dim i As Integer

For i = 0 To UBound(a())

Debug.Print a(i)

Next i

End Function

 

FUNCTIONSUB的比較

呼叫SUB過程可以使用CALL,也可以省略。使用CALL呼叫SUB過程時候,如果SUB過程有引數則必須使用括號把引數括起來;如果省略CALL,對於帶引數的SUB過程不應該使用括號。

對於FUNCTION,如果要使用返回值,應該使用括號,否則不需要括號。

【例】

Sub main()

    fun1 "張三"     '正確寫法

    fun1 ("張三")   '正確寫法

    Call fun1("張三")   '正確寫法

    'call fun1 "張三"   '錯誤寫法

   

    fun4 ("李四")   '正確寫法

    fun4 "李四" '正確寫法

    'result=fun4 "李四"  '錯誤寫法

    result = fun4("李四") '正確寫法

    Debug.Print fun5(1, 2)  '正確寫法

    'fun5(1,2)   '錯誤寫法

    fun5 1, 2   '正確寫法

    Debug.Print fun5; 1, 2 '錯誤寫法

   

End Sub

 

Sub fun1(name As String)

    Debug.Print name

End Sub

 

Sub fun2(name As String)

    Debug.Print "my Name is" & name

End Sub

 

Function fun3(name As String)

    fun3 = "my Name is" & name

End Function

 

Function fun4(name As String)

    Debug.Print name

End Function

 

Function fun5(num1 As Integer, num2 As Integer)

    res = num1 + num2

    Debug.Print res

    fun5 = res

End Function

  1. VBA中常用函式

字串函式

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,其中包含有與指定的字元程式碼相關的字元

StrReverse

將字串倒置,例如StrReverse(“123”)結果為”321”

 

型別轉換函式

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),包含一個整數,代表某個日期是星期幾

 

測試函式

IsNumeric(x)

是否為數字, 返回Boolean結果。

IsDate(x) 

是否是日期, 返回Boolean結果。

IsEmpty(x)

是否為Empty, 返回Boolean結果。

IsArray(x)

指出變數是否為一個數組。

IsError(expression)

指出表示式是否為一個錯誤值。

IsNull(expression)

指出表示式是否不包含任何有效資料 (Null)。

IsObject(identifier)

指出識別符號是否表示物件變數。

 

數學函式

Sin(X)、Cos(X)、Tan(X)、Atan(x)

三角函式,單位為弧度。

Log(x)、Exp(x)

返回x的自然對數,指數。

Abs(x)

返回x的絕對值。

Int(number)、Fix(number)

都返回引數的整數部分,區別:Int 將 8.4 轉換成9,而 Fix 將8.4 轉換成8

Sgn(number)

返回一個 Variant (Integer),指出引數的正負號。

Sqr(number)

返回一個 Double,指定引數的平方根。

VarType(varname)

返回一個 Integer,指出變數的子型別。

 

邏輯判斷相關函式

And

 如果所有引數都為True,則返回True;只要有一個返回False,則返回False。

Or

 如果所有引數都為False,則返回False;只要有一個返回True,則返回True。

IsErr

 檢查是不是除了#N/A外的錯誤值.

IsError

 檢查是不是錯誤值(#N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?,或者 #NULL!).

IsEven

 檢查是否是偶數.

IsOdd

 檢查是否是奇數.

IsLogical

 檢查是不是布林值.