VBA01

来源:互联网 发布:淘宝假羽绒被 编辑:程序博客网 时间:2024/06/06 00:42

VBA语法


1. 数据结构

  • Boolean : 布尔型
  • Byte : 字节
  • Long : 长整数型
  • Integer : 整数型
  • String : 字符串
  • Variant : 变形
  • Double : 双精度浮点型
  • Single : 单精度浮点型
  • Decimal : 小数型
  • Date : 日期型
  • Object : 对象型
  • 用户自定义类型 : 用户自定义
  • Currency : 货币型

2. 常量变量

声明常量 :

  • Const 变量名 As 数据类型
  • 如果在第1个过程前声明Const为模块级常量,加Public为公共常量
    '定义一个Single类型常量,名称为p,常量存储数据为3.14    Const p As Single = 3.14

强制声明 : Option Explicit

    Option Explicit

声明变量 : 作用域 变量名 As 数据类型

  • Dim 变量名 As 数据类型;
  • Public 变量名 As 数据类型;
  • Private 变量名 As 数据类型;
  • Static 变量名 As 数据类型

变量类型声明符

数据类型 类型声明字符 Integer % Long & Single ! Double # Currency @ String $
    Dim Str$                 '等同于Dim Str As String    Dim Str                  '声明变量可不指定变量类型

变量赋值 : [Let] 变量名称 = 要存储数据

    Dim intcount As Integer  '定义integer变量    Let intcount = 3000      '给变量intcount赋值为3000,默认类型为Variant      

    Dim intcount As Integer  '定义integer变量    intcount = 3000          '给变量intcount赋值为3000

作用域

作用域 描述 单个过程 Dim/Static,作用域本过程可用,本地变量 单个模块 Dim/Private,第一个过程前34声明,模块所有过程可用,模块级变量 所有模块 Public,在一个模块的第一个过程前声明,作用域为所有模块,公共变量
    Sub 本地变量()        Dim a As String     '定义一个String类型的变量,名称为a        Static b As Integer '定义一个Integer类型变量,名称为b    End Sub    Dim a As String         '定义模块级变量a    Private b As String     '定义模块级变量b    Sub 合并文本()        a = "我在excelhome论坛" 'a赋值        b = "学习xcel"          'b赋值        MsgBox a & b           '用对话框表示a,b合并内容    End Sub    Public c As String         '定义全局变量

数组

声明

  • 一元数组 : Public | Dim 数组名称 (a To b) As 数据类型
  • 多维数组 : Public | Dim 数组名称 (row, col,…) As 数据类型
  • 动态数组 : Public | Dim 数组名称 () As 数据类型
'定义一个byte类型的数组arr,可保存100个数据    Dim arr (1 To 100) As Byte '只用一个自然数确定数组大小,默认起始索引号0    Dim arr (99) As Byte '定义一个3行5列的数组,类型为Integer的二维数组    Dim arr (1 To 3, 1 To 5) As Integer'定义一个三维数组    Dim arr (1 To 3, 1 To 5, 1 To 4) As Integer'    Sub a()        Dim a As Integer       '定义Integer变量'用工作表函数COUNTA求A列中的非空单元格个数,将结果保存在变量a中        a = Application.WorksheetFunction.CountA("A:A")        Dim arr() As String    '定义一个String类型的动态数组'ReDim可以重定义数组的大小,包括已经定义的数组,但不可改编版数组类型        ReDim arr(1 To a) As String  '重新定义数组arr的大小    End Sub

索引

arr(1)                 '数组中的第1个数据arr(2)                 '数组中的第2个数据arr(3)                 '数组中的第3个数据......arr(100)               '数组中的第100个数据

赋值创建

  • Array函数
    Sub ArrayTest()'使用array创建数组,应声明为variant类型变量        Dim arr As Variant '将1到10的自然数存储到数组arr中        arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)'用对话框显示数组中的第二个元素,使用array创建数组默认索引0开始,除非第一句写入"OPTION BASE 1"语句        MsgBox "arr数组的第二个元素为:" & arr(1)    End Sub
  • Split函数 : 将一个字符串按指定的分隔符拆分,将各部分保存在一个数组中
    Sub SplitTest()    '用Split函数创建数组,应为Variant类型        Dim arr As Variant    'Split函数的第一参数是包含分隔符的字符串或字符串变量    '返回索引号从0开始        arr = Split("枫叶, 空空, 小月, 老祝", ",")        MsgBox "arr数组中的第2个元素时:" & arr(1)    End Sub
  • 通过单元格区域直接创建数组 : 所得到的索引号从1开始
    Sub RngArr()    '存储数据的数组应定义为一个Variant类型的变量        Dim arr As Variant    '将A1:C3中保存的数据存储到数组arr中        arr = rang("A1:C3").Value    '将arr中存储的数据写入到E1:G3单元格区域        Range("E1:G3").Value = arr    End Sub

