Excel VBA 基础部分(变量声明、三大语句)

3 篇文章 2 订阅

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
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值