无法在 Private Sub 中引用 Public 变量

Trouble Referencing Public Variable in Private Sub

我有一个非常基本的问题快把我逼疯了,我一辈子都弄不明白。

我有一个工作簿,其中有几个 sheet 包含的单元格打开相同的用户窗体进行填写。目前,代码已将表单 return 工作簿特别关闭到一页。我正在尝试将工作簿 return 转到之前正在处理的页面;为此,我设置了一个 public worksheet 变量 (wsWorking),该变量将设置为 sheet 在打开用户窗体之前最后一次单击。但是,这样做时,我总是会收到“运行 时间错误‘9’:下标超出范围”消息,并且调试消息显示我的 wsWorking 变量为空。

如果我输入 sheet 的名称而不是尝试使用该变量,我可以将它打开到我想要的页面,但是看到这个页面将是动态的,具体取决于正在工作的内容,这不是想要的结果。

声明:'(在我的 ThisWorkbook 模块中,(一般)(描述)

Public wsWorking As Worksheet 

尝试设置:'(在私有模块中,已删除无关代码)

Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Set wsWorking = ThisWorkbook.Worksheets("MRL 1")
    Dim clickRow As Integer
    Dim ClickCol As Integer

尝试使用:(在不同的私有模块中)

Private Sub CloseForm_Click()
    Call SaveFormToScorecard_Click
    Unload Me
    ActiveWorkbook.Sheets(wsWorking).Activate
End Sub

任何想法或建议将不胜感激 - 我已经尝试在模块的一般声明中设置 wsWorking,当工作 sheet 被激活时,并在其中创建了一个 public 子该模块仅用于设置该变量,并且 none 有效。

EDIT 更改 ActiveWorkbook.Sheets(wsWorking).激活

线到

wsWorking.Activate

只给我一个新错误“运行-Time Error '424': Object Required”。我不相信一个模块中的变量设置会转移到另一个模块。

ThisWorkbook 是一个 class 模块,具有 PredeclaredId 属性,可以从任何地方访问它,但它的成员仍然是 its 成员.您可以从代码中的任何地方访问 ThisWorkbook 的任何 public 成员,方法是使用预先声明的 ThisWorkbook 对象对其进行限定:

Debug.Print ThisWorkbook.wsWorking.Name

如果你想要一个全局变量,那么你不能使用对象模块,因为对象需要一个实例(自动创建的ThisWorkbook实例不会使它至少是一个对象实例)。相反,在 标准模块 中声明一个 public 变量,然后您可以从代码中的任何地方无限制地访问它,无论是读取它还是编写它。

等等。大声说出来。

and then you can access it unqualiifed from anywhere in your code, whether to read it or to write it.

这可能不是个好主意。考虑声明它 Private,并且仅将其公开为 Public Property Get,这样它 就不会 随时被任何地方的任何内容覆盖。

如果 ThisWorkbook 中的 Public 应该可以工作:

Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Set ThisWorkbook.wsWorking = ThisWorkbook.Worksheets("MRL 1")
    Dim clickRow As Integer '<~ this will explode at row 32,768. Use a Long!
    Dim ClickCol As Integer '<~ should still be a Long

这里有几个严重的问题:

    Call SaveFormToScorecard_Click '<~ event handlers aren't supposed to be invoked like this
    Unload Me '<~ self-destructing object, danger!
    ActiveWorkbook.Sheets(wsWorking).Activate '<~ will throw error 1004 End Sub ```

ActiveWorkbook当时处于活动状态的任何工作簿,虽然那是 可能 ThisWorkbook ,很有可能不是。只要不是,这个 就会 爆炸。 wsWorking 是一个 Worksheet 引用,从 Sheets 集合中取消引用它(按名称,隐含地!)是多余的 - 只需 ThisWorkbook.wsWorking.Activate 即可。

请注意,如果 wsWorking 在编译时存在于 ThisWorkbook 中,您最好只使用它自己的预声明实例。

每个 Worksheet 模块都有一个 (Name) 属性 是 VB 项目组件的名称;这个值成为全局对象的名称,就像 ThisWorkbook 一样。有关详细信息,请参阅 implicit containing workbook reference Rubberduck 检查。