vba - 添加表单控件时,全局变量莫名其妙地重置
问题描述
我有一个包含宏的 MS Excel 电子表格,并且多年来一直完美无缺。我已经无数次地复制和修改了电子表格,没有问题。直到今天。我复制了一个现有的、正常运行的文件并遇到了一个莫名其妙的问题:
电子表格包括一个收集某些数据的用户表单,其中一些数据来自框架中包含的选项按钮。收集的数据与全局变量进行比较,全局变量的值在工作簿的 Workbook_Open 子例程中设置。对于现有的工作簿,我可以随心所欲地敲打表格而不会出现问题。在副本中,我在框架中添加了一个选项按钮(它 - 仅此而已!),单击表单的“提交”按钮后,全局变量的值将丢失。(这是没有选择新选项按钮的情况。)
这种行为是可重复的,没有任何意义。任何人都可以提出为什么 Excel 的行为如此奇怪吗?注意 - 该文件没有任何外部参考。
更新:将任何新控件添加到表单时会发生此行为...
解决方案
由于缺乏适当的上下文而抓住了稻草,但这是最有可能发生的情况的解决方案。
你的全局变量可能是这样分配的:
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 代码。
解决方案是有一个过程负责初始化全局变量,并在需要初始化全局变量时调用它。
推荐阅读
- firebase - Firestore 文档的最大字段数?
- r - 找不到在 for 每个循环中声明的函数
- scala - 在 scala 函数中按名称参数调用
- android - Flutter 中的 AndroidManifest 中缺少默认通知通道元数据
- keycloak - 那么如何用不同的java启动keycloak在系统中
- python - 成员在每个组中出现一次的独特对组
- c++ - 通用引用和打包字段
- sql - 在其他表中查找并获取数据
- ios - 在 Swift (iOS) 中隐藏元素并占用其空间
- hadoop - 如何配置 Hive Metastore 以使用本地文件系统而不是 Derby?