数组运算

  • 使用工作表函数需要加前缀
    Application.WorksheetFunction.函数名
  • UBound(数组名称):求数组最大索引号
    Sub ArrayTest()    '定义一个Variant类型变量,名称为arr        Dim arr As Variant        arr = Array(1, 2, 3, 4, 5)    '最大索引号        MsgBox "数组最大索引号是:" & UBound(arr)    End Sub
  • LBound(数组名称) : 最小索引号
    Sub ArrayTest()    '定义一个Variant类型变量,名称为arr        Dim arr As Variant        arr = Array(1, 2, 3, 4, 5)    '最小索引号        MsgBox "数组最大索引号是:" & LBound(arr)    End Sub
  • 求多维数组的最大最小索引号
    Sub dwsz()    '定义一个Integer类型二维数组        Dim arr(1 To 10, 1 To 100) As Variant        Dim a As Intege, b As Integer    '第1参数是数组名称,第2参数用于指定数组名称        a = UBound(arr, 1)        b = LBound(arr, 2)    '最大索引号        MsgBox "第一维的最大索引号是:" & a & Chr(13) & _                "第二维的最大索引号是:" & b    End Sub
  • 求数组包含元素个数
    UBound(数组名称) - LBound(数组名称) + 1
  • Join函数 : 将一维数组合并成字符串
    Sub JoinTest()        '定义两个变量        Dim arr As Variant, txt As String        arr = Array(0, 1, 2, 3, 4, 5)        '以@为分隔符,合并arr中的元素为一个字符串        txt = Join(arr, "@")        MsgBox txt    End Sub
  • 数组中保存的数据写入单元格区域
    '将数组arr中索引号是2的元素写入活动工作表A1的单元格中    Range("A1").value = arr(2)

3. 控制结构

判断结构

  • 判断两次以内 : If-条件-Then-True-Else-False-End If
  • Else后可省略
    If Range("B2").Value >= 60 Then        Range("C2").Value = "及格"     Else         Range("C2").Value = "不及格"    End If
  • 判断三次以内 : If-条件-Then-Elseif-Else-False-End If
    Sub Text()        If Range("B2").Value >= 90 Then            Range("C2").Value = "优秀"        ElseIf Range("B2").Value >= 80 Then            Range("C2").Value = "良好"        ElseIf Range("B2").Value >= 60 Then            Range("C2").Value = "及格"        Else            Range("C2").Value = "不及格"        End If    End Sub
  • 判断三次以上使用 : Select Case 条件 - Case Is - End Select
    Sub Text()        Select Case Range("B2").Value        Case Is >= 90            Range("C2").Value = "优秀"        Case Is >= 80            Range("C2").Value = "良好"        Case Is >= 60            Range("C2").Value = "及格"        Case Else            Range("C2").Value = "不及格"        End Select    End Sub

循环结构

  • For … Next : 执行同一段代码
  • For A To B Step num (B>A) - 语句块1 - [Exit For] - 语句块2 - Next [元素变量]
    Sub ShtAdd()        Dim i As Byte        For i = 1 To 5 Step 1            Worksheets.Add    '在工作表前插入一新工作表        Next i    End Sub
  • For Each … Next : 循环处理集合或数组中的成员
  • 语句形式 : For Each 变量 In 集合名称或数组名称 - 语句块1 - [Exit For] - 语句块2 - Next [元素变量]
    Sub ShtName()'sht变量是循环变量,在工作表集合中循环,所以变量类型应该定义为与之对应的Worksheet类型        Dim sht As Worksheet, i As Integer        i = 1        For Each sht In Worksheets            Range("A1" & i) = sht.Name            i = i + 1        Next sht    End Sub
  • Do While
    '开头判断式    Do [while循环条件]        <循环体>        [Exit Do]        [循环体]    Loop       '结尾判断式    Do         <循环体>        [Exit Do]        [循环体]    Loop [while循环条件]
    Sub ShtAdd()        Dim i As Byte       '定义byte类型变量,名称i        i = 1               '给变量i赋值        Do                  'Do语句开始            Worksheets.Add  '在活动工作表前插入一张新工作表            i = i + 1       '执行一次循环,变量i的值就增加1        Loop While i <= 5   '如果变量小于等于5,执行循环    End Sub
  • 在循环体中设置退出循环的条件
    Sub ShtAdd()        Dim i As Byte        i = 1        Do            If i > 5 Then Exit Do   '如果变量i大于5,终止循环            Worksheets.Add            i = i + 1        Loop                        'Do语句结束的标志    End Sub
  • Do Until : 与Do While语句用法基本相同, Do Until在循环条件True退出循环
    '开头判断式    Do [until循环条件]        <循环体>        [Exit Do]        [循环体]    Loop       '结尾判断式    Do         <循环体>        [Exit Do]        [循环体]    Loop [until循环条件]
  • With语句 : 省略多次重复输入
    Sub FontSet()        'with后跟操作对象        With Worksheets("S-heet1").Range("A1").Font            .Name = "仿宋"    '设置字体为仿宋            .Size = 12       '设置字号为12            .Bold = True     '设置字体为加粗字体            .ColorIndex = 3  '设置字体颜色为红色        End With             'with语句结束标志    End Sub

