全局variables自动重置

我想定义一个全局variables作为打开文件的工作表,所以我使用了下面的代码:

在Module1中:

Public mySheet As Worksheet 

在ThisWorkbook:

 Sub Workbook_Open() Set mySheet = Sheet1 End Sub 

然后,我想使用mySheet在各个过程中引用这个特定的工作表,其中一些引用了这个工作表打开了一个新文件。

它最初工作 – 当我打开文件的variables设置,并涉及mySheet.UnprotectmySheet.ProtectmySheet.Range("A1")的macros的作品。 但是,当我尝试再次运行它时,我得到一个错误的Object variable or With block variable not set ,debugging带我到mySheet.Unprotect行,这是第一次引用表。

我怎样才能定义这个工作表在一个全局variables,使定义坚持?

作为参考,我指的特定的macros是在下面,虽然我有一个类似的问题与不同的代码位:

 Sub mySub() mySheet.Unprotect With Application.FileDialog(msoFileDialogOpen) .AllowMultiSelect = False If .Show <> 0 Then mySheet.Range("A1") = .SelectedItems(1) End If End With mySheet.Protect End Sub 

我个人build议你创build一个返回该表的函数。 那么你基本上可以使用函数名作为工作表variables。 (虽然如果你总是希望同一张纸,你可以使用Sheet1代号)

 Function MySheet() As Excel.Worksheet Set MySheet = Sheet1 End Function 

并使用,例如:

 Sub foo() MsgBox MySheet.Name End Sub 

正如从其他答案的链接中提到的,你可以理解为什么发生这种情况。

这是我build议绕过这个问题。

在模块中创build一个过程。 将它命名为Init

 Public mySheet As Worksheet Sub Init() Set mySheet = Sheet1 End Sub 

然后在你的Workbook_Open()做到这一点。

 Sub Workbook_Open() Init End Sub 

现在你只要再添加一行就可以使用这个对象

 Sub mySub() If mySheet is Nothing then Call Init '<== Add this mySheet.Unprotect With Application.FileDialog(msoFileDialogOpen) .AllowMultiSelect = False If .Show <> 0 Then mySheet.Range("A1") = .SelectedItems(1) End If End With mySheet.Protect End Sub 

在这里看到一个非常类似的post …重申有什么,这种行为可能是由以下原因造成的:

  1. 使用“结束”(而不是“结束小组”,只是它自己的“ 结束 ”声明)。
  2. 未处理的运行时错误(所以如果你的任何代码抛出一个错误,你失去了你的全局variables)
  3. 编辑代码(包括按停止button)
  4. closures包含VB项目的工作簿(你已经在注释部分已经排除的东西)。

一种解决scheme是简化公用variables重新初始化与子程序。 这个子程序然后可以在其他行的开始被调用,或者根据需要从error handling中调用。 不断重新初始化variables的不利之处在于它们在保存可变信息方面失去了可靠性。