02. VBA从入门到精通——基础语法

发布时间:2024年01月21日

数据类型

  • 常用数据类型

????????Integer:整数,-32,768到32,767之间的整数

????????Long:较长长整数,-2,147,483,648到2,147,483,647之间的整数

????????Single:浮点数,它可以存储大约:6到7位小数的精度。

????????Double:较长浮点数,大约15位小数的精度

????????Boolean:布尔值,只有两个取值,True和False

????????Date:日期

????????Object:任何对象引用

????????String:字符串

  • 自定义数据类型

????????标准模块中需要使用Type语句,类模块中需要使用Private Type

? ? ? ? 示例:

Type AA?

  ID As?Integer

  Name As?String

  Phone As Long
end Type

声明及使用常量

数值常量:如1、3.7

字符常量:用双引号表示,如"AA"

符号常量:声明符号常量时可以同时定义数据类型

? ? ? ? 用法:

? ? ? ? ? ? ? ? Const 常量名 = 常量值

? ? ? ? 示例:

? ? ? ? ? ? ? ? Const Name = "小明"

? ? ? ? ? ? ? ? Const Name As String = "小明"

逻辑常量:只有两个:True、False

日期常量:有两种表示方法

? ? ? ? 示例:

? ? ? ? ? ? ? ? (1) a = #20/1/2024#

? ? ? ? ? ? ? ? (2) a = "2024-3-2"

内置常量:一般以vb或xl为前缀,有颜色、星期、按钮、符号(如换行符)等相关内置常量

MsgBox的Buttons参数

vbOKOnly:对应值为0,只显示“确定”按钮,即默认情况,而0也无需在参数中特意指明。

vbOKCancel:对应值为1,同时显示“确定”和“取消”按钮。

vbAbortRetryIgnore:对应值为2,同时显示“中止”、“重试”、“忽略”按钮。

vbYesNoCancel:对应值为3,显示“是”、“否”、“取消”按钮。

vbYesNo:对应值为4,显示“是”和“否”按钮。

vbRetryCancel:对应值为5,显示“重试”和“取消”按钮。

示例

Public Sub test()
    Dim res
    res = MsgBox("是否进行数据修改", 4)
    If res = vbYes Then
        '修改数据语句
    End If
    
End Sub

? ? ? ? ?

声明及使用变量? ? ??

  • VBA允许使用未定义变量,但容易发生错误,所以一般设置成强制声明变量。

? ? ? ? 设置:工具→选项→编辑器→要求变量声明

? ? ? ? 模块中Option Explicit 表示强制声明变量

? ? ? ? 注意:

? ? ? ? ? ? ? ? 变量要以字母或汉字开头,并只能由字母、汉字、字母、下划线组成

  • 定义变量

? ? ? ? 一般使用Dim定义,也可以使用ReDim、Public、Private、Static

? ? ? ? 示例:

? ? ? ? ? ? ? ? Dim XY As string #初始值为空字符串

  • 使用类型标识符定义变量

? ? ? ? (如果设置了强制声明变量,这种方法是不被允许的)

? ? ? ? 常用标识符

? ? ? ? ? ? ? ? $:字符串

? ? ? ? ? ? ? ? %:整形

? ? ? ? ? ? ? ? &:长整型

? ? ? ? ? ? ? ? ! :浮点数

? ? ? ? ? ? ? ? @:货币型

? ? ? ? 示例:

? ? ? ? ? ? ? ? a$ = "小明

? ? ? ? ? ? ? ? d! = 1300

  • 定义和使用对象变量

