Vba 添加表单控件时,全局变量会莫名其妙地重置

Vba 添加表单控件时,全局变量会莫名其妙地重置,vba,excel,Vba,Excel,我有一个MS Excel电子表格,其中包含宏,多年来一直完美地工作。我已经复制和修改了无数次的电子表格没有问题。直到今天。我复制了一个现有的、功能正常的文件,遇到了一个无法解释的问题: 电子表格包括一个收集特定数据的用户表单,其中一些数据来自框架中包含的选项按钮。将收集的数据与全局变量进行比较,全局变量的值在工作簿的“工作簿\打开”子例程中设置。对于现有的工作簿,我可以在表格上尽可能用力地敲打而不会出现问题。在副本中,我在框架中添加了一个选项按钮(仅此而已!),单击表单的“提交”按钮后,全局变量

我有一个MS Excel电子表格,其中包含宏,多年来一直完美地工作。我已经复制和修改了无数次的电子表格没有问题。直到今天。我复制了一个现有的、功能正常的文件,遇到了一个无法解释的问题:

电子表格包括一个收集特定数据的用户表单,其中一些数据来自框架中包含的选项按钮。将收集的数据与全局变量进行比较,全局变量的值在工作簿的“工作簿\打开”子例程中设置。对于现有的工作簿,我可以在表格上尽可能用力地敲打而不会出现问题。在副本中,我在框架中添加了一个选项按钮(仅此而已!),单击表单的“提交”按钮后,全局变量的值将丢失。(这不需要选择“新建选项”按钮。)

这种行为是可重复的,毫无意义。有人能解释为什么Excel的行为如此奇怪吗?注意-该文件没有任何外部引用


更新:当任何新控件被添加到表单中时,就会发生这种行为…

由于缺乏适当的上下文而抓住稻草,但这里有一个最可能的解决方案

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

Private Sub Workbook_Open()
    SomeGlobalVariable = 42
    AnotherGlobalVariable = "foo"
End Sub
将其从处理程序中拉出:

Private Sub Workbook_Open()
    AssignGlobalDefaults
End Sub
…并将此
AssignGlobalDefaults
过程置于标准模块(.bas)中:

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

保存,然后关闭。现在重新开放。还是坏了?毫无疑问


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

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

更改项目引用也会终止执行上下文。从项目中删除模块也会执行相同的操作

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


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

由于缺乏适当的上下文,需要抓住救命稻草,但这里有一个最可能的解决方案

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

Private Sub Workbook_Open()
    SomeGlobalVariable = 42
    AnotherGlobalVariable = "foo"
End Sub
将其从处理程序中拉出:

Private Sub Workbook_Open()
    AssignGlobalDefaults
End Sub
…并将此
AssignGlobalDefaults
过程置于标准模块(.bas)中:

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

保存,然后关闭。现在重新开放。还是坏了?毫无疑问


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

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

更改项目引用也会终止执行上下文。从项目中删除模块也会执行相同的操作

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


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

保存并重新打开了吗?当您添加按钮时重新编译代码时,存储在内存中的变量将丢失。您是否碰巧在任何地方有
End
指令?没有End指令您是否保存并重新打开了?当您添加按钮时重新编译代码时,存储在内存中的变量将丢失。您是否碰巧在任何地方有
结束
指令?无结束指令L-感谢反馈并允许我澄清。无论打开/关闭了多少次,现有电子表格上的表单都有效。当我向窗体添加任何控件,然后手动执行工作簿_Open子例程(以定义全局变量)时,窗体在第一次打开时工作正常,但之后无法正常工作。全局变量是问题的症状,而不是原因。@GRoston所以。。。这是不是意味着它是固定的?如果你不打算给我们看任何代码,那可能是你能得到的唯一可能的答案。不是固定的。我将“回答我自己的问题”,以便提供代码链接和具体说明,以显示问题。问题(?)已解决??如果我保存并退出Excel,然后重新打开文件,这种奇怪的行为就会消失。根据上面的注释,每次在编辑表单的会话期间关闭表单时,几乎都会停止执行上下文。不知道该说什么/想什么-我做了很多Excel宏工作,不记得曾经经历过这种奇怪的事情。我应该把某人的回答标记为答案吗?谢谢你的反馈和允许