4. 模块

  • 声明私有过程 : Option Private Module

宏Sub :

    [Private | Public][Static] Sub 过程名([参数列表])        [语句块]        [Exit Sub]        [语句块]    End Sub

在过程中执行另一过程

  • 直接使用过程名调用
    过程名, 参数1, 参数2, ...
    Sub RunSub()        ShtAdd           '因为过程没有参数,直接写过程    End Sub
  • 使用Call关键字调用
    Sub RunSub()        Call ShtAdd               End Sub
  • 使用Application对象的Run方法调用过程
    Application.Run 表示过程名的字符串(或字符串变量), 参数1, 参数2, ......
    Sub RunSub()    '"ShtAdd"表示过程名字符串,用双引号        Application.Run "ShtAdd"                  End Sub

向过程传递参数

  • 引用传递
    '创建参数shtcount,integer类型    Sub ShtAdd(shtcount As Integer)    '通过参数指定新建的工作表        Worksheets.Add Count:=shtcount     End Sub
  • 引用按保存数据内存地址传递,子过程修改参数会影像主过程中变量存储的值
    Sub Test()        Dim c As Integer        c = 2        Call ShtAdd(c)    End Sub
  • Byval关键字传递 : 不会改变主过程变量
    '使用关键字ByVal    Sub ShtAdd(ByVal shtcount As Integer)        Worksheets.Add Count:=shtcount    End Sub

自定义函数Function :

  • 可在用户定义函数查找
  • 语言结构
    [Private | Public][Static] Function 函数名([参数列表]) [As 数据类型]        [语句块]        [函数名 = 过程结果]        [Exit Function]        [语句块]        [函数名 = 过程结果]    End Function
    '在使用函数时,函数的参数只能设置为单元格区域    Function CountColor(arr As Range)        Dim rng As Range    '循环处理过程参数arr中的每个参数        For Each rng In arr    '判断底纹颜色是否黄色            if rng.Interior.Color = RGB(255,255,0) Then                CountColor = CountColor + 1            End If        Next rng    End Function        

5. 对象、集合、属性和方法

  • 类Python

6. 运算符

  • 算术运算符
运算符 作用 示例 + - * / ^ \ 整除 5 \ 2 = 2 Mod 余数 12 Mod 9 = 3

* 比较运算符

运算符 作用 语法 返回结果 = <> 不等于 表达式1 <> 表达式2 True/False < > <= >= Is 比较两个对象引用变量 对象1 Is 对象2 相同True/否则False LIke 比较两个字符是否匹配 字符串1 Like 字符串2 匹配True/否则False

* 通配符

通配符 作用 代码举例 * 代替任意多个字符 “李家军”Like “”= True ? 代替单个字符 “李家军”Like “李??”= True # 代替任意单个数字 “商品5” Like “商品#”= True [charlist] 代替位于charlist中的任意一个字符 “I” LIke “[A-Z]”= True [charlist] 代替不在charlist 中的任意一个字符 “I”Like “[!H-J]”= False

* 逻辑运算符

运算符 作用 语句形式 计算规则 And Or Not Xor 异或 表达式1 Xor 表达式2 两式返回值不同True,否则False Eqv 等价 表达式1 Eqv 表达式2 两式返回值相同True Imp 蕴含 表达式 Imp 表达式2 表达式1的值为True,表达式2的值为False返回False,否则True

7. VBA内置函数

    '输入"VBA."显示函数列表    VBA.

8. 排版注释

  • 长代码显示为多行代码 : ” _”
    Sub test()'换行后下一行应该适当缩进,式视觉上和其他完整一行代码区分  Application.Workbooks("Book1").Worksheets("Sheet1") _        .Range("A1:D100").Font.Bold = True    End Sub
  • 多行代码合并 : 英文冒号(:)
    Sub test()    '定义与赋值        Dim a%, b%, c%: a = 1: b = 2: c = 3    End Sub
  • 添加注释 : 单引号(‘), Rem关键字
    Sub test()        Dim i As Integer        Rem利用For循环语句 , 向单元格中输入数据        For i = 1 To 10            Cells(i, "a") = i        Next i    End Sub