关于变量

第五篇、Excel VBA变量和变量类型

  接上一篇:VBA程序是从Sub开始,到End_Sub结束,中间堆叠着代码。在Sub开始后,紧跟着是定义变量和变量类型。

点击放大的图片
  本篇我们了解❶变量和变量类型。

一:变量是什么?

  在Excel VBA中,变量是编程中用于存储数据的基本单元,它可以存储数值、文本、日期等不同类型的数据,且在程序运行时可以改变它的值。

  具体的用途里我们可以这样理解,根据需要能够随时变化的就称为变量

  比如我们之前在循环里“对非空单元格累加”,定义的total就是变量,它随着单元格的移动,被赋值的数不断累计;在比如上面案例中的userInput,它接收我们输入的内容(「=」专业术语是「赋值」),我们可以任意输入内容,userInput也被不断赋值新的内容,userInput就是变量

1-变量的声明

  声明变量的关键字有:Dim, Private, Public

  Dim关键字最为常用,是过程级变量。Public和Private关键字来声明公共变量私有变量。公共变量可以在整个项目中访问,而私有变量只能在声明它的模块内部访问。参考↓第四小结:变量的作用域和生命周期。

建议一行只声明一个变量;

一行可以声明多个变量,需要对每个变量指定变量类型。

本节视频:
  • 1、在Sheet的B2到B11单元格,输出:建议声明的方式、建议一行多个变量声明的方式和不推荐的声明方式,三种方式变量类型的前后变化。
  • 2、在Sheet的F2到H11单元格,输出:变量的运用,给我们的计算带来的灵活性。
  • 3、强制显示声明,自动添加前后的变化。
示例1:
  • 了解三种声明变量的方式,看变量类型被声明后的变化
复制成功!
1

Sub 变量的声明()
    Dim i As Integer               '建议的声明方式
    Dim j As Long                  '建议的声明方式

    Dim x As Integer, y As Integer ' 推荐的一行声明多个变量的方式
    Dim a, b As Long               ' 不推荐的声明方式

    Range("B2").Value = TypeName(i)      ' 输出变量类型
    Range("B3").Value = TypeName(j)        ' 输出变量类型
    i = 2
    j = 3
    Range("B4").Value = i + j              ' 使用变量计算

    Range("B5").Value = TypeName(x)        ' 输出变量类型
    Range("B6").Value = TypeName(y)        ' 输出变量类型
    x = 3
    y = 4
    Range("B7").Value = x + y              ' 使用变量计算

    Range("B8").Value = TypeName(a)        ' 输出变量类型
    Range("B9").Value = TypeName(b)        ' 输出变量类型
    a = 4
    b = 4
    Range("B10").Value = a + b              ' 使用变量计算
    Range("B11").Value = TypeName(a)        ' 重新输出变量类型,发现在给变量赋值后,变量类型发生了改变
End Sub

  使用变量使得我们的程序更加的灵活,易于维护和修改,尤其的对于需要不断调用求结果的时候,变量让代码更简洁、效率更高。比如一个数学公式:y = x² + 3,x是变量,我们只要对x改变赋值后任意调用即可,而不必具体指向。

示例2:
  • y = x² + 3 ,对1到5求自己的平方加上3,结果输出到“立即窗口”。
复制成功!
1

Sub 不使用变量()
    Range("F2") = 1 * 1 + 3   '数值1
    Range("F3") = 2 * 2 + 3   '数值2
    Range("F4") = 3 * 3 + 3   '数值3
    Range("F5") = 4 * 4 + 3   '数值4
    Range("F6") = 5 * 5 + 3   '数值5
    Range("F7") = 6 * 6 + 3
    Range("F8") = 7 * 7 + 3
    Range("F9") = 8 * 8 + 3
    Range("F10") = 9 * 9 + 3
    Range("F11") = 10 * 10 + 3
End Sub

Sub 使用变量()
 Dim x As Integer            '定义变量

    For x = 1 To 10          '使用变量 + 循环
        Range("G" & x + 1).Value = x * x + 3
        Range("H" & x + 1).Value = x * x * x + 3
    Next

