使用 Microsoft 登录
登录或创建帐户。
你好,
使用其他帐户。
你有多个帐户
选择要登录的帐户。

简介

本文介绍如何在 Microsoft Visual Basic for Applications 中的 Microsoft Excel 子过程使用变量。

详细信息

子过程中变量

编程语言的一项强大功能是能够将某些内容存储在变量中,以便稍后可以在过程中使用或更改变量的内容。 本文档将讨论以下变量在 Visual Basic:

  • 如何声明变量。

  • 可以使用 变量的过程和项目。

  • 变量的生存期。

在宏中声明变量

在宏中声明变量的最简单方法就是使用 Dim 语句。 以下行将两个变量声明为整数:

    Dim x As Integer, y As Integer

将 x 和 y 指定为整数后,告知 Visual Basic 为整数变量预留足够的内存 (2 字节,每个 2 字节用于 x 和 y) 并且 x 或 y 中存储的信息是 -32768 和 32767 之间的整数。

注意: 如果使用单个 Dim 语句声明多个变量,则必须为每个变量数据类型变量。

如果未为每个变量指定数据类型变量,如以下代码Visual Basic,则仅将变量 y 设置为整数变量。 变量 x 将是一个变体类型:

    Dim x, y As Integer

有关其他信息,请参阅下面的 数据类型 变量。
 

若要执行变量测试,请执行以下步骤:

  1. 保存并关闭所有打开的工作簿,然后打开一个新工作簿。

  2. 按 Alt+F11 Visual Basic" (编辑器") 。

  3. 在"插入"菜单上,单击"模块"。

  4. 键入以下代码

    Sub Variable_Test()
        将 x 变暗为整数,y 为整数
        x = 10
        y = 100
        MsgBox"x 的值是 "& x & _
        Chr (13) &"y 的值是 " & y
    End Sub

  5. 运行Variable_Test宏。 收到以下消息


    the value of x is 10the value of y is 100

  6. 单击“确定”。

  7. Variable_Test宏中,更改以下

    行:x = 10

  8. to:

    x = "error"

  9. 运行Variable_Test宏。

将收到运行时错误,因为"error"不是整数,并且你尝试将此字符串值分配给整数变量 x。
 

数据类型摘要

这些是常见的变量数据类型:

常见变量数据类型

变量数据类型

如果在声明变量数据类型未指定变量,或者完全不声明变量,Visual Basic自动为此变量数据类型变量。 下面是声明为此变量的变量的优点数据类型:

  • 变量可以包含字符串、日期、时间、布尔值或数值。

  • 变量可以自动转换它们包含的值。

缺点是变量变量至少需要 16 字节的内存。 在大型过程或复杂模块中,16 字节的内存可能很大。

若要了解此操作在宏Variable_Test的工作原理,请执行以下步骤:

将宏中的Variable_Test更改为:

Sub Variable_Test()
    Dim x, y
    x = "string"
    y = 1.23
    MsgBox "the value of x is " & x & _
    Chr(13) & "the value of y is " & y
End Sub

运行Variable_Test宏。

不会收到错误,因为可以将任何内容分配给变量 x 和 y。

注意: 还可以保留以下行,宏仍将工作,因为变量 x 和 y 被视为 Variant 数据类型:

    Dim x, y

变量的范围

声明变量时,同一模块、其他模块或其他项目中的其他宏可能会看到或无法看到该变量。 模块中变量的这种可用性称为范围。 三种类型的作用域是过程级、专用模块级别和公共模块级别。 范围取决于声明变量的方式和位置。

过程级范围

在声明变量的过程外部,不会看到具有过程级作用域的变量。 如果设置具有过程级作用域的变量的值,则其他宏不会看到该变量的内容。

若要验证在声明变量的过程外部是否未看到具有过程级作用域的变量,请执行以下步骤:

  1. 将新模块插入到项目中。

  2. 在此模块中键入以下两个宏:
      Sub Macro1 () Dim x As Integer x = 10 MsgBox "x,如 Macro1 所见是 " & x "下一行运行 Macro2 Macro2 End Sub Sub Macro2 () MsgBox "x,如 Macro2 所见是 " & x End Sub

  3. 运行 Macro1,将看到以下消息

    x, as seen by Macro1 is 10

  4. 单击"确定",将看到以下消息

    x, as seen by Macro2 is

  5. 单击“确定”。

Macro2 不显示变量 x 的值,因为变量 x 是 Macro1 的本地变量。

专用和公共模块级范围

可以在模块顶部的模块 (的声明部分中定义变量,高于所有子过程) ,然后使用 Public 语句、Dim 语句或 Private 语句设置变量的范围。 如果将 Public 语句放在变量的前面,变量将可供项目的所有模块的所有宏使用。 如果将 Dim 语句或 Private 语句放在变量的前面,则变量仅适用于声明变量的模块中的宏。

