如何使用VBA将Word文档中的字段替换为其内容?

问题描述 投票:0回答:2

有些网站使用textarea在文章中发布代码。如果有人在 Word 中复制/粘贴该文章,它会显示带有滚动条的空文本区域,并在带有编号行的表格中的代码下方显示。
我想通过删除文本区域来仅用代码(或仅用表格,我可以成功地将其转换为文本)替换它。

尝试过这样做

Sub RemoveTextBoxes()     
    Dim oFld    As Word.FormField
     
    With Application.ActiveDocument
        ' \\ TextInput Type requires to unprotect the document
        If .ProtectionType <> wdNoProtection Then .Unprotect
         
        ' \\ Loop all formfields in active document
        For Each oFld In .FormFields()
             
            ' \\ Only remove Formfield textboxes that have textinput only
            If oFld.Type = wdFieldFormTextInput And oFld.TextInput.Type = wdRegularText Then
             
                ' \\ Delete
                oFld.Delete
            End If
        Next
         
        ' \\ Reprotect the document
        .Protect wdAllowOnlyFormFields, True
    End With  
End Sub

如果我按 Alt+F9(显示域代码)我现在就看到了

{ HTMLCONTROL Forms.HTML :TextArea.1 } 

在带有滚动条的文本框上方!如果我关闭并再次打开,它仍然在这里。

如何获取此 TextArea 内容并删除|用内容替换该元素?

vba forms textbox ms-word
2个回答
1
投票

Word 中的动态内容是使用“字段”进行管理的。并非所有接受输入的字段都是“表单字段”,正如您在使用 Alt+F9 时发现的那样,确实会显示字段代码。

Word的查找/替换功能相当强大:它还可以用来查找字段,甚至是特定字段。在这种情况下,由于您只是希望将它们删除,因此可以找到 HTMLControl 字段并将其替换为“无”。 (如果您想要更具体并保留一些 HTMLControl 字段,请使用尽可能多的文本来仅删除这些字段。)

很多人没有意识到,您可以搜索字段代码而不需要显示它们。查找还可以处理显示的字段结果。诀窍是将

Range.TextRetrievalMode
设置为包含字段代码(在这种情况下,我认为包含隐藏文本也是一个好主意,但如果这是一个问题,请注释掉或删除该行)。

搜索文本中的

^d
代表左字段括号: { - 如果省略,则仅替换(删除)括号内的内容,我不建议这样做。使用
^d
整个字段 - 包括右括号 - 都会受到影响。

Sub FindAndDeleteHtmlFields()
    Dim doc As word.Document
    Dim fld As word.Field
    Dim rngFind As word.Range

    Set doc = ActiveDocument
    Set rngFind = doc.content
    rngFind.TextRetrievalMode.IncludeFieldCodes = True
    rngFind.TextRetrievalMode.IncludeHiddenText = True
    With rngFind.Find
        .Text = "^d HTMLControl"
        .ClearFormatting
        .Replacement.Text = ""
        .Execute Replace:=wdReplaceAll
    End With
End Sub

请注意,这也移植到 C# - 我的印象是,这实际上是您工作的地方......


0
投票

我通过搜索原始发帖者提出的确切问题来到这里。我知道 这不是他所要求的确切灵魂,但也许对其他人有帮助。

我正在寻找一个 Sub,它用字段的结果替换所有字段,这样就没有字段,只有文本,留在后面。

此 Sub 迭代字段,将结果写入字段前面(括号之外),然后删除该字段。如果有嵌套的字段/公式,则采用最外层括号的结果。

Sub RelpaceFieldsWithResult()
    Dim oFld As field
    Dim oRng As Range
    For Each oFld In ActiveDocument.Fields
        Set oRng = oFld.Code
        oRng.MoveStart wdCharacter, -1
        oRng.Collapse
        oRng.InsertAfter oFld.Result
        oFld.delete
    Next oFld
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.