【问题标题】:How do I force VBA/Access to require variables to be defined?如何强制 VBA/Access 要求定义变量?
【发布时间】:2010-11-11 11:29:05
【问题描述】:

我正在对一些 VBA 代码进行一些重大更改,并且正在删除和/或重命名一些变量。如果编译器向我抱怨变量不存在而不是动态创建它,那么找到我需要更新的所有位置会容易得多。

如何强制 VBA/Access 要求声明变量?

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    您需要在每个 VBA 代码模块(包括表单和报告)的顶部使用 Option Explicit

    您可以通过进入 VBA 编辑器 >> 工具 >> 选项 >> 编辑器选项卡并确保选中需要变量声明来为所有未来创建的模块和表单和报告后面的 VBA 代码设置此选项。

    来自 Access 2003 帮助:

    需要变量声明 — 确定模块中是否需要显式变量声明。选择此项会将Option Explicit 语句添加到任何新模块的一般声明中。

    我在调暗变量时也使用驼峰式大小写。 ThisIsAnExampleOfCamelCase。一旦我退出 VBA 代码行,如果 Access 没有将小写变量更改为驼峰式,那么我知道我有一个错字。

    【讨论】:

    • 骆驼壳尖是金色的
    【解决方案2】:

    OPTION EXPLICIT 和 Access VBA 的一些历史

    为了继续 Tony 的回答,这里解释了为什么在某些 Access 代码模块中没有启用 OPTION EXPLICIT 存在问题。

    在 Access 95 和 Access 97(前两个带有 VBA 的 Office 版本)中,Access 的代码编辑器与其他 Office 程序不同。在 Access 2000 中,Microsoft 从 Access 中的其他 Office 应用程序中实现了 VBE。同时,MS 选择让 Access VBA 模块的行为类似于其他应用程序中的模块,默认为 not 具有 OPTION EXPLICIT。

    因此,在 Access 2000 中,默认情况下,模块是在没有 OPTION EXPLICIT 的情况下创建的。

    当然,这对 MS 来说是一个非常愚蠢的设计决定,他们后来将其逆转(我不记得是 Access 2002 还是 2003 纠正了问题并在所有新模块中再次默认为 OPTION EXPLICIT )。它之所以愚蠢(MS 应该知道这一点)是因为 Access 是一个数据库应用程序开发工具,因此对强类型数据进行操作。因此,默认情况下代码环境应该是强类型的,以便它与正在处理的数据保持一致。

    在 Excel 或 Word 中,数据不是强类型的,因此对几乎所有内容使用变体数据类型更有意义,只是为了让每个人都更容易。通过不使用 OPTION EXPLICIT 来实现它的缺点是,您最终可能会出现自动引入新变量的拼写错误 [例如变量“intrdoduce”——如果我使用 OPTION EXPLICIT 写这篇文章,那么如果没有这种情况就不会发生产生运行时错误! :)]。这是所有以这种方式工作的语言的问题(我在 PHP 中工作时会大发雷霆,其中变量名可以按大小写不同,即 $Var 与 $var 不是同一个变量;但我离题了),但是MS 决定在 Word 和 Excel 中以这种方式实现它,因为如果不强制声明变量,在那里编写代码的人会更轻松。

    因此,MS 犯了一个错误,将 Access 的 VBE 版本与其他应用程序一样,尽管 Access 自己的目的内部没有支持这一举措的逻辑。然后 MS 取消了该更改并返回到以前的状态(即所有模块中默认为 OPTION EXPLICIT)。

    因此,您经常会看到在 Access 2000 中开始使用的应用程序在没有 OPTION EXPLICIT 的情况下到处都有模块。当我必须开发这样的应用程序时,我的第一个任务是在所有模块中实现 OPTION EXPLICIT,然后修复该死的东西以便它能够编译(这通常非常困难,因为这个东西是在没有它的情况下编程的)。

    【讨论】:

    • “在 Excel 或 Word 中,数据不是强类型”——my 数据是强类型(提示:其中一些来自 SQL 数据库)。在 VBA 中,我避免使用 Variant 数据类型的原因太多了,无法评论!
    • 不应使用 Variant 数据类型,除了变体数据。在我的应用程序中,Variant 数据类型的主要用途是能够处理 Null,因为您可以将 Null 存储在变体中。例如,将在查询中存在 Null 的列上使用的 UDF 将其参数定义为 Variant,这样 UDF 就不会在 Null 上发牢骚。此外,变体是子类型化的,所以它并没有那么糟糕,尽管您无法控制子类型化操作。
    • 如果您的 Excel 数据来自数据库,它不是 Word 或 Excel 数据,是吗?
    • @David-W-Fenton 我意识到迟到的回应,但在 Word 或 Excel 中,是的,当然它可能是来自数据库的数据,通过 DAO、ADODB 等。这是一种常见的情况。跨度>
    【解决方案3】:

    这个问题对 Excel 很有帮助,你可能会看看它是否适用于 Access:

    Lost Variables

    本质上,MZ-Tools 将搜索您的代码并告诉您未使用的内容。 VBA 的版本可以在here 找到。使用Review Source Code 功能。

    【讨论】:

    • 这并没有解决这个特定的问题。如果有的话,应该是评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多