MS Word VBA查找和循环(不替换)

MS Word VBA查找和循环(不替换),vba,find,ms-word,Vba,Find,Ms Word,很抱歉这个基本的问题,但我是一个长期访问VBA的开发人员,我的屁股被字踢了 我正在为使用带有特定编号方案(aaa aaa-#-#-#-#-#)的法律案例管理系统的人构建一个解决方案。我需要在文档中搜索连字符,然后抓取找到连字符的整个段落。然后我需要将该段落中的文本发送到一个单独的函数,该函数从该段落中解析出文件号(该函数已经起作用) 如果该函数成功,则返回文件号,否则返回“未找到”。因此,我需要: 查找所有连字符 用连字符捕捉段落 将该文本传递给函数 如果函数返回“未找到”,请转到下一个连字符

很抱歉这个基本的问题,但我是一个长期访问VBA的开发人员,我的屁股被字踢了

我正在为使用带有特定编号方案(aaa aaa-#-#-#-#-#)的法律案例管理系统的人构建一个解决方案。我需要在文档中搜索连字符,然后抓取找到连字符的整个段落。然后我需要将该段落中的文本发送到一个单独的函数,该函数从该段落中解析出文件号(该函数已经起作用)

如果该函数成功,则返回文件号,否则返回“未找到”。因此,我需要:

  • 查找所有连字符

  • 用连字符捕捉段落

  • 将该文本传递给函数

  • 如果函数返回“未找到”,请转到下一个连字符

  • 我尝试了几十种选择,但都没有成功。我通常会陷入一个无限循环(并且似乎没有向前移动),或者我会以一个错误的失败到达过程的末尾

    我不知道如何移动到下一个出现的连字符并重复该过程。我也不知道如何将流程运行到文档末尾或在文档末尾停止(不从头开始-因为连字符保留,因为这不是替换流程)

    我尝试过很多不同的版本,但我在下面包括了一个

    谢谢你的指导。我真的很感激

    DGP


    Public Sub TestFind77()
    Selection.HomeKey单位:=wdStory
    选择。查找
    .ClearFormatting
    .Text=“-”
    .Execute Forward:=真
    Do While.find=True
    .Parent.Expand Unit:=WD段落
    作为字符串的Dim strWTF
    strWTF=.Parent
    'MsgBox strWTF
    strResult=fnGetFileNumberFromString(strWTF)'这是有效的
    如果strResult“未找到”,则
    成功
    如果结束
    .Execute Forward:=真
    环
    以
    成功:
    MsgBox stresult
    端接头
    
    我明白。。。好的开始,你只缺了一小部分

    您需要的一件事是Word的
    范围
    对象。最好将其用于查找-与选择不同,您可以在代码中使用多个范围

    有时,在使用Find时,需要返回原始范围(在您的情况下是整个文档)。在这里,情况似乎并非如此,但无论如何,我已经根据一般原则构建了它——因此,如果结果证明您需要它,您就可以拥有它

    我发现在一个布尔变量中保存
    Find.Execute
    的结果比依赖
    .Find
    更可靠,所以我也把它放了进去

    您可以使用
    Range.parations(1)
    选择范围所在的段落。我试图坚持你所拥有的,但如果你想更严格地执行你的代码,你可以这样做,只要你不需要这一段来做任何其他事情:

    strWTF = rngSearch.Paragraphs(1).Range.Text
    
    祝你好运

    Public Sub TestFind77()
        Dim rngDoc as Word.Range
        Dim rngSearch as Word.Range
        Dim bFound as boolean
        Dim para as Word.Paragraph
    
        Set rngDoc = ActiveDocument.Range
        Set rngSearch = rngDoc.Duplicate
    
        With rngSearch.Find
            .ClearFormatting
            .Text = "-"
            bFound = .Execute(Forward:=True)
    
            Do While bFound = True
                Set para = rngSearch.Paragraphs(1)
    
                Dim strWTF As String
                strWTF = para.Range.Text '???.Parent
                'MsgBox strWTF
    
                strResult = fnGetFileNumberFromString(strWTF) ' This works
                    If strResult <> "NOT FOUND" Then
                    GoTo success
    
                End If
                rngSearch.Collapse wdCollapseEnd 'search from after the found to the end of the doc
                bFound = .Execute(Forward:=True)
            Loop   
        End With
    
     success:
        MsgBox strResult
    
    End Sub
    
    公共子测试find77()
    作为字范围的Dim rngDoc
    Dim RNG搜索为Word.Range
    Dim bfind为布尔值
    将段落变暗为单词段落
    设置rngDoc=ActiveDocument.Range
    设置rngSearch=rngDoc.Duplicate
    使用rngSearch.Find
    .ClearFormatting
    .Text=“-”
    bFound=.Execute(Forward:=True)
    当bFound=True时执行
    设置段落=RNG搜索段落(1)
    作为字符串的Dim strWTF
    strWTF=para.Range.Text'???.父级
    'MsgBox strWTF
    strResult=fnGetFileNumberFromString(strWTF)'这是有效的
    如果strResult“未找到”,则
    成功
    如果结束
    rngSearch.collapseend“从查找到文档结尾的搜索”
    bFound=.Execute(Forward:=True)
    环
    以
    成功:
    MsgBox stresult
    端接头
    
    谢谢辛迪

    我仍然不确定我是否足够理解单词对象模型来理解为什么…但是你的答案让它起作用了

    我确实采纳了你的建议 strWTF=rngSearch.段落(1).范围.Text

    以下是最终代码,包括该输入:

    Public Sub TestFind99()
        Dim rngDoc As Word.Range
        Dim rngSearch As Word.Range
        Dim bFound As Boolean
        Dim strWTF As String
    
        Set rngDoc = ActiveDocument.Range
        Set rngSearch = rngDoc.Duplicate
    
        With rngSearch.Find
            .ClearFormatting
            .Text = "-"
            bFound = .Execute(Forward:=True)
    
    
            Do While bFound = True
    
                strWTF = rngSearch.Paragraphs(1).Range.Text
                strResult = fnGetFileNumberFromString(strWTF) ' This works
                    If strResult <> "NOT FOUND" Then
                    GoTo success
    
                End If
                rngSearch.Collapse wdCollapseEnd 'search from after the found to the end of the doc
                bFound = .Execute(Forward:=True)
    
            Loop
        End With
    
    success:
        MsgBox strResult
    
    End Sub
    
    公共子TestFind99()
    作为字范围的Dim rngDoc
    Dim RNG搜索为Word.Range
    Dim bfind为布尔值
    作为字符串的Dim strWTF
    设置rngDoc=ActiveDocument.Range
    设置rngSearch=rngDoc.Duplicate
    使用rngSearch.Find
    .ClearFormatting
    .Text=“-”
    bFound=.Execute(Forward:=True)
    当bFound=True时执行
    strWTF=rngSearch.段落(1).范围.Text
    strResult=fnGetFileNumberFromString(strWTF)'这是有效的
    如果strResult“未找到”,则
    成功
    如果结束
    rngSearch.collapseend“从查找到文档结尾的搜索”
    bFound=.Execute(Forward:=True)
    环
    以
    成功:
    MsgBox stresult
    端接头
    
    如果您告诉我关于如何使用Word的对象模型(在这个特定实例中!)有什么不清楚的地方,我会在回答中更好地解释它。。。
    Public Sub TestFind99()
        Dim rngDoc As Word.Range
        Dim rngSearch As Word.Range
        Dim bFound As Boolean
        Dim strWTF As String
    
        Set rngDoc = ActiveDocument.Range
        Set rngSearch = rngDoc.Duplicate
    
        With rngSearch.Find
            .ClearFormatting
            .Text = "-"
            bFound = .Execute(Forward:=True)
    
    
            Do While bFound = True
    
                strWTF = rngSearch.Paragraphs(1).Range.Text
                strResult = fnGetFileNumberFromString(strWTF) ' This works
                    If strResult <> "NOT FOUND" Then
                    GoTo success
    
                End If
                rngSearch.Collapse wdCollapseEnd 'search from after the found to the end of the doc
                bFound = .Execute(Forward:=True)
    
            Loop
        End With
    
    success:
        MsgBox strResult
    
    End Sub