首页 > 解决方案 > Words VBA:使用搜索词的位置创建范围

问题描述

我有以下问题:我们编写了一个包含许多外部资源(如 XML 文件等)的规范,每次 XML 文件更改时,我们都必须修改规范中相应的 XML 部分。实际上,每次打开文档时,我都设法插入了 XML 文件的文本。我现在的问题是我无法搜索已插入的过时 XML 代码,应该用这个新代码替换。

在@Cindy Master 提供一些有用的提示后,我会采用这样的代码(代码:我使用的函数之一,其中包含对旧 xml 的困难选择,我无法使用它):

Function wasUpdated(strFilename As String, XMLStart As String, XMLEnd As String) As Boolean

    Dim new_xml As String
    FileToString new_xml, strFilename

    Dim range_start As Long
    Dim range_end As Long

    Dim start_point As Range
    Dim end_point As Range

    Set start_point = ActiveDocument.Range
    Set end_point = ActiveDocument.Range

    start_point.Find.Execute(XMLStart)
    end_point.Find.Execute(XMLEnd)

    range_start = start_point.Start
    range_end = end_point.End

    Set rngParagraphs = ActiveDocument.Range( _
        Start:=range_start, _
        End:=range_end)

    old_xml = rngParagraphs.Text

    If new_xml = old_xml Then
        wasUpdated = False
    Else
        wasUpdated = True
    End If
End Function

此代码的问题是该start_point.Find.Execute(XMLStart)函数找不到搜索的单词。奇怪的是,Selection.Find.Execute(XMLStart)作品。Range.FindSelection.Find我不知道有区别吗?

标签: vbams-word

解决方案


很长一段时间后,我能够解决我的问题。下面是查找 XML 部分并将其作为 Range 对象返回的代码:

Private Function getXMLRange1(XMLStart As String):

    'TEST
    Dim test As Boolean

    Dim XMLEnd As String
    XMLEnd = "</order>"

    Dim range_start As Long
    Dim range_end As Long

    Dim start_point As Range
    Dim start_pointNext As Range
    Dim end_point As Range

    Set start_point = ActiveDocument.Range


    test = start_point.Find.Execute(XMLStart)
'    MsgBox start_point.Text
'    MsgBox "Range start:" & test

    start_point.Move Unit:=wdParagraph, Count:=2
    Set end_point = ActiveDocument.Range(start_point.Start, ActiveDocument.Range.End)


    test = end_point.Find.Execute(XMLEnd)
'    MsgBox end_point.Text
'    MsgBox "Range end:" & test


    range_start = start_point.End
    range_end = end_point.End


    Set getXMLRange1 = ActiveDocument.Range( _
        Start:=range_start, _
        End:=range_end)

End Function

Range.Find 和 Selection.Find 的行为方式相同。


推荐阅读