【问题标题】:Declare global CheckBox variable in Word VBA在 Word VBA 中声明全局 CheckBox 变量
【发布时间】:2020-06-30 20:14:22
【问题描述】:

我的 word 文档至少有 2 个CheckBoxes。我想将它们声明为全局变量以经常使用它们。由于某种原因,我无法将它们声明为变量,这很糟糕。

Dim cb1 As CheckBox
Dim cb2 As CheckBox
'here are n CheckBoxes possible

cb1 = ActiveDocument.FormFields(1).CheckBox 'here I got a error
'same code for the n CheckBoxes

在我将它们声明为全局变量后,如果 cb1.Value = True,我想将 cb2 的值设置为 False。有了这个:

If cb1.Value = True Then
    cb2.Value = False
End If

希望你能帮助我。

【问题讨论】:

    标签: vba checkbox ms-word global-variables


    【解决方案1】:

    如果您只是希望能够使用 one VBA 模块中的 cb1、cb2 等变量,那么假设您已经拥有的几乎是正确的

    • 您的 Dim 语句位于模块的顶部
    • 您的其他语句实际上在 Sub() 或 Function() 定义中
    • ActiveDocument 中有一个旧的复选框表单域(与包含代码的文档/模板不一定是同一个文档)。

    但是 cb1 是一种对象类型,在 VBA 中这意味着您必须使用 Set 语句将 对对象的引用分配给 cb1,即您需要

    Set cb1 = ActiveDocument.FormFields(1).CheckBox
    

    但是你不需要“Set”给非对象成员赋值,所以你修改cb1.Value的代码就可以了。

    如果您确实希望能够在多个模块中使用 cb1、cb2 变量,您可以,但我建议您尽可能避免这样做。

    一种方法是将您的 Dim 声明修改为公共声明:

    Public cb1 As CheckBox
    Public cb2 As CheckBox
    

    但在包含这些语句的模块之外,您必须使用包含“公共”语句的模块名称来限定变量名称。因此,如果“公共”语句位于名为 Module1 的模块中,则在该模块之外,您必须使用

    Set Module1.cb1 = ActiveDocument.FormFields(1).CheckBox
    

    注意事项:

    虽然

    Dim cb1 As CheckBox
    

    很好,最好尽可能完整地限定类型,例如

    Dim cb1 As Word.CheckBox
    

    当您开始在代码中使用多种类型的对象时,这种做法的原因会更加明显。例如,Word 和 Excel 都有 Range 类型的对象,但它们是完全不同的类型。


    在 VBA 中,最好在使用完对象引用后释放它们。与某些将为您执行“垃圾收集”的环境不同——最终——VBA 不会自动执行此操作。所以你的代码应该在某处执行这样的一行:

    Set cb1 = Nothing
    

    在 VBA 中,如果您省略“Set”,VBA 会认为您正在尝试分配 Checkbox 的 默认成员 的值。您可以通过在 VB 编辑器的 View->Object Browser 中搜索 Word 的 Checkbox Class 来找出默认成员是什么。选择它,您会看到其中一个成员被特别标记——在这种情况下,它是“有效的”。

    所以没有集合,

    cb1 = ActiveDocument.FormFields(1).CheckBox
    

    意思是“将ActiveDocument.FormFields(1).CheckBox.Valid 的值分配给cb1 变量”。由于 .Valid 是一个布尔值,而 cb1 是一个 CheckBox,这将导致错误。


    Word 中有多种类型的复选框,您可以将其中至少三种(旧版 FormField 复选框、内容控件复选框和旧版 ActiveX 复选框)放在一个文档中。但是它们都有不同的类型,所以如果你真的在使用内容控件,以上都行不通!

    【讨论】:

      【解决方案2】:

      试试Public cb1 As CheckBox, cb2 As CheckBox。但是在模块顶部进行声明。在声明区。 不要在 Sub 中尝试...您将收到另一个错误。

      并定义如下:

      Set cb1 = ActiveDocument.FormFields(1)
      

      假设第一个 FormField 对象是您的复选框。否则,使用:

      Set cb1 = ActiveDocument.FormFields("TextBoxName") 'using its name...
      

      【讨论】:

      • 即使您愿意,也不能在 Sub 中声明公共变量。 :)
      • @Kostas K.:当然!我只是想阻止他尝试这个。我在写作时想到了你所说的话,我问自己说出来是否好。但我试图避免另一个关于新错误的问题...... :)
      • @Kostas K.:你的观点也很好。我将消息修改为更加 elocvent... :)
      猜你喜欢
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多