如何在 Visual Basic for Applications 的 Excel 子过程中使用变量

简介

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

详细信息

子过程中的变量

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

  • 如何声明变量。
  • 可以使用 变量的过程和项目。
  • 变量的生存期。

在宏中声明变量

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

    Dim x As Integer, y As Integer

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

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

如果未指定每个变量的数据类型(如以下 Visual Basic 代码所示),则只有变量 y 设置为整数变量。 变量 x 将是变体类型:

    Dim x, y As Integer

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

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

  1. 保存并关闭任何打开的工作簿,然后打开新工作簿。

  2. 启动 Visual Basic 编辑器 (按 alt+F11) 。

  3. 在“插入”菜单上,单击“模块”

  4. 键入以下代码:

    Sub Variable_Test()
        Dim x As Integer,y As Integer
        x = 10
        y = 100
        MsgBox“x 的值为”& x & _
        Chr (13) &“y 的值为”& y
    End Sub

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

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

  6. 单击“确定”。

  7. Variable_Test 宏中更改以下行:

    x = 10

  8. 需要:

    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 声明为“Public x As Integer”后,项目中的所有三个宏都可以访问 x 的值。 第一个消息框显示值 10。 第二个消息框显示值 20 (因为 x 乘以 2 Macro_1b) 。 第三个消息框显示值 60 (,因为 x 的值在 Macro_1b 中更改为 20,然后在 Macro2) 中将其乘以 3。

  9. 将第一个模块中的声明行更改为:

       Public x As Integer

    需要:

       Dim x As Integer

  10. 运行 Macro_1a 宏。

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

  12. 将第一个模块中的声明行更改为:

      Dim x As Integer

    需要:

        Private x As Integer

  13. 运行 Macro_1a 宏。

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

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

变量的生存期

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

初始化变量的值

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

过程级变量

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

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

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

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

    Sub Macro1()
        'set 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 的值显示为零, (初始化的值) 。

静态关键字 (keyword)

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

若要查看静态关键字 (keyword) 的工作原理,请执行以下步骤:

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
  1. 运行 Macro1。

  2. 你将收到消息:

    the initialized value of x is 0

  3. 单击“ 确定”,将收到消息:

    x is 10

  4. 单击“确定”。

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

    the initialized value of x is 10

  6. 单击“ 确定”,将收到以下消息:

    x is 20

  7. 单击“确定”。

消息中显示的值第二次不同,因为变量 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
  1. 运行 Macro1,将收到以下消息:

    the initialized value of x is 0

  2. 单击“确定”,将收到以下消息:

    x is 10

  3. 单击“确定”,

  4. 运行 Macro1,将收到以下消息:

    the initialized value of x is 10

  5. 单击“确定”。

  6. 收到以下消息:

    x is 20

  7. 单击“确定”。

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

重置项目以重置变量

如果要重置静态变量或模块级变量的值,请单击 上的“ 重置 ”按钮
Standard工具栏,或单击“运行”菜单上的“重置”。

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

    the initialized value of x is 0