返回代码(VBA)时,公共值不更新

Posted

技术标签:

【中文标题】返回代码(VBA)时,公共值不更新【英文标题】:Public value does not updated when going back to code (VBA) 【发布时间】:2020-01-08 11:33:29 【问题描述】:

当 Form 关闭并且代码导航回宏时,公共变量没有更新。

我创建的表单只有两个按钮“是”和“否”。当用户单击“否”时,我希望将变量设置为 false,如果“是”,它将为 true。

这是工作表代码

Public bool As Boolean

Sub test2()
    Claims.Show

    If bool = True Then
        Range("A1") = "Yes"
    ElseIf bool = False Then
        Range("A1") = "No"
    Else
        Range("A1") = "Nothing"
    End If
End Sub

在我想要一个值的表单下方

Priate Sub No_Click()
    bool = False
    Unload Me
End Sub

Private Sub Yes_Click()    
    bool = True
    Unload Me
End Sub

【问题讨论】:

@Dorian 否,但公共变量必须在模块中而不是在工作表代码中才能在所有模块中全局可用。如果它在一个模块中,则可以使用 all 个模块。 您的所有模块中都有Option Explicit 吗?这会有所帮助。 那是Pirate Sub吗?我想你拼错了Private 那你应该添加它.... 不确定你到底想要做什么,但绝对考虑使用参数而不是可变全局状态 - 未来你提前感谢你 ;-) 见 this article (免责声明:我写的)了解更多使用模态表单和对话框的可靠方法。 【参考方案1】:

    在不在ThisWorkbook的模块中声明变量。

    Public bool As Boolean 'in a module
    

    那么Test2的过程就可以在ThisWorkbook:

    Sub test2()
        Claims.Show
    
        If bool Then
            Range("A1") = "Yes"
        Else
            Range("A1") = "No"
        End If
    End Sub
    

    注意bool 只能是TrueFalse 没有3ʳᵈ 选项。所以可以减少。另请注意,您应该为ThisWorkbook.Worksheets("Sheet1").Range("A1") = "Yes" 等范围指定工作表,否则 Excel 将使用哪个工作表处于活动状态。

    你想把按钮放在哪里的程序

    Private Sub No_Click()
        bool = False
        Unload Me
    End Sub
    
    Private Sub Yes_Click()    
        bool = True
        Unload Me
    End Sub
    

我建议始终激活Option Explicit:在 VBA 编辑器中转到 工具选项Require Variable Declaration。这会产生一个警告来防止这个问题。

【讨论】:

是否值得一提全局变量的适当语法?例如,您在模块gvar 中有Public blah,然后在引用时您将编写gvar.blah。如果不使用 Option Explicit,从技术上讲,您可以使用特定于当前模块的 new 变量。 @Cyril 你可以测试它,但我相信如果Option Explicit 关闭并且你在模块中声明一个公共变量,它将始终使用声明的变量而不是生成一个本地新变量。跨度> 这是真的. @MathieuGuindon 嗯,这是真的。完全排位赛总是一个好主意:) @Pᴇʜ 我测试过,它确实可以识别没有模块限定的通用公共变量 (blah)。值得一提的是,您可以在每个模块中拥有同名的公共变量,因此您需要适当地限定。 Public blah as string 在一个模块中,Public blah as long 在另一个模块中......在尝试破译另一个人的密码时是有趣的一天。

以上是关于返回代码(VBA)时,公共值不更新的主要内容,如果未能解决你的问题,请参考以下文章

VBA 从用户窗体更新公共数组

VBA 公共变量

Excel VBA 类属性返回公共长变量,但不是公共字符串变量

尝试调用外部 VBA 函数时,只能强制在公共对象模块中定义的用户定义类型

VBA:公共变量与属性

VBA 定义一个简单的静态公共数组