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

文章翻译 文章翻译
文章编号: 843144 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

简介

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

更多信息

子过程中的变量

编程语言的强大功能在于能够将一些内容存储在变量中,这样就可以在过程中稍后使用或更改该变量的内容。本文档讨论有关在 Visual Basic 中使用变量的以下信息:
  • 如何声明变量。
  • 可使用变量的过程和项目。
  • 变量的生存期。

在宏中声明变量

在宏中声明变量的最简单方法是使用“Dim”语句。以下行将两个变量(x 和 y)声明为整数:
Dim x As Integer, y As Integer
通过将 x 和 y 指定为整数,您告知 Visual Basic 为整数变量留出足够的内存(x 和 y 各 2 个字节),并且存储在 x 或 y 中的信息是一个介于 -32768 和 32767 之间的整数。

注意:如果通过使用单一“Dim”语句声明了多个变量,您必须为每个变量指定数据类型。

如果不为每个变量指定数据类型(像以下 Visual Basic 代码中一样),则只有变量 y 会被设置为整数变量。变量 x 将为 Variant 类型:
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 "the value of x is " & x & _
    Chr(13) & "the value of y is " & y
    End Sub
  5. 运行“Variable_Test”宏。您将收到以下消息:
    the value of x is 10
    the value of y is 100
  6. 单击“确定”。
  7. 在“Variable_Test”宏中,更改以下一行:
    x = 10
    

    更改为:
    x = "error"
    
  8. 运行“Variable_Test”宏。
您将看到一个运行时错误,因为“error”不是一个整数,而您试图将此字符串值赋给整数变量 x。

数据类型摘要

下表列出了常见的变量数据类型:

收起该表格展开该表格
数据类型存储大小允许的范围
Boolean2 字节True 或 False
Integer2 字节-32,768 到 32,767
Long4 字节-2,147,483,648 到 2,147,483,647
Double8 字节对于负值为 -1.79769313486232E308 到 -4.94065645841247E-324;对于正值为 4.94065645841247E-324 到 1.79769313486232E308
Currency8 字节-922,337,203,685,477.5808 到 922,337,203,685,477.5807
Date8 字节100 年 1 月 1 日到 9999 年 12 月 31 日
String10 字节 + 字符串长度

Variant 数据类型

如果在声明变量时不指定数据类型,或者根本未声明变量,Visual Basic 将自动为此变量指定 Variant 数据类型。下面是声明为此数据类型的变量的优势:
  • 变量可以包含字符串、日期、时间、布尔值或数字值。
  • 变量可以自动转换它们所包含的值。
缺点是 Variant 变量至少需要 16 字节的内存。在较大的过程或复杂的模块中,16 字节的内存可能非常大。

要了解此数据类型在“Variable_Test”宏中如何工作,请按照下列步骤操作:
  1. 将“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
    
  2. 运行“Variable_Test”宏。
您将不会看到错误,因为可以将任何内容赋给 Variant 变量 x 和 y。

注意:您也可以省略下面一行,该宏仍然能够工作,因为变量 x 和 y 被视作 Variant 数据类型:
Dim x, y

变量的作用域

当您声明变量时,同一模块、其他模块或其他项目中的其他宏可能会看到该变量,也可能看不到该变量。这种变量在模块中的可用性称为作用域。作用域的三种类型分别为过程级别、私有模块级别以及公共模块级别。作用域取决于您声明变量的方式和位置。

过程级别作用域

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

要验证具有过程级别作用域的变量是否只能在声明该变量的过程内部看到,请按照下列步骤操作:
  1. 在项目中插入一个新模块。
  2. 在此模块中同时键入下面两个宏:
    Sub Macro1()
    Dim x As Integer
    x = 10
    MsgBox "x, as seen by Macro1 is " & x
    'the next line runs Macro2
    Macro2
    End Sub
    Sub Macro2()
    MsgBox "x, as seen by Macro2 is " & 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. 在此模块中键入以下代码:
    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”宏。

    由于变量 x 声明为“Public x As Integer”,因此项目中的所有三个宏都能访问 x 的值。第一个消息框显示值 10。第二个消息框显示值 20(因为在“Macro_1b”中 x 与 2 相乘)。第三个消息框显示值 60(因为 x 的值在“Macro_1b”中变成了 20,然后在“Macro2”中又乘以 3)。
  8. 将第一个模块中的声明行从:
    Public x As Integer

    更改为:
    Dim x As Integer
  9. 运行“Macro_1a”宏。

    由于变量 x 声明为“Dim x As Integer”,因此只有第一个模块中的宏能访问 x 的值。这样,第一个消息框将显示值 10,第二个消息框将显示值 20(因为 x 在“Macro_1b”中与 2 相乘),而第三个消息框显示值 0(因为“Macro2”看不到 x 的值,“Macro 2”使用了未初始化的值 0)。
  10. 将第一个模块中的声明行从:
    Dim x As Integer

    更改为:
    Private x As Integer
  11. 运行“Macro_1a”宏。
