1.变量

变量的划分方式:一般变量可以按照数据类型划分,也可以按照作用范围进行划分
第2章:数据类型及变量 - 图1

1.1 按照数据类型划分的变量

  1. 变量按照数据类型一般分为:数据变量、对象变量和数组变量
  2. 变量定义一般用dim开头

    1.1.1 数据变量的定义

  3. 数据变量的定义一般用dim 变量名 as 变量类型的方式;

  4. 但基于一般VBA项目较小情况,可以不指定数据类型,直接使用dim 变量名

    1. Dim a As Integer '完整定义方式,指明数据类型
    2. Dim i '简单定义方式,不指明数据类型

    1.1.2 对象变量的定义

  5. 数据变量的定义一般用dim 变量名 as 对象类型的方式;

  6. 对象变量不能省略对象类型,再不济也需要定义成Object;

    1. Dim rng As Range '定义rng为一个range类型
    2. rng = Workbooks("AA").Worksheets("sheet1").Range("A1")

    1.1.3 数组变量的定义

  7. VBA中最常用的数组为一维数组和二维数组

  8. 只有横排的一行数据是一维数组。纵排的一列数据和矩阵数据都是二维数组
    1. Dim ary1(1 To 5) '定义一个5行列的一维数组
    2. Dim ary2(1 To 5, 1 To 6) '定义一个56列的二维数组

    1.2 按照作用范围划分变量

    1.2.1 局部变量

    局部变量只能在过程内定义,且仅作用于本过程 ```vbnet Public Sub 宏1() Dim i i = 1 Debug.Print i ‘输出结果为1 End Sub

Public Sub 宏2() Debug.Print i ‘输出结果为”” End Sub

  1. :::info
  2. 以上代码中,宏1可以输出1。但变量i定义在宏1的过程中,属于宏1的局部变量,宏2无法调用此变量,故宏2输出""
  3. :::
  4. <a name="Xggpo"></a>
  5. ### 1.2.2 全局变量
  6. 1. 全局变量定义在**模块顶部;**
  7. 2. `Public`关键字定义的全局变量可以作用于所有模块,而`Private`关键字定义的全局变量只能作用于其所在的模块;
  8. 3. 在工作表中定义的public变量在其他模块也不能直接调用。如果调用需要用`工作表名.变量名`
  9. 4. 为了防止变量污染,一般命名全局变量使用`public global_i``private module_i`
  10. ```vbnet
  11. Public a
  12. Private b
  13. Public Sub 宏1()
  14. a = 4
  15. b = 5
  16. End Sub
  17. Public Sub 宏2()
  18. Debug.Print a '输出结果为4
  19. Debug.Print b '输出结果为5
  20. End Sub
  1. 'module 1
  2. Public a
  3. Private b
  4. Public Sub 宏1()
  5. a = 4
  6. b = 5
  7. End Sub
  8. ----------------------------------------------------------------
  9. 'module 2
  10. Public Sub 2()
  11. Debug.Print a '输出结果为4
  12. Debug.Print b '输出结果为""
  13. End Sub

:::info

  1. 在模块module 1中定义的a,b变量在module 2中打印。只有用public关键字定义的全局变量a能够返回数据,而b输出结果为””:
  2. 如果打开Option Explicitb将报错; :::

    1.3 变量的赋值

  3. 数据变量赋值可以使用关键字Let,但Let关键字通常省略;

  4. 对象变量的赋值需要使用Set关键字,且该关键字不能省列;
  5. 数组变量赋方式较多,花括号方式,Array()方式,转置函数方式等 ```vbnet Public Sub 宏1()

Dim a ‘定义数据变量a,未指定数据类型 Dim rng As Range ‘定义单元格对象变量rng

a = 1 Set rng = [A1] ‘把A1单元格赋值给单元格对象

Debug.Print a Debug.Print rng.Address

End Sub

  1. :::info
  2. 代码运行结果为:<br /> 1 <br />$A$1
  3. :::
  4. ```vbnet
  5. Public Sub 宏1()
  6. [b1:f1] = Array(1, 2, 3, 4, 5)
  7. [b2:f2] = [{1,2,3,4,5}]
  8. [b4:b6] = WorksheetFunction.Transpose(Array(1, 2, 3))
  9. [b8:b10] = [{1;2;3}]
  10. End Sub

