Vba 选中/删除基于用户表单的标题和内容复选框

Vba 选中/删除基于用户表单的标题和内容复选框,vba,ms-word,Vba,Ms Word,我有一个userform,它包含九个复选框,每个复选框对应文档中的大纲级别1标题样式Heading11 我希望能够勾选任意数量的复选框,并从文档中删除选定的标题和“部分”中的文本,直到下一个标题11 例如,如果我勾选CbxISR和CbxPPL,将搜索文档标题11文本工业特殊风险和公共责任 我尝试调整线程中的代码,该线程使用.Find方法,但它只搜索一个非变量文本值 如何处理勾选的复选框?您可以循环检查复选框,将每个标题的部分或全部文本和标题级别传递给宏,例如每个复选框的以下内容: Sub Del

我有一个userform,它包含九个复选框,每个复选框对应文档中的大纲级别1标题样式Heading11

我希望能够勾选任意数量的复选框,并从文档中删除选定的标题和“部分”中的文本,直到下一个标题11

例如,如果我勾选CbxISR和CbxPPL,将搜索文档标题11文本工业特殊风险和公共责任

我尝试调整线程中的代码,该线程使用.Find方法,但它只搜索一个非变量文本值


如何处理勾选的复选框?

您可以循环检查复选框,将每个标题的部分或全部文本和标题级别传递给宏,例如每个复选框的以下内容:

Sub DeleteHeadingSpanText(StrTxt As String, h As Long)
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = StrTxt
    .Style = "Heading " & h
    .Replacement.Text = ""
    .Format = True
    .Forward = True
    .Wrap = wdFindContinue
    .Execute
  End With
  If .Find.Found = True Then
    .Duplicate.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel").Delete
  End If
End With
End Sub
例如,假设您有一个标题1,其文本包括:

Lorem ipsum dolor sit amet

您可以通过以下方式删除与该标题关联的所有内容:

Sub Demo()
Call DeleteHeadingSpanText("ipsum dolor", 1)
End Sub

请注意,只需要标题中的部分字符串。还要注意的是,Word的标题样式仅涵盖“标题1”到“标题9”;没有“Heading11”。

我最后使用了下面的代码,它工作得非常好。我想我会分享它,以防其他人为此而挣扎

请注意,我在userform_Initialise sub中折叠了所有标题,以确保其正常工作

Public Sub ComOK_Click()

'Warning msgbox confirm sections being deleted
Dim answer As Integer
Dim strResult As String
Dim strDelete As String
Dim obj As Object

strResult = "You are about to remove the following templates from this document:" & vbCr

For Each obj In Me.Controls
    Select Case TypeName(obj)
        Case "CheckBox"
            If obj.Value = True Then
                strResult = strResult & vbCr & obj.Caption
            End If
    End Select
Next obj

answer = MsgBox(strResult & vbCr & vbCr & "THIS CANNOT BE UNDONE after saving your document." 
& vbCr & "Do you want to continue?", vbOKCancel, "WARNING")

If answer = vbOK Then

UserFormSections.Hide
Application.ScreenUpdating = False

'Delete sections from document
For Each obj In Me.Controls
    Select Case TypeName(obj)
        Case "CheckBox"
            If obj.Value = True Then
                strDelete = obj.Caption
                    Call DeleteHeading(strDelete)
            End If
    End Select
Next obj
Else
End If

'Expand remaining headings
With ActiveDocument.ActiveWindow.View
    .ExpandAllHeadings
End With
'land back on titlepage after sub
ActiveDocument.Bookmarks("DeleteTemplate").Select

Application.ScreenUpdating = True

'Confirm delete to user
MsgBox "Your selected section(s) have been deleted.", vbOKOnly, "Deleted"
End Sub

Sub DeleteHeading(strText As String)
Dim HeadingF As Range
Set HeadingF = ActiveDocument.Content

'Search for match
    With HeadingF.Find
        .Style = "Heading 2"
        .Text = strText
        .Forward = True
        .Wrap = wdFindStop
        .MatchWholeWord = True
        .MatchCase = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchAllWordForms = False
        .Execute
    End With
'Delete match
    If HeadingF.Find.Found Then
        HeadingF.Select
        Selection.MoveEnd wdParagraph
        Selection.Delete
    End If
End Sub```

感谢@Macrood提供上述信息。最后,我只对每个标题和内容块添加书签,并在现有宏中使用一个非常基本的IF CbxABC.value=true然后bookmarkABC.value=vbnullstring。那就容易多了!请注意,如果有人意外删除书签或在书签和下一个标题之间插入一些新内容,这种方法将失败。谢谢@macropod-我再次尝试一下,但我不确定上面代码中的一些位。你能解释一下strText的定义吗?为什么要替换格式和文本或使用.replicate?此外,h指的是什么?正如我在回答中所解释的,DeleteHeadingSpanText子函数有两个参数:1,strText,它是您要删除其文本的标题的全部或部分(如果是部分),足以将其与同一级别的任何其他标题区分开来;二,。h、 标题样式的级别,如标题1、标题2等中的1、2等。