若要了解 Public 语句与 Dim 语句的区别,请执行以下步骤:

  1. 保存并关闭所有打开的工作簿,然后打开一个新工作簿。

  2. 启动"Visual Basic编辑器"。

  3. 在项目中插入模块。

  4. Type the following code into this module:
    
    Public x As Integer
    Sub Macro_1a()
        x = 10
        MsgBox x
        Macro_1b
    End Sub
    Sub Macro_1b()
        x = x * 2
        MsgBox x
        Macro2
    End Sub
  5. 将另一个模块插入到项目中。

  6. 在此模块中键入以下代码:


    Sub Macro2()     x = x * 3
        MsgBox x
    End Sub

  7. 运行 Macro_1a模块中的宏。

  8. 将变量 x 声明为"公共 x 作为整数"后,项目中的所有三个宏都有权访问 x 的值。 第一个消息框显示值 10。 第二个消息框显示值 20 (因为 x 乘以 2 在 Macro_1b) 。 第三个消息框显示值 60 (因为 x 的值在 Macro_1b 中已更改为 20,然后在 Macro2) 中乘以 3。

  9. 将第一个模块中的声明行从

       Public x As Integer

    to:

       Dim x As Integer

  10. 运行Macro_1a宏。

  11. 将变量 x 声明为"Dim x As Integer"后,只有第一个模块中的宏可以访问 x 的值。 因此,第一个消息框显示值 10,第二个消息框显示值 20, (因为 x 在 Macro_1b) 中乘以 2,第三个消息框显示值 0 (因为 Macro2 看不到 x 的值,而宏 2) 使用了未初始化的零值。

  12. 将第一个模块中的声明行从

      Dim x As Integer

    自:

        Private x As Integer

  13. 运行Macro_1a宏。

  14. 使用 Private 语句范围显示的消息框与使用 Dim 语句时相同。 变量 x 具有相同的范围,对于声明它的模块来说是私有的。


注意: 如果希望变量的范围限制为声明变量的模块,请使用 Privatestatement 而不是 Dim 语句。 两者的效果相同,但如果使用 Private 语句,则读取代码时范围会更清晰。
 

变量的生存期

变量保留其值的时间称为生存期。 变量的值在其生存期内可能会更改,但会保留一个值。 此外,当变量失去范围时,它不再具有值。
 

初始化变量的值

运行宏时,所有变量初始化为值。 数字变量初始化为零,将可变长度字符串初始化为零长度字符串 ("") ,固定长度字符串用 ASCII 代码 0 填充。 变量变量初始化为"空"。 空变量由数字上下文中的零和字符串上下文中的零 (") 字符串表示。

过程级变量

如果具有使用 Dim 语句在宏中声明的变量,只要宏正在运行,该变量就保留其值。 如果此宏调用其他宏,则保留变量的值 (其他宏不可用,) 这些其他宏也运行。

若要演示过程级变量如何工作,请执行以下步骤:

  1. 将新模块插入到项目中。

  2. 在此模块中键入以下两个宏

    Sub Macro1()
        将 x 设置为过程级别变量
       Dim x As Integer
       MsgBox"x 的初始化值为 "& x
       x = 10
        MsgBox "x is " & x
        "下一行运行 Macro2
        Macro2
        MsgBox "x is still " & x
    End Sub
    Sub Macro2 ()
        MsgBox "x,如 Macro2 所见是 " & x
    End Sub

  3. 运行 Macro1。

  4. 收到以下消息:

        the initialized value of x is 0

  5. 单击"确定",将看到消息:

     x is 10

  6. 单击"确定",将看到以下消息

    x, as seen by Macro2 is

  7. 单击"确定"。

  8. Macro2 不显示变量 x 的值,因为变量 x 是 Macro1 的本地变量。 收到以下消息

    x is still 10

  9. 单击“确定”。

  10. 运行Macro1

会收到步骤 3 到步骤 6 中所述的消息,因为一旦 Macro1 停止在步骤 6 中运行,变量 x 的值就会丢失。 因此,在步骤 7 中重新运行 Macro1 时,第一条消息将 x 的值 (初始化的值) 。

静态关键字

如果使用 Static 关键字声明了过程级变量,该变量将保留其值,直到项目重置。 因此,如果有静态变量,则下次调用过程时,静态变量将初始化为其最后一个值。

若要了解 Static 关键字的工作原理,请执行以下步骤:

  1. Change the code in Macro1 to:
    
    Sub Macro1()
        'set x as a procedure level variable
        Static x As Integer
           MsgBox "the initialized value of x is " & x
        x = x + 10
        MsgBox "x is " & x
    End Sub
  2. 运行 Macro1。

  3. 你将收到消息

    the initialized value of x is 0

  4. 单击"确定",将看到
    消息:"x is 10

  5. 单击“确定”。

  6. 运行 Macro1,并收到以下消息

    the initialized value of x is 10

  7. 单击"确定",将看到以下消息

    x is 20

  8. 单击“确定”。

第二次在消息中显示的值不同,因为变量 x 声明为静态变量,并且变量在首次运行 Macro1 后保留其值。

注意: 如果有模块级变量,其生存期与它是静态过程级变量相同。

若要验证模块级变量的生存期,请执行以下步骤:

  1. Change the code in the module that contains Macro1 to the following:
    
    Dim x As Integer  'create a module-level variable
    Sub Macro1()
       MsgBox "the initialized value of x is " & x
       x = x + 10
       MsgBox "x is " & x
    End Sub
  2. 运行 Macro1,将看到以下消息

    the initialized value of x is 0

  3. 单击"确定",将看到以下消息

    x is 10

  4. 单击"确定",

  5. 运行 Macro1,将看到此消息

    the initialized value of x is 10

  6. 单击“确定”。

  7. 收到以下消息

    x is 20

  8. 单击“确定”。

第二次在消息中显示的值不同,因为变量 x 声明为静态变量,并且它在首次运行Macro1后保留其值。
 

重置项目以重置变量

如果要重置静态变量
或模块级变量的值,请单击 标准工具栏,或单击"运行"菜单上的"重置"。

如果对Macro1项目执行此操作,然后重新运行Macro1,变量 x 的值将初始化回零,并且将收到第一条消息:

    the initialized value of x is 0

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。

社区可帮助你提出和回答问题、提供反馈,并听取经验丰富专家的意见。

此信息是否有帮助?

你对语言质量的满意程度如何?
哪些因素影响了你的体验?
按“提交”即表示你的反馈将用于改进 Microsoft 产品和服务。 你的 IT 管理员将能够收集此数据。 隐私声明。

谢谢您的反馈!

×