运行时错误91对象变量或未设置块变量 - 使用公共变量

时间:2014-06-12 11:26:30

标签: excel excel-vba vba

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

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

Public refsheet as Worksheet

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

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

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

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;对象变量或未设置块变量。

2 个答案:

答案 0 :(得分:1)

我的建议是:删除那个公共变量 - Workbook_Open shenanigan完全。为什么你需要这个refsheet变量?你可能没有。公共变量总是一个坏主意;他们只是通常是个坏主意。

只需通过其Name或其CodeName来查看表单。例如:

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

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

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

enter image description here

请注意,默认情况下,CodeName张为Sheet1Sheet2,...令人困惑的是,Name张是Sheet1张默认情况下还有Sheet2Name等。但CodeName(Name) / MsgBox shtReferences.Name ' returns "References" MsgBox shtReferences.CodeName ' returns "shtReferences" 没有关联,可以单独更改。

{{1}}

答案 1 :(得分:0)

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

Private Sub Workbook_Open()
    Set MySheet = Sheets("xxx")
    MySheet.Visible = xlSheetVeryHidden
End Sub

我把它放在标准模块中:

Public MySheet As Worksheet

Sub MAIN()
    MsgBox MySheet.Name
End Sub

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

在新工作簿中尝试此操作,看看您是否复制了我所看到的内容。