image.png :::info 各种数组赋值方式的区别:

  1. 花括号方式既能赋值一维数组也能赋值二维数组。其中,隔开的横向排列(为一维数组),;隔开纵向排列(为二维数组)
  2. Array()方式中括号内只能以,隔开,且隔开的元素横向排列
  3. 若想通过Array的方式赋值纵向数组,需要使用WorksheetFunction.Transpose函数 :::

    1.4 变量的强制声明

  4. 如果打开变量强制声明按钮,则强制用dim声明所有变量(工具-选项)

image.png

  1. 强制声明变量后,在模块的最上方出现Option Explicit强制声明提示,该提示可以通过被注释掉解除变量的强制声明;
  2. 建议实操过程中用所有变量都用dim声明,为了防止变量污染
  3. 查看一个变量是否被定义,选中改变量,右键-定义

image.png

2.常量

  1. 常量就是固定不变的数据
  2. 常量被重新赋值时会报错,即可读不可写
  3. 常量不用类似变量需要先定义再赋值,而是通过关键字直接定义和赋值
  4. 常量不能是对象类型

第2章:数据类型及变量 - 图5

2.1 按照来源划分的常量

  1. 用户自定义常量
  2. 内置常量,如xlupxlLandscape

    2.2 按照作用范围划分的常量

  3. 定义过程级常量的关键字Const

  4. 定义模块级常量的关键字Private Const
  5. 定义工程级常量的关键字Public Const ```vbnet ‘module 1

Public Const a = 1 ‘定义工程级常量 Private Const b = 2 ‘定义模块级常量

Public Sub 宏1()

  1. Const c = 3 '定义过程级常量
  2. Debug.Print a
  3. Debug.Print b
  4. Debug.Print c

End Sub

Public Sub 宏2()

  1. Debug.Print a
  2. Debug.Print b
  3. Debug.Print c

End Sub


‘module 2

Public Sub 宏3()

  1. Debug.Print a
  2. Debug.Print b
  3. Debug.Print c

End Sub

  1. :::info
  2. 输出结果:
  3. 1. 1中能正常输出a b c1 2 3
  4. 2. 2中只能输出a b1 2
  5. 3. 3中只能输出a1
  6. :::
  7. <a name="NEyK3"></a>
  8. # 3.数据类型
  9. | 数据类型 | 类型含义 | 变量声明符 | 存储空间(byte | 范围描述 |
  10. | --- | --- | --- | --- | --- |
  11. | Byte | 字节 | - | 1 | 0-255的整数 |
  12. | Boolean | 布尔值 | - | 2 | TrueFalse |
  13. | Integer | 整型 | % | 2 | -32768-32767之间的整数 |
  14. | Long | 长整型 | & | 4 | |
  15. | Single | 单精度浮点型 | | 4 | |
  16. | Double | 双精度浮点型 | # | 8 | |
  17. | Currency | 货币类型 | @ | 8 | |
  18. | Decimal | 精确类型 | - | 14 | |
  19. | Date | 日期型 | - | 8 | |
  20. | String(变长) | 定长字符串 | $ | 10+字符串长度 | |
  21. | String(定长) | 变长厂字符串 | - | 字符串长度 | |
  22. | Object | 对象变量 | - | 4 | |
  23. | Varient | 变体型 | - | | |
  24. | 用户自定义 | | - | | |
  25. ```vbnet
  26. Public Sub 宏1()
  27. Dim a%, b$ '此处声明等价于 Dim a as Integer,b as String
  28. a = 3
  29. b = "hello world!"
  30. Debug.Print a
  31. Debug.Print b
  32. End Sub

:::info 运行结果为:
3
hello world! :::