VBA Word宏无法按预期方式与文档中的字段结果一起使用

米哈尔·贾诺舍克(MichalJanošec)

我有一个word文档(报告),并且在该文档中,我正在导入具有以下字段的许多文本文件:

{INCLUDETEXT "C:\\PATH\\TOXMLFILES\\Request.xml" \*CHARFORMAT}

我也在打开文档时使用宏更新所有这些字段...

Sub AutoOpen()
With Options
    .UpdateFieldsAtPrint = True
    .UpdateLinksAtPrint = True
End With
ActiveDocument.Fields.Update
End Sub

现在,我需要IncludeText<faultstring></faultstring>标签之间突出显示那些导入的XML的文本(在字段中)

这是我在stackoverflow上获得的用于突出显示文本的代码(使其变为粗体)

Sub BoldBetweenQuotes()
    ' base for a quotes finding macro
    Dim blnSearchAgain As Boolean
    Dim blnFindStart As Boolean
    Dim blnFindEnd As Boolean
    Dim rngFind As word.Range
    Dim rngFindStart As word.Range
    Dim rngFindEnd As word.Range

    Set rngFind = ActiveDocument.content
    Set rngFindStart = rngFind.Duplicate
    Do
        ' set up find of first of quote pair
        With rngFindStart.Find
            .ClearFormatting
            .Text = "<faultstring>"
            .Replacement.Text = ""
            .Forward = True
            .wrap = wdFindStop
            blnFindStart = .Execute
        End With
        If blnFindStart Then
            rngFindStart.Collapse wdCollapseEnd
            Set rngFindEnd = rngFindStart.Duplicate
            rngFindEnd.Find.Text = "</faultstring>"
            blnFindEnd = rngFindEnd.Find.Execute
            If blnFindEnd Then
                rngFindStart.End = rngFindEnd.Start
                ' make it bold
                rngFindStart.Font.Bold = True
                rngFindStart.Start = rngFindEnd.End
                rngFindStart.End = rngFind.End
                blnSearchAgain = True
            Else
                blnSearchAgain = False
            End If
        Else
            blnSearchAgain = False
        End If
    Loop While blnSearchAgain = True
End Sub

问题是,当我在Word文档(带有IncludeText字段)中运行宏时,它会不断循环并以粗体显示故障字符串标记之间的文本的第一出现。当我在带有一些随机文本和faultrstring标签的新Word文档中运行它时,效果很好...

编辑:原来的问题是由于在IncludeText字段内的faultstring标签打开文档并更新字段后,我需要将字段转换为静态文本。我怎样才能做到这一点?

辛迪大师

为了使用Word的对象模型(例如VBA)将动态字段内容转换为静态文本,需要使用该Fields.Unlink方法。对于整个文档:

ActiveDocument.Fields.Unlink

对于任何给定Range这也是可能的删除最后一段中的字段,例如:

ActiveDocument.Paragraphs.Last.Range.Fields.Unlink

为了仅取消链接某种类型的字段,请循环Fields收集,测试Field.Type并相应地取消链接。例如,对于IncludeText:

Sub DeleteIncludeTextFields()
    Dim doc As word.Document

    Set doc = ActiveDocument
    Debug.Print DeleteFieldType(wdFieldIncludeText, doc)
End Sub

Function DeleteFieldType(fldType As word.WdFieldType, doc As word.Document) _
         As Long

    Dim fld As word.Field
    Dim counter As Long

    counter = 0
    For Each fld In doc.Fields
        If fld.Type = wdFieldIncludeText Then
            fld.Unlink
            counter = counter + 1
        End If
    Next

    DeleteFieldType = counter
End Function

假设您要在更新文档后对文档中的所有字段执行此操作

Sub AutoOpen()
  With Options
    .UpdateFieldsAtPrint = True
    .UpdateLinksAtPrint = True
  End With
  ActiveDocument.Fields.Update
  ActiveDocument.Fields.Unlink
End Sub

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用VBA宏创建Word文档,然后在Word文档中运行宏...。

一起使用 2 个“For Each”循环 - Word VBA

使用VBA,如何确定Word文档中字段的范围?

Range.find无法与Excel VBA一起使用

无法使Replace方法与Array Formula(VBA)一起使用

使用Excel宏VBA将Word文档中的第一个表复制到Excel

VBA代码在Excel中无法与数据集一起使用

使用VBA一起增加时间

您是否将宏或VBA代码与MS-Access一起使用?

通过 VBA 宏更改 Word 中 ActiveX 控件字段的值

在 VBA(Word) 上,通过在另一个文档上运行宏来编辑文档或忽略数组中的空行?

Word VBA中的嵌套IF字段

无法在VBA中以正确的方式使用querySelector

VBA DateAdd无法按预期工作

Word VBA 宏按钮只能使用一次

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

在VBA中循环宏

使用VBA宏按变量过滤

VBA - 更改单元格颜色的宏记录器无法按预期工作

括號中的 Word VBA 宏

测试VBA宏中的空字段

VBA电源运算符(^)在64位VBA中无法按预期工作

无法使用VBA在一批Word文档的标题中添加表格

如何在文档的棘手部分中创建Xpath(对我而言),以便在VBA中与Selenium Basic一起使用

Excel VBA宏,使用输出文本文件查找和替换Word文档中的文本

如何使用vba宏从ms word文档中隐藏背景颜色为灰色的表格单元格

.NET事件不可见/无法与vb6(vba)一起使用?

使用VBA以编程方式对Visio文档中的页面进行排序

使用VBA在Access中创建Word文档中的表