使用“Private”语句作用域时显示的消息框与使用“Dim”语句时显示的消息框相同。变量 x 具有相同的作用域,对于在其中声明该变量的模块是私有的。

注意:如果要将变量的作用域限制为在其中声明该变量的模块,请使用“Private”语句,而不是“Dim”语句。这两个语句都可达到相同的效果,但是,如果使用“Private”语句,当您在阅读代码时,作用域将更清晰。

变量的生存期

变量保留其值的一段时间称为变量的生存期。变量的值在其生存期中可能会发生变化,但变量将保留一个值。同时,当变量失去作用域时,它就不再拥有值。

初始化变量的值

当您运行宏时,所有变量都被初始化为一个值。数值变量被初始化为零,可变长度字符串被初始化为一个零长度字符串 (""),固定长度字符串则被填满 ASCII 代码 0。Variant 变量被初始化为空。空变量由零(在数值上下文中)和零长度字符串 ("")(在字符串上下文中)表示。

过程级别的变量

如果有一个通过使用“Dim”语句在宏中声明的变量,只要宏在运行,变量就将保留其值。如果此宏调用其他宏,那么,只要这些宏也在运行,变量的值就会保留(尽管其他宏无法使用该值)。

要演示过程级别的变量如何工作,请按照下列步骤操作:
  1. 在项目中插入一个新模块。
  2. 在此模块中同时键入下面两个宏:
    Sub Macro1()
    'set x as a procedure level variable
    Dim x As Integer
       MsgBox "the initialized value of x is " & x
    x = 10
    MsgBox "x is " & x
    'the next line runs Macro2
    Macro2
    MsgBox "x is still " & x
    End Sub
    Sub Macro2()
    MsgBox "x, as seen by Macro2 is " & x
    End Sub
    
  3. 运行“Macro1”。

    您将收到以下消息:
    the initialized value of x is 0
  4. 单击“确定”。

    您将收到以下消息:
    x is 10
  5. 单击“确定”。

    您将收到以下消息:
    x, as seen by Macro2 is
  6. 单击“确定”。

    “Macro2”不会显示变量 x 的值,因为变量 x 是“Macro1”的局部变量。您将收到以下消息:
    x is still 10
  7. 单击“确定”。
  8. 运行“Macro1”。
您将收到在步骤 3 到 6 中描述的相同消息,因为一旦“Macro1”在步骤 6 中停止运行,变量 x 的值就会丢失。因此,当您在步骤 7 中重新运行“Macro1”时,第一个消息会将 x 的值显示为零(初始化的值)。

Static 关键字

如果过程级别变量是通过使用 Static 关键字声明的,则变量将保留其值,直至重置项目时为止。因此,如果有一个静态变量,则在下一次调用过程时,该静态变量将被初始化为其上次的值。

要了解 Static 关键字的工作方式,请按照下列步骤操作:
  1. 将“Macro1”中的代码更改为:
    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”。

    您将收到以下消息:
    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. 将包含“Macro1”的模块中的代码更改为如下代码:
    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. 单击“确定”。

    您将收到以下消息:
    x is 20
  7. 单击“确定”。
出现在各个消息中的值第二次都不相同,因为变量 x 被声明为一个静态变量,当您第一次运行“Macro1”后,该变量将保留其值。

重置项目以重新设置变量

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

如果对“Macro1”项目执行此操作,然后重新运行“Macro1”,变量 x 的值将被重新初始化为零,并且您将收到第一个消息:
the initialized value of x is 0
有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
843145 Visual Basic for Applications 的子过程中的数组说明
返回页首

属性

文章编号: 843144 - 最后修改: 2007年2月26日 - 修订: 3.0
这篇文章中的信息适用于:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 标准版
  • Microsoft Excel 2000 标准版
  • Microsoft Excel 97 标准版
关键字:?
kbinfo kbprogramming kbvba KB843144
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com