End Sub

2-强制显式声明的建议:

  VB编程其实是允许使用未经声明的变量的,比如示例中Dim x As Integer,有无它程序都可以运行并返回正确的结果。这样的VB自动创建变量的特性虽然给编程带来了便利,但同时会导致很多问题,尤其是在大型项目中。它可能会导致程序逻辑混乱、运行时间增加等等,比如不小心使用了与对象同名的基本数据类型(如Integer或String),这将导致运行时错误或发生不可预见的程序行为;或者未对变量事先定义数据类型,按照系统自动创建的变量可能会和实际程序中所需的数据类型不同导致错误发生或浪费不必要的内存。

强烈建议在模块顶部添加Option Explicit,强制显式声明。

  模块顶部添加Option Explicit后,会强制你事先声明变量,否则会弹出“变量未声明”的错误。这样养成的好习惯,可以帮助我们更好地管控和管理代码,增加代码交换时的可读性。

  VB中自动添加Option Explicit的方法是:“工具”菜单中选取“选项”命令,打开“选项”对话框,单击“编辑器”选项卡,勾选“要求变量声明”。这样,在以后新建的模块中,顶端自动添加Option Explicit,强制要求声明变量。

点击放大的图片 点击放大的图片

二:变量的命名规则和习惯

  在VB(Visual Basic)编程中,变量的命名规则和习惯,旨在提高代码的可读性、可维护性和一致性。

