首页 > 解决方案 > 添加表单控件时,全局变量莫名其妙地重置

问题描述

我有一个包含宏的 MS Excel 电子表格,并且多年来一直完美无缺。我已经无数次地复制和修改了电子表格,没有问题。直到今天。我复制了一个现有的、正常运行的文件并遇到了一个莫名其妙的问题:

电子表格包括一个收集某些数据的用户表单,其中一些数据来自框架中包含的选项按钮。收集的数据与全局变量进行比较,全局变量的值在工作簿的 Workbook_Open 子例程中设置。对于现有的工作簿,我可以随心所欲地敲打表格而不会出现问题。在副本中,我在框架中添加了一个选项按钮(它 - 仅此而已!),单击表单的“提交”按钮后,全局变量的值将丢失。(这是没有选择新选项按钮的情况。)

这种行为是可重复的,没有任何意义。任何人都可以提出为什么 Excel 的行为如此奇怪吗?注意 - 该文件没有任何外部参考。

更新:将任何新控件添加到表单时会发生此行为...

标签: vbaexcel

解决方案


由于缺乏适当的上下文而抓住了稻草,但这是最有可能发生的情况的解决方案。

你的全局变量可能是这样分配的:

Private Sub Workbook_Open()
    SomeGlobalVariable = 42
    AnotherGlobalVariable = "foo"
End Sub

将其从处理程序中拉出:

Private Sub Workbook_Open()
    AssignGlobalDefaults
End Sub

...并将此AssignGlobalDefaults过程放在标准模块(.bas)中:

Option Explicit
Option Private Module
Public SomeGlobalVariable As Long
Public AnotherGlobalVariable As String

Public Sub AssignGlobalDefaults()
    SomeGlobalVariable = 42
    AnotherGlobalVariable = "foo"
End Sub

现在,当您对需要重新编译 VBA 代码的项目进行更改时,请转到即时窗格(Ctrl+G) 并AssignGlobalDefaults在测试代码之前键入。

保存,然后关闭。现在重新打开。还是坏了?怀疑如此。


全局变量存在于运行时上下文中。如果代码正在运行,那么它们还活着。当您终止该上下文时,仍然可以访问全局变量,但是由于Workbook_Open是唯一分配它们的东西(对吗?)并且该处理程序仅在打开工作簿时才运行,因此这些值不会自动重新分配的。

关键字会终止执行上下文 - 如果该End关键字在您的代码中的任何位置,请将其删除。End即时窗格中键入也将执行相同的操作。

更改项目引用也会终止执行上下文。从项目中删除模块也是如此。

换句话说,您永远不能假设您可以对 VBA 项目进行更改并保留全局变量值。有时有效,有时无效,具体取决于您所做的更改以及它如何影响基础 P 代码。

解决方案是有一个过程负责初始化全局变量,并在需要初始化全局变量时调用它。


推荐阅读