如果您只是希望能够使用 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 复选框)放在一个文档中。但是它们都有不同的类型,所以如果你真的在使用内容控件,以上都行不通!