删除工作表后不再声明VBA全局变量

Kin*_*ong 5 excel vba excel-vba

我有一些公共工作表变量,首先在工作簿打开时初始化.我有一个按钮,基本上这样做:

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
Run Code Online (Sandbox Code Playgroud)

由于某些原因,在运行之后,这些工作表变量不再被声明,我每次都必须重新初始化它们.我尝试在.Delete之后添加我的InitVariables宏调用,但它仍然不起作用.

有什么理由可能会发生这种情况?

Com*_*ern 10

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

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

Sheet1.foo = 42        'foo is a public variable in Sheet1
Sheet2.Delete
Debug.Print Sheet1.foo 'Prints 42
Run Code Online (Sandbox Code Playgroud)