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