删除工作表后,VBA全局variables不再声明

我有一些公开的工作表variables,当工作簿打开时,首先进行初始化。 我有一个button,基本上这样做:

Dim Response As Variant Response = MsgBox("Are you sure you want to delete this worksheet?", vbYesNo + vbExclamation, "Confirm Action") If Response = vbNo Then GoTo exit sub End If 'Save workbook prior to deletion as a precaution ThisWorkbook.Save ActiveSheet.Delete 

出于某种原因,运行后,这些工作表variables不再声明,我必须每次重新初始化它们。 我尝试添加我的InitVariablesmacros调用.Delete后,它仍然无法正常工作。

任何理由为什么这可能会发生?

原因实际上非常简单 – 工作表是VBA中的一个类,它的代码模块会与您的项目的其余部分一起编译, 即使它是空的 。 当您删除工作表并让代码执行停止时,下次运行某些代码时,VBE必须重新编译该项目,因为您已经删除了一个代码模块。 这会导致您的自定义类扩展失去其状态。

请注意,除非代码停止运行并重新编译,否则不会发生这种情况。 这工作得很好:

 Sheet1.foo = 42 'foo is a public variable in Sheet1 Sheet2.Delete Debug.Print Sheet1.foo 'Prints 42 

我只是用Comintern foo来testing它。 有趣的是,标准模块foo会损失它的价值,但工作表模块中的公共foovariables不会失去它的价值。

在这里输入图像描述