天天看點

Excel VBA 基礎部分(變量聲明、三大語句) Excel VBA 基礎部分

目錄

  • Excel VBA 基礎部分
    • 一、變量聲明語句
    • 二、指派語句、條件語句、循環語句
    • (一)指派語句
        • 1. Let語句
        • 2. Set
    • (二)條件語句
        • 1. If...Then...Else語句
        • 2. Select Case語句
        • 3. Choose 函數。從參數清單中選擇并傳回一個值
        • 4. IIf 函數。根據表達式的值從兩個裡面選擇一個
        • 5. Switch 函數。計算表達式的清單并傳回與清單中第一個結果為 True 的表達式關聯的 Variant 值或表達式
    • (三)循環語句
        • 1. While...Wend語句
        • 2. Do...Loop語句
        • 3. For Each...Next語句
        • 4. For...Next 語句

Excel VBA 基礎部分

一、變量聲明語句

'定義變量和配置設定存儲空間
Dim [ WithEvents ] varname [ ( [ subscripts ] ) ] [ As [ New ] type ] . . .
           
部分 說明
withEvents 可選。該關鍵字指定varname是對象變量,用于響應觸發一個ActiveX對象。WithEvents隻在類子產品有效。使用它你可以定義多個獨立的對象,但是不能使用該關鍵字建立數組,也不能與New關鍵字一起使用。
varname 必需。變量名稱
subscripts

可選。數組變量的維數;最多可達60維。 該subscripts參數使用以下文法: [ lower To ] upper [ , [ lower To ] upper ] . . . 。

如果沒有使用explicity語句,數組的最低維數 lower由可選的Base語句控制。如果沒有可選的Base語句存在,則最低的數組維數是0.

New 可選。該關鍵字能顯示建立一個對象。如果在定義對象變量時使用New,則建立了該對象的一個執行個體。 是以,不必使用Set語句來指派該對象的引用。New不能定義内置的資料類型。
type 可選。變量的資料類型;可以指定的有:Byte, Boolean, Integer, Long, Currency(貨币型), Single(單精度), Double(雙精度), Decimal (目前不支援), Date, String (可變長度), String length (固定的字元串長度), Object, Variant, 用于自定義類型, or an object type。
備注

如果定義在子產品界别,則在該子產品上的函數都可用;如果定義在函數内,則隻有函數内可用。

在定義對象變量時,如果沒有使用New關鍵字,則在對該變量指派時必須使用Set關鍵字。并在指派前該變量的值是Nothing。

在定義一個數組變量時不帶小括号,則該變量是可變數組變量,在函數中可以Redim具體指定數組的維數。

示例

' 定義AnyValue 和 MyValue為 Variant,預設指派為Empty。 
Dim AnyValue, MyValue 
 
 '顯示定義一個整數類型的變量
Dim Number As Integer 
 
' 在一行中定義多個變量。 由于沒有指定類型,是以AnotherVar的類型是Variant。
Dim AnotherVar, Choice As Boolean, BirthDate As Date 
 
' DayArray是有51個索引的數組變量,如果可選Base設定為0(預設),則索引從0至50。
Dim DayArray(50) 
 
' Matrix 是二維整數數組。 
Dim Matrix(3, 4) As Integer 
 
' MyMatrix 是double類型的三維數組,其維數顯示指定。 
Dim MyMatrix(1 To 5, 4 To 9, 3 To 5)  As Double 
 
' BirthDay是一個索引從1至10的日期型的數組。 
Dim BirthDay(1 To 10)As Date 
 
' MyArray是動态 variants 類型的數組
Dim MyArray()
           

二、指派語句、條件語句、循環語句

(一)指派語句

1. Let語句

'文法
[ Let ] varname = expression
           

示例

Dim MyStr, MyInt 
' 以下變量使用 Let 語句進行指派 
Let MyStr = "Hello World" 
Let MyInt = 5

