关于 excel:运行时错误 91 对象变量或未设置块变量 – 使用公共变量

RunTime Error 91 Object variable or With block variable not set - Use of Public Variables

我目前正在开展一个项目,该项目整合了来自多个工作簿的信息。虽然应用程序的第一个版本广泛使用了 SelectActivate,但根据我在此站点上看到的信息,应尽可能避免使用这些方法。因此,我目前正在重新修改代码以尽可能消除这些。

我使用的工作簿有一个非常隐藏的参考表。为了参考这张表,我在第一个模块的开头做了一些公开声明;其中之一是

1
Public refsheet as Worksheet

请注意,打开工作簿后可能无法使用此模块。

问题 1:如果我在此模块中定义了未使用的公共变量,这是否会导致问题?如果确实导致问题,应该在哪里定义这些公共变量?

Workbook_Open() 事件中,我有以下内容:

1
2
3
4
5
6
7
8
9
10
11
Private Sub Workbook_Open()

Set refsheet = Sheets("References")
Set corang = Sheets("Consolidation").Range("L2:AI2")

Application.ScreenUpdating = False
refsheet.Visible = xlSheetVeryHidden
Application.ScreenUpdating = True


End Sub

问题 2:如果我在 Workbook_Open() 子中设置了 refsheet,鉴于它已被定义为公共变量,它是否可以在所有其他模块中使用?

当我在使用后第一次运行代码时,第一次使用 refsheet 没问题,之后任何时候使用 refsheet,我都会收到运行时错误 91;未设置对象变量或 With 块变量。


我的建议是:完全放弃该公共变量 - Workbook_Open 恶作剧。为什么你需要这个 refsheet 变量?你可能不知道。公共变量并不总是一个坏主意。他们只是通常是个坏主意。

只需通过 NameCodeName 引用工作表。示例:

1
2
Worksheets("References").Range("A1").Value ="Hello world!" ' Name is"References"
shtReferences.Range("A2").Value ="Hello world!" ' CodeName is shtReferences

第二个假设您在"属性"窗口的顶行 (Name) 中将工作表的 CodeName 更改为 shtReferences,如下例所示。这是我最喜欢引用工作表的方式,因为它可以防止用户在工作表选项卡中更改工作表的 Name 的情况。

注意:(Name) 代表CodeName,这与没有括号的Name 不同!有点混乱,我知道。

enter

1
2
MsgBox shtReferences.Name ' returns"References"
MsgBox shtReferences.CodeName ' returns"shtReferences"


我认为发生了其他事情。我把它放在工作簿代码区:

1
2
3
4
Private Sub Workbook_Open()
    Set MySheet = Sheets("xxx")
    MySheet.Visible = xlSheetVeryHidden
End Sub

我把它放在一个标准模块中:

1
2
3
4
5
Public MySheet As Worksheet

Sub MAIN()
    MsgBox MySheet.Name
End Sub

重新打开文件后,我通过运行 MAIN 得到了预期的结果。

在新的工作簿中试试这个,看看你是否复制了我所看到的。