在私有子中引用公共变量时遇到问题

Posted

技术标签:

【中文标题】在私有子中引用公共变量时遇到问题【英文标题】:Trouble Referencing Public Variable in Private Sub 【发布时间】:2021-07-16 21:38:15 【问题描述】:

我有一个非常基本的问题让我发疯,我这辈子都想不通。

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

如果我输入工作表的名称而不是尝试使用变量,我可以将其打开到我想要的页面,但是看到这个页面将根据正在工作的内容是动态的,这不是我们想要的结果。

声明:'(在我的 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,并在模块中创建一个公共子,仅用于设置该变量,没有任何效果。

编辑改变 ActiveWorkbook.Sheets(wsWorking).Activate

行到

wsWorking.Activate

只给我一个新错误“运行时错误'424':需要对象”。我不相信一个模块中的变量设置会转移到另一个模块中。

【问题讨论】:

应该只是:wsWorking.Activate 变量已经是包含工作簿的工作表对象。或者,如果你愿意,你可以这样做:ActiveWorkbook.Sheets(wsWorking.name).Activate,但那是很长的路要走。 公共变量应该在标准模块中声明。 【参考方案1】:

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

Debug.Print ThisWorkbook.wsWorking.Name

如果你想要一个 global 变量,那么你不能使用对象模块,因为对象需要一个实例(自动创建的 ThisWorkbook 实例不会使它不再是一个对象实例)。改为在标准模块中声明一个公共变量,然后您就可以从代码中的任何位置无限制地访问它,无论是读取还是写入。

等等。大声说出来。

然后您可以从代码中的任何位置无限制地访问它,无论是读取还是写入。

这可能不是一个好主意。考虑将其声明为 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,但很有可能不是。如果不是,这炸毁。 wsWorkingWorksheet 引用,从 Sheets 集合中取消引用它(按名称,隐含!)是多余的 - 只需 ThisWorkbook.wsWorking.Activate 即可。

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

每个Worksheet 模块都有一个(Name) 属性,它是VB 项目组件的名称;这个值变成了一个全局对象的名字,就像ThisWorkbook。请参阅implicit containing workbook reference Rubberduck 检查了解更多信息。

【讨论】:

以上是关于在私有子中引用公共变量时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

jarsigner 找不到XXX的证书链。xxx必须引用包含私有密钥和相应的公共密钥证书链的有效密钥库密钥条目

jarsigner 找不到XXX的证书链。xxx必须引用包含私有密钥和相应的公共密钥证书链的有效密钥库密钥条目

jarsigner 找不到XXX的证书链。xxx必须引用包含私有密钥和相应的公共密钥证书链的有效密钥库密钥条目

vbval 与公共变量 [关闭]

在构造函数中初始化公共静态最终变量

来自孩子的PHP私有变量访问