'日期型指派
Dim birthday as Date
Let birthdat = #2021-1-1#

'也可以省略 Let
Dim MyStr, MyInt 
MyStr = "Hello World" 
MyInt = 5
           

2. Set

'文法
Set objectvar = {[ New ] objectexpression | Nothing }
           

示例

Dim YourObject, MyObject, MyStr 
Set MyObject = YourObject            ' 指派對象的位址(引用) 
                                     ' MyObject 和 YourObject 引用同一個對象
YourObject.Text = "Hello World"      ' 初始化屬性
MyStr = MyObject.Text                ' 傳回 "Hello World". 
 
' 切斷聯系,MyObject 不再引用 YourObject。
Set MyObject = Nothing               ' 釋放對象

' 也可以使用對象數組
Dim myChildForms(1 to 4) As Form1 
Set myChildForms(1) = New Form1 
Set myChildForms(2) = New Form1 
Set myChildForms(3) = New Form1 
Set myChildForms(4) = New Form1
           

(二)條件語句

1. If…Then…Else語句

'文法(單行)
If condition Then [ statements ] [ Else elsestatements ]

'或者使用語句塊
If condition Then
	[ statements ]
[ ElseIf condition-n Then
	[ elseifstatements ]]
[ Else
	[ elsestatements ]]
End If
           

示例

'使用單行文法
If A > 10 Then A = A + 1 : B = B + A : C = C + B

'使用語句塊文法
Dim Number, Digits, MyString 
Number = 53                           ' 初始化變量
If Number < 10 Then 
 	Digits = 1 
ElseIf Number < 100 Then 
' 條件計算為True時,下面的語句會執行 
 	Digits = 2 
Else 
 	Digits = 3 
End If 
 
' 使用單行文法形式指派 
If Digits = 1 Then MyString = "One" Else MyString = "More than one"

'使用 if TypeOf 構造來判斷傳遞過來的Control是否是一個文本對話框
'TypeOf 不能與除Object以外的Long、Integer等硬資料類型一起使用
Sub ControlProcessor(MyControl As Control) 
	 If TypeOf MyControl Is CommandButton Then 
		Debug.Print "You passed in a " & TypeName(MyControl) 
		ElseIf TypeOf MyControl Is CheckBox Then 
		Debug.Print "You passed in a " & TypeName(MyControl) 
		ElseIf TypeOf MyControl Is TextBox Then 
		Debug.Print "You passed in a " & TypeName(MyControl) 
	End If 
End Sub
           

2. Select Case語句

'文法
Select Case testexpression
	[ Case expressionlist-n [ statements-n ]]
	[ Case Else [ elsestatements ]]
End Select
           

示例

'可以在每個Case子句中使用多個表達式或範圍
Case 1 To 4, 7 To 9, 11, 13, Is > MaxNumber

'備注:Is 比較運算符與Select Case語句中使用的 Is 關鍵字不同。

'也可以指定字元串的範圍和多個表達式。下面示例Case會比對字元串 everything;
     按照字元順序比對落在nuts和soup之間的字元串,及變量TestItem的目前值:
Case "everything", "nuts" To "soup", TestItem

Dim Number 
Number = 8                                 ' 變量初始化
Select Case Number                         ' 計算變量的值
Case 1 To 5                                ' 1至5之間的數字, [1, 5]
    Debug.Print "Between 1 and 5" 
                                           ' 以下是隻有比對單個值時
Case 6, 7, 8                               ' 6至8之間(含)
    Debug.Print "Between 6 and 8" 
Case 9 To 10                               ' 9 或者 10
	Debug.Print "Greater than 8" 
Case Else                                  ' 其他值
    Debug.Print "Not between 1 and 10" 
End Select
           

3. Choose 函數。從參數清單中選擇并傳回一個值

文法
Choose(index, choice-1, [ choice-2, ..., [ choice-n ]] )
           

示例

