0

我尝试使用两个复选框制作一个 word 文档,其中每个复选框将显示/隐藏具有自定义样式的文档的一部分。

我计划根据复选框值设置值 Style.Font.Hidden = True/False,但是...

我发现有 3 种类型的控件:

  • Legacy Controls - 这看起来陈旧而丑陋。

  • ActiveX 控件 - 我可以轻松地附加到复选框 onChange 事件,但这些也很丑陋,我认为它不是那么安全,这也可能现在在 mac 上工作。

  • ContentControls - 这似乎是正确的方法,但我无法附加到正确的事件。(也有描述一些XML附件,但我没有使用这个,这似乎太复杂了,我不知道。)

你能告诉我如何附加到 CheckBox ContentContol 的 onChange 事件吗?我需要与 ActiveX CheckBox 相同的行为。

4

1 回答 1

3

内容控件没有“onChange”事件,因此您无法以简单的方式让内容控件表现得像 ActiveX 复选框。与表单域类似,ContentControls 的代码在进入/退出控件时触发。

为内容控件模拟“onChange”的唯一方法是将内容控件链接到文档中 CustomXMLPart 中的节点,然后使用 Document_ContentControlBeforeStoreUpdate 事件,该事件在 CustomXMLPart 中的节点内容将要更改时触发。

如果如您的问题所示,这对于您的目的来说太复杂了,您可以使用一个 MacroButton 字段,该字段显示一个看起来像复选框的字体字符(符号)。单击该字段会将该字符交换为另一个看起来已选中的字符。然后再次反向以进行下一次单击。这里有一些示例代码可以帮助您入门。如果您不喜欢我选择的复选框,您可以从 Insert/Symbols/Symbol 中选择其他内容。只需更改字符编号和字体名称即可。

默认情况下,MacroButton 字段在双击时触发。当文档在 AutoOpen 宏中打开时,您可以将其更改为单击一次。

Sub AutoOpen()
    Application.Options.ButtonFieldClicks = 1
End Sub

Sub ToggleCheckBox()
    Dim iNotChecked As Integer, iChecked As Integer
    Dim rngCheck As word.Range
    Dim sBkmName As String, sFontName as String

    iNotChecked = 111
    iChecked = 253
    sBkmName = "bkmCheck"
    sFontName = "Wingdings"
    Set rngCheck = ActiveDocument.Bookmarks(sBkmName).Range

    If Asc(rngCheck.Text) = iNotChecked Then
        rngCheck.Text = Chr(iChecked)
        ActiveDocument.Bookmarks.Add sBkmName, rngCheck
        rngCheck.Font.Name = sFontName
    ElseIf Asc(rngCheck.Text) = iChecked Then
        rngCheck.Text = Chr(iNotChecked)
        rngCheck.Font.Name = sFontName
        ActiveDocument.Bookmarks.Add sBkmName, rngCheck
    End If
End Sub
于 2015-12-07T16:28:22.417 回答