1-基本命名规则:
  • 1、字符规则:必须以字母开头(A-Z,a-z),后续可以是字母、数字(0-9)或下划线(_),不允许使用空格或特殊符号(!@#$%^&*),不区分大小写;
  • 2、关键字禁用:不能使用VB语言的关键字(如sub\dim\end\if\class)作为变量名;
  • 3、长度限制:理论上吴长度现在,但是建议简洁、最多不超过30个字符。
2-常用的命名习惯:

  遵循良好的命名习惯可以显著提升代码的可读性和协作效率。核心原则是:清晰、一致、有意义。建议遵循以下命名惯例:

  • 1、变量名应该具有描述性,能够清楚表达变量的用途,避免缩写提高可读性;
  • 2、使用类型前缀或后缀表示对象类型;
  • 3、合理使用下滑线;
  • 4、整个代码过程中保持变量命名的一致性,一种风格从头到尾。
示例:
复制成功!
1

Sum 变量命名()
    Dim username_str as String'一个表示姓名的字符串
    Dim Max_value as Integer  '一个表示最大数值的变量
    Dim UserInput as Variant  '一个表示接收弹窗输入的不确定变量
End  Sub

三:和变量相互对应的常量

常量是什么?

  在Excel VBA中,常量(Constant)是用于存储固定值的标识符,其值在程序运行期间不可更改。合理使用常量可以提升代码的可读性和可维护性。

  变量可变动,常量不可变动,变量是用Dim关键字声明,常量用Const关键字声明,声明时必须赋值。值在声明时初始化后,后续不可修改。命名规则和命名习惯和“变量”类似。

本节视频:
示例:
复制成功!
1

Sub Const_常量()
    Const PI As Double = 3.1415
    Const Max_value As Integer = 180
    Dim PI_Change As Double
    Dim i As Integer

    Debug.Print PI
    PI_Change = PI + 1
    Debug.Print PI_Change

    Range("K1").Value = "PI=" & PI

    For i = 1 To 10
        Range("K" & i + 1).Value = PI * i
    Next

End Sub

    使用常量可以避免“魔法数字”(magic numbers)的硬编码问题。比如圆周率PI或者文件路径等这些:

  • 1、需要多次重复使用的固定值时;
  • 2、需要集中管理的配置参数时;

  使用常量再合适不过。

四:变量的作用域和生命周期

  在 Excel VBA 中,变量的作用域(Scope)和生命周期(Lifetime) 决定了变量在何处可用、以及存在多久!

  有的变量只能在过程中使用,有的可以在整个程序甚至其他程序中使用。根据变量在代码中的可访问范围,有三种作用域类型:过程级、模块级、全局级。

  变量是占用内存的,赋值后总有被释放的这一刻。变量从声明后到从内存中消失的这段时间,就是变量的生命周期。它和作用域密切相关,过程级的变量在过程开始时创建,过程结束时销毁;模块级的变量,首次调用模块内任意过程时创建,程序结束时销毁;全局级的变量,程序启动时创建,程序结束或重置时销毁。

1-作用域和变量生命周期:

点击放大的图片
本节视频:
示例:
  • 过程级变量:
复制成功!
1

Sub ProcessA()
    Dim sum As Integer  ' 过程级变量
    sum = 10 + 20
    MsgBox sum
End Sub

Sub ProcessA_err()
    MsgBox sum  ' 错误:sum 是 ProcessA 的局部变量
End Sub

  • 过程级变量中的静态变量:
复制成功!
1

'多次执行,count的值不会被释放
Sub Counter()
    Static count As Integer  ' 静态变量
    count = count + 1
    MsgBox "调用次数:" & count
End Sub

Sub Counter_ns()
    Dim count As Integer  ' 静态变量
    count = count + 1
    MsgBox "调用次数:" & count
End Sub

  • 模块级变量:
复制成功!
1

' 在模块顶部声明
Private moduleValue As String

Sub SetValue()
    moduleValue = "Hello"  ' 模块内所有过程可访问
End Sub

Sub ShowValue()
    MsgBox moduleValue    ' 输出 "Hello"
End Sub

  • 全局变量:
复制成功!
1

' 在模块顶部声明
Public globalCount As Long

Sub IncrementCount()
    globalCount = globalCount + 1
End Sub

'在别的模块中调用
 Sub DisplayCount()
    MsgBox "全局计数:" & globalCount
End Sub

2-作用域和生命周期选择建议

  • 1、优先使用最小作用域,尽可能使用过程级变量,变量只这个过程中,结束就释放;
  • 2、局变量尽可能不用,如果想要在多次调用时保留值,用Static代替全局变量.

五:变量类型

  Excel VBA中,变量类型决定了变量可以存储的数据种类及其占用的内容空间。

1-变量类型及其用途和范围

点击放大的图片

2-变量类型选择建议

  ↑前几种变量类型非常简单、容易理解,我们声明正确即可。

  • Object对象类型值得用好几个篇幅详细了解,我们用代码来实现办公自动化,大部分时间也就是控制工作簿对象、工作表对象、单元格对象、图片对象等等,按照我们需要的处理方式,运用控制语句(判断和循环)来实现。
  • 6、不确定变量类型时用Variant,但是不建议使用,应当显示(明确)指定类型;
  • 7、Array数组,能提升代码的运行效率,尤其是处理数据时。数组还能提供代码的可读性、简化代码和便于后期维护。之后会专门分享一篇有关数组使用的介绍!

下一篇:了解Excel的对象类型(Object):

  我们在第三篇🔗基础的编程知识:循环中示例时,声明过一个对象类型的变量,Dim sht As WorkSheet,它定义了一个Excel工作表对象,用于引用和操作工作表Sheet。因为对象类型的变量不直接存储数据,而是存储对某个对象的引用(类似指针),sht这个变量名就指向了工作薄中的工作表,对sht的操作实际是在操作它指向的Sheet对象。

这个非常非常重要,当我们能控制Exce对象时,就能释放高效操作Excel的复杂功能。控制工作簿,我们就能移动它、删除它;控制工作表,我们就能按照需要拼接、复制;控制单元格,就能按照需要给它涂色、合并、区域求和;控制单元体字体,就能用代码控制它的大小、颜色、粗细。当对象的一切都可以用控制时,再配合我们的编程语句(判断和循环),更复杂的功能实现就变得尤为轻松!

  Excel的核心对象包括:Application、WorkBook工作簿、WorkSheet工作表、Range单元格、Chart图片、Shape。它们像一栋房子里面的整体和局部,有着树状结构的层级关系。我们需要通过几个篇幅来了解它,在了解每一个对象的同时,也会介绍它的一些常用的操作。

请开发者喝杯咖啡 请开发者喝杯咖啡!