' 根據 ind的值來選擇第幾個字元串
Function GetChoice(Ind As Integer)
    GetChoice = Choose(Ind, "Speedy", "United", "Federal")
End Function
           

4. IIf 函數。根據表達式的值從兩個裡面選擇一個

' 文法
IIf(expr, truepart, falsepart)
           

示例

Function CheckIt (TestMe As Integer)
    CheckIt = IIf(TestMe > 1000, "Large", "Small")
End Function
           

5. Switch 函數。計算表達式的清單并傳回與清單中第一個結果為 True 的表達式關聯的 Variant 值或表達式

'文法
Switch(expr-1, value-1, [ expr-2, value-2…, [ expr-n, value-n ]])

'出現以下情形,Switch傳回 Null 值:
     '1. 所有表達式的值不是True
     '2. 第一個表達式為真是對應的值是Null.
'Switch 會計算所有表達式,即使隻傳回其中一個。
           

示例

' 此示例使用 Switch 函數傳回與某個城市名稱比對的語言名稱
Function MatchUp(CityName As String)
    Matchup = Switch(CityName = "London", "English", CityName _
                    = "Rome", "Italian", CityName = "Paris", "French")
End Function
           

(三)循環語句

1. While…Wend語句

'文法
While condition [ statements ] Wend
           

示例

Dim Counter 
Counter = 0                          ' 初始化
While Counter < 20                   ' 測試Counter的值
	 Counter = Counter + 1           ' Counter值加 1
Wend                                 ' 當 Counter > 19 時,結束while循環
Debug.Print Counter                  ' 在立即視窗列印20
           

2. Do…Loop語句

'文法
Do [{ While | Until } condition ]
	[ statements ]
	[ Exit Do ]
	[ statements ]
Loop

'或者可以使用以下文法:
Do
	[ statements ]
	[ Exit Do ]
	[ statements ]
Loop [{ While | Until } condition ]
           

示例

Public Sub LoopExample()
    Dim Check As Boolean, Counter As Long, Total As Long
    Check = True: Counter = 0: Total = 0                         ' 變量初始化
    Do                                                           ' 外側循環
        Do While Counter < 20                                    ' 内層循環
            Counter = Counter + 1                                ' Counter的值加 1
            If Counter Mod 10 = 0 Then                           ' 如果是10的倍數
                Check = (MsgBox("Keep going?", vbYesNo) = vbYes) ' 停下來等待用于點選是否
                If Not Check Then Exit Do                        ' 跳出内層循環
            End If
        Loop
        Total = Total + Counter                                  ' 内層循環結束後執行
        Counter = 0
    Loop Until Check = False                                     ' 立即跳出外層循環
    MsgBox "Counted to: " & Total
End Sub
           

3. For Each…Next語句

'文法
For Each element In group
	[ statements ]
	[ Exit For ]
	[ statements ]
Next [ element ]
           
部分 說明
element 必需。是一個用于周遊集合或數組元素的變量。對于集合(collentions)來說,元素可以是Variant變量,通用對象(object)變量,或任何特定的對象變量。對于數組來說,元素隻能是Vaviant變量。

示例

Dim Found, MyObject, MyCollection 
Found = False                              ' 初始化
For Each MyObject In MyCollection          ' 周遊集合中每個元素
    If MyObject.Text = "Hello" Then        ' 如果對象的屬性Text是"Hello".
        Found = True                       ' 把Found的值設定為 True.
        Exit For                           ' 退出循環 
    End If 
Next
           

4. For…Next 語句

'文法
For counter = start To end [ Step step ]
	[ statements ]
	[ Exit For ]
	[ statements ]
Next [ counter ]
           

示例

dim i%,  j%
For i = 1 To 10 
	 For j = 1 To 10 
		 For k = 1 To 10 
		 	... 
		 Next k 
	 Next j 
Next i

Dim Words, Chars, MyString 
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
           

繼續閱讀