????????(用Object作为对象变量通用关键词,为了使程序可读性更强、运行快,最好创建引用到具体对象类型的对象变量,如用Range或Worksheet作为关键词

? ? ? ? 声明对象变量:

? ? ? ? ? ? ? ? Dim Rng As Object? ’声明变量Rng为对象变量

???????????????? Dim Rng As Worksheet? ‘声明要引用一个工作表为对象Rng的值

? ? ? ? 赋值对象变量:

? ? ? ? ? ? ? ? Set Rng = Worksheets("Sheet1").Range("A1:E10")? '赋值对象变量为工作表Sheet1中单元格

  • 定义模块级变量

? ? ? ? 模块级变量:是指对模块中所有的子程序和函数都有效的变量

? ? ? ? 用法:可在该模块的顶部使用Dim或Private进行声明

? ? ? ?例如:

? ? ? ? ? ? ? ? Dim x As String,y As String

  • 定义公共变量

? ? ? ? 公共变量:对所有模块的子程序和函数都有效

? ? ? ? 用法:应在某标准模块的顶部使用Public 进行声明,一般可以创建一个专门保存公共变量的标准模块,以便于查看变量的定义和使用

? ? ? ? 例如:

? ? ? ? ? ? ? ? Public ws As Worksheet

定义数组

  • 定义静态数组

????????静态数组:是指维度和大小固定不变的数字

????????一维数组:

? ? ? ? ????????Dim A(10) As Long 或 Dim A(0 To 10) As Long '表示从0到10是一个数

????????二位数组

?????????????????Dim A(2,10) As Long 或 Dim A(0?To 2,0 To 9) As Long '表示从0到2和从0到10,他们交叉相乘为30,所以数组大小为30

????????示例

Sub test()
    Dim ws As Worksheet
    Dim i As Long
    Dim aa(1 To 9) As String
    Set ws = Worksheets("1")
    For i = 1 To 9
        aa(i) = ws.Range("A" & i + 1)
    Next i
    
            
End Sub
  • 定义动态数组

? ? ? ? 动态数组:是指在程序运行时其大小可以变化,使用动态数组可以节省内存,加快运行速度

? ? ? ? 用法:

? ? ? ? ? ? ? ? ReDim ABC(n) As String

? ? ? ? 注意:动态属于组的声明语句必须放在数组元素变量赋值语句后面

? ? ? ? 补充:Excel VBA中使用Range时,有一个End属性,以Range单元格为基准定位到其上、下、左、右最后一个有数据的单元格,也可以用数字表示。

????????????????其中1代表:xlToLeft?
????????????????其中2代表:xlToRight
????????????????其中3代表:xlup
????????????????其中4代表:xldown

????????示例:?? ? ? ? ?

Sub AA()
    Dim i As Integer
    Dim n As Integer
    n = Range("A10000").End(xlUp).Row - 1 '表示表中A10000区域内最后一行的行号
    ReDim AA(1 To n) As String
    For i = 1 To n
        AA(i) = Range("A" & i)
    Next i

End Sub
  • 将数组的缺省下界设置为1

? ? ? ? 缺省时默认为0

? ? ? ? 方法一:

? ? ? ? ? ? ? ? dim A(1 to 3) as string

? ? ? ? ? ? ? ? redim A(1 to n) as string

? ? ? ? 方法二:在模块顶部写入如下语句

? ? ? ? ? ? ? ? Option Base 1

  • 获取数组的最小下标和最大下标

? ? ? ? LBound() 获取最小下标

? ? ? ? UBount() 获取最大下表

? ? ? ? 补充:MsgBox ‘输出标题

? ? ? ? 示例:

? ? ? ? ? ? ? ? Dim a(10,2,4) As String

? ? ? ? ? ? ? ? MsgBox LBound(a,3) ’表示第三维度的最小下标

数据运算规则及运算符

  • 赋值运算符

????????=?

  • 数学运算符:

????????+、-、*、/、\、-、^? ?'加、减、乘、除、整除、符号、乘幂

  • 比较运算符:

????????=、<>(不等于)、>、<、>=、<=、Like(字符串模糊匹配)、Is(逻辑)

? ? ? ? 示例:表示判断A列表里有媒体字样和B列表匹配北京就输出

? ? ? ? ? ? ? ? If Range("A" & i) Like "*媒体*" And Range("B" & i) = "背景" Then

? ? ? ? ? ? ? ? ? ? ? ? MsgBox "客户:" & Range("A" & i)

  • 逻辑运算符:

? ? ? ? Not '非

? ? ? ? And '与

? ? ? ? Or '或

? ? ? ? Xor '异或

? ? ? ? Eqv '相等

? ? ? ? Imp '逻辑蕴含

  • 字符连接运算:

? ? ? ? & '可连接任意数据

? ? ? ? +?'只能连接文本字符

语句基础知识? ? ? ? ? ? ??

循环语句

For ... Next循环语句

提示:

????????循环数组中的所有元素,可以利用UBound和LBound然后通过For...Next进行循环

? ? ? ? 循环集合中所有对象:也可以利用集合中Count属性获取集合对象个数通过For..Next进行循环

语法:

? ? ? ? For 计数器 = 初始值 To 终值 [步长] ????????'步长可以为负数,默认为1

? ? ? ? ? ? ? ? [循环体]

? ? ? ? ? ? ? ? [Exit For] ????????'退出循环,一般设置一个条件判断语句

? ? ? ? ? ? ? ? [循环体]

? ? ? ? Next 计数器? ? ? ? '计数器 = 计数器 + 步长

示例:九九乘法表? ? ? ? ? ? ??

Public Sub test()
    Dim i As Integer, j As Integer
    Range("A1") = "九九乘法表"
    For i = 1 To 9
        For j = 1 To i
            Cells(i + 1, j) = i & "*" & j & "=" & i * j
        Next j
    Next i
    
End Sub

结果显示:? ? ? ? ? ??

For Each...Next 循环语句?

????????For Each...Next 是对集合中所有元素进行循环

? ? ? ? 语法:

? ? ? ? ? ? ? ? For Each 集合中元素 In 集合

? ? ? ? 示例:循环当前工作博中所有工作表,并把表名输出到当前工作表A列

????????????????

Public Sub test()
    Dim ws As Worksheet
    Dim i As Integer
    i = 1
    For Each ws In ThisWorkbook.Worksheets '把表对象赋值给ws
        Range("A" & i) = ws.Name
        i = i + 1
    Next
    Set ws = Nothing
    
End Sub

Do ... Loop 循环

for 循环一般用在已经循环多少次的情况,当未知时一般使用Do...Loop循环

  • 第一中结构:先判定在循环

????????Do While 判定条件

????????????????循环体

????????Loop

  • 第二种结构:先循环在判定

????????Do

????????????????循环体

????????Loop While 判定条件

  • 第三种结构:判定条件为False时执行循环

????????Do Until 判定条件

????????????????循环体

????????Loop

  • 第四种结构:

????????Do

????????????????循环体

????????Loop?Until 判定条件

  • 推出Do循环:Exit Do,一般设置判断语句

使用While ... Wend 循环

条件成立就执行类似Do While .. Loop

语法结构:

? ? ? ? While 条件判断

? ? ? ? ? ? ? ? 循环体

? ? ? ? Wend

条件控制语句

单行语法:如果符合就语句1否则就语句2

? ? ? ? If 条件 Then 语句 1 [Else 语句2]

多行语法一:如果符合就语句

? ? ? ? If 条件 Then

? ? ? ? ? ? ? ? 语句块

? ? ? ? End If

多行语法二:如果符合就语句1否则就语句2

? ? ? ? If 条件 Then

? ? ? ? ? ? ? ? 语句1

? ? ? ? Else

? ? ? ? ? ? ? ? 语句2

? ? ? ? End If

多行语法三:

? ? ? ? If 条件1 Then

? ? ? ? ? ? ? ? 语句1

? ? ? ? ElseIf 条件2

? ? ? ? ? ? ? ? 语句2

? ? ? ? ElseIf 条件3

? ? ? ? ? ? ? ? 语句3

? ? ? ? ...

? ? ? ? [ Else

? ? ? ? ? ? ? ? 语句n ]

? ? ? ? End If????????

补充:Exit Sub '表示退出程序,可以跟条件语句结合使用

示例:

Public Sub test()
    Dim res
    res = MsgBox("是否进行数据修改", vbYesNo + vbQuestion)
    If res = vbYes Then
        '修改数据语句
    End If
    
End Sub

Select Case语句? ? ? ??

在使用多分支语句比较麻烦时可以使用Select Case语句? ?

语法:

? ? ? ? Select Case 变量或表达式

? ? ? ? ? ? ? ? Case 值1? ? ? ? ‘如果符合值1就执行语句1

? ? ? ? ? ? ? ? ? ? ? ? 语句1

? ? ? ? ? ? ? ? [Case 值2? ? ? ? '如果符合值2就执行语句2....

? ? ? ? ? ? ? ? ? ? ? ? 语句2]

? ? ? ? ? ? ? ? ....

? ? ? ? End Select

? ? ? ? 提示:其中,值1、值2...可以取以下几种形式

? ? ? ? ? ? ? ? (1)具体常数:如1、2、A、"汉语"..

? ? ? ? ? ? ? ? (2)连续的数据范围,如1 To 100 ,A To C 等

? ? ? ? ? ? ? ? (3)满足某哥条件的表达式。如Is关系表达式

? ? ? ? ? ? ? ? ? ? ? ? 例: Case Is <5,10,30,40,Is > 100

语句书写技巧

  • 为了简洁明了,可以将多行类似语句写在同一行

? ? ? ? 对于赋值语句,需要用冒号隔开

? ? ? ? 对于声明语句,需要用逗号隔开

  • 断行:

????????在VBA中一行最多255字符,可以在行尾追加一个空格和一个下划线进行换行

  • 两种注释方法:

? ? ? ? (1)'

? ? ? ? (2)Rem ,此时注释语句只能单独一行

使用With语句提高程序运行效率

? ? ? ? 当使用对象的诸多属性和方法时,最好使用With语句

文章来源:https://blog.csdn.net/weixin_43812198/article/details/135713772
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。