ActiveX复选框调用Sub循环遍历所有书签并执行条件操作(针对特定组)



我正在Word中使用VBA创建SmartForm,用户可以在其中勾选复选框,以显示我已使用命名格式"TEXT_BUTANE"将其作为书签的某些信息

因为每个产品(丁烷/丙烷/乙烷)在整个文档中都有多个书签,所以我将它们命名为"TEXT_BUTANE1"TEXT_BUTANE2"等

因此,我想循环浏览所有书签,并根据其所属的组隐藏/显示文档中的部分,即所有以"TEXT_BUT"开头的书签都将被视为一个集体隐藏(或如果选中则显示)的组

我得到了一个编译错误"Next without For",但从我所看到的语法是正确的

它在创建LoopThroughBookmarks Sub之前就已经工作了,但我需要这样的东西,这样我就可以隐藏/显示文档的多个部分

如有任何帮助,将不胜感激

Private Sub CHECK_BUTANE_Click()
Dim vw As Word.View
Dim bChecked As Boolean
Dim bkm As Word.Bookmark
'turned on non-printing characters individually so that
'not displaying Hidden text does not affect these settings.
Set vw = Application.ActiveWindow.View
If vw.ShowAll = True Then     'if TRUE then SHOW following
    vw.ShowParagraphs = True
    vw.ShowObjectAnchors = True
    vw.ShowTabs = True
    vw.ShowHyphens = True
    vw.ShowOptionalBreaks = True
    vw.ShowSpaces = True
End If
vw.ShowAll = False            'if FALSE then HIDE following
vw.ShowHiddenText = False
bChecked = Me.CHECK_BUTANE.Value
                              'if CHECKED
If bChecked Then
    Call LoopThroughBookmarks("BUT", True) 'then TRUE so loop through bookmarks passing PRODUCT
Else
    Call LoopThroughBookmarks("BUT", False) 'then FALSE so loop through bookmarks passing PRODUCT
End If
End Sub

Public Sub LoopThroughBookmarks(product As String, bChecked As Boolean)
Dim bkm As Bookmark
Dim strMarks() As String
Dim intCount As Integer
Dim checkString As String
Dim bkmName As String

checkString = "CHECK_" + product     'CHECK_BUT or CHECK_PRO or CHECK_MET
If ActiveDocument.Bookmarks.Count > 0 Then
    ReDim strMarks(ActiveDocument.Bookmarks.Count - 1)
    intCount = 0
    For Each bkm In ActiveDocument.Bookmarks         'Set bkm to be current Bookmark
        bkmName = Left$(bkm.Name, 9)                 'taking first 9 chars for bkm comparison
        If bkmName = checkString Then                'if TRUE
            bkm.Range.Font.Hidden = Not bChecked        'then hidden is false
        Else                                         'is FALSE
            bkm.Range.Font.Hidden = bChecked         'so stay visibility
    Next bkm
End If
End Sub

您可能会得到这个错误,因为在代码的这一部分中,您在Next之前缺少了一个End If

    If bkmName = checkString Then                'if TRUE
        bkm.Range.Font.Hidden = Not bChecked        'then hidden is false
    Else                                         'is FALSE
        bkm.Range.Font.Hidden = bChecked         'so stay visibility
Next bkm

作为进一步的观察,您可能会简化代码的这一部分

bChecked = Me.CHECK_BUTANE.Value
                              'if CHECKED
If bChecked Then
    Call LoopThroughBookmarks("BUT", True) 'then TRUE so loop through bookmarks passing PRODUCT
Else
    Call LoopThroughBookmarks("BUT", False) 'then FALSE so loop through bookmarks passing PRODUCT

Call LoopThroughBookmarks("BUT",Me.CHECK_BUTANE.Value)

最新更新