为什么';t使用通配符设置在VBA宏中查找和替换将超链接词识别为文本的合法部分
下面的VBA Word宏是在选择了几个段落或本例中的所有段落后运行的。 我附加了一个要在其上运行宏的示例.rtf文件。为什么';t使用通配符设置在VBA宏中查找和替换将超链接词识别为文本的合法部分,vba,ms-word,Vba,Ms Word,下面的VBA Word宏是在选择了几个段落或本例中的所有段落后运行的。 我附加了一个要在其上运行宏的示例.rtf文件。 段落开头的圣经参考文献都有一对围绕着它们,除了有超链接的一对。是我的宏出了问题还是Word 2010出了问题。其次,了解这是否适用于Office 365会很有帮助 (我在LibreOffice上也尝试过同样的方法,即使单词是超链接的,它也会匹配 (^)([A-Z123I]{1,3}[^]{1,15})([0-9]{1,3}:[0-9-\-]{1,7}) $1$2$3$2$3 因
段落开头的圣经参考文献都有一对围绕着它们,除了有超链接的一对。是我的宏出了问题还是Word 2010出了问题。
其次,了解这是否适用于Office 365会很有帮助 (我在LibreOffice上也尝试过同样的方法,即使单词是超链接的,它也会匹配
(^)([A-Z123I]{1,3}[^]{1,15})([0-9]{1,3}:[0-9-\-]{1,7})
$1$2$3$2$3
因此,请不要建议我没有做任何努力来确定这是否可行,或者我没有尝试过不同的设置。如果有人发布这一设置不起作用,至少表明他们花了时间下载宏测试文件并实际进行了测试,那会更有帮助。)
Private Sub RelRefWithBibleName\u Click()
插入选择=错误
如果selection.Type=wdSelectionIP,则InSelection=True
如果InSelection=True,则
MsgBox(“选择一些文本”)
出口接头
如果结束
selection.Find.ClearFormatting
selection.Find.Replacement.ClearFormatting
selection.Find.Replacement.Font.Reset
Application.ScreenUpdating=False
有选择
'添加此选项以使选择超出所选段落的开头
“这样检测就能起作用了
selection.MoveStartUntil Cset:=wdCharacter,Count:=wdBackward
strFindText=“([^13])([A-Z123I]{1,3}[!]{1,15})([0-9]{1,3}:[0-9\-\---]{1,7})”
strReplaceText=“\1\2\3\2\3”
以
选择。查找
.MatchWildcards=True
.ClearFormatting
.Replacement.ClearFormatting
.text=strFindText
.Replacement.text=strreplacementText
.Format=False
.MatchWholeWord=True
.Forward=True
.Wrap=wdFindStop
以
selection.Find.Execute Replace:=wdReplaceAll
选择,收缩
选择,行动
Application.ScreenUpdating=True
selection.Find.ClearFormatting
selection.Find.Replacement.ClearFormatting
端接头
查找/替换表达式没有问题,尽管它们可以简化:
strFindText = "([^13])([A-Z1-3 ]{1,3}[! ]{1,15} [0-9]{1,3}:[0-9\-\–]{1,7})"
strReplaceText = "\1<ref>\2</ref>\2"
strFindText=“([^13])([A-Z1-3]{1,3}[!]{1,15}[0-9]{1,3}:[0-9\-\----]{1,7})”
strReplaceText=“\1\2\2”
“版本”一词无关紧要。对于超链接,您可以在超链接集合中循环,如果适用的话,在插入标记之前测试显示文本。在超链接集合中循环没有什么大不了的。也就是说,还有另一种方法:
Sub Demo()
Application.ScreenUpdating = False
Dim RngFnd As Range, StrTxt As String
With Selection
Set RngFnd = .Range
With .Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "[A-Z1-3 ]{1,3}[! \<\>]{1,15} [0-9]{1,3}:[0-9\-\?]{1,7}"
.Replacement.Text = ""
.Forward = True
.Format = False
.Wrap = wdFindStop
.MatchWildcards = True
.Execute
End With
Do While .Find.Found
If .InRange(RngFnd) Then
If .Paragraphs.Count > 1 Then .Start = .Paragraphs(1).Range.End
If .Start = .Paragraphs(1).Range.Start Then
StrTxt = .Text
.InsertBefore "<ref>" & StrTxt & "</ref>"
.Font.Bold = False
.Start = .End - Len(StrTxt)
.Font.Bold = True
End If
If .Hyperlinks.Count > 0 Then
If .Hyperlinks(1).Range.Start = .Paragraphs(1).Range.Start Then
With .Hyperlinks(1).Range
StrTxt = .Text
.InsertBefore "<ref>" & StrTxt & "</ref>"
.Font.Bold = False
.Start = .End - Len(StrTxt)
.Font.Bold = True
End With
End If
End If
Else
Exit Do
End If
.Collapse wdCollapseEnd
.Find.Execute
Loop
End With
End With
RngFnd.Select
Application.ScreenUpdating = True
End Sub
子演示()
Application.ScreenUpdating=False
Dim RngFnd作为范围,StrTxt作为字符串
有选择
设置RngFnd=.Range
用。范围
和…一起找
.ClearFormatting
.Replacement.ClearFormatting
.Text=“[A-Z1-3]{1,3}[!\]{1,15}[0-9]{1,3}:[0-9\-\?]{1,7}”
.Replacement.Text=“”
.Forward=True
.Format=False
.Wrap=wdFindStop
.MatchWildcards=True
.执行
以
找,找,找到
如果.InRange(RngFnd)那么
如果.parations.Count>1,则.Start=.parations(1).Range.End
如果.Start=.段落(1).Range.Start,则
strText=.Text
.InsertBefore“&strText&”
.Font.Bold=False
.Start=.End-Len(StrTxt)
.Font.Bold=True
如果结束
如果.Hyperlinks.Count>0,则
如果.Hyperlinks(1).Range.Start=.parations(1).Range.Start,则
带.Hyperlinks(1).Range
strText=.Text
.InsertBefore“&strText&”
.Font.Bold=False
.Start=.End-Len(StrTxt)
.Font.Bold=True
以
如果结束
如果结束
其他的
退出Do
如果结束
.倒塌
.Find.Execute
环
以
以
RngFnd.选择
Application.ScreenUpdating=True
端接头
谢谢您的回复。然而,我唯一的要求是在段落开头标记所有匹配的内容。它当前会丢失任何碰巧是超链接的文本。我不想在一个单独的操作中循环所有超链接。有趣的是,我注意到如果没有^13要求,我会在超链接文本上找到匹配项。因此,出于某种原因,问题围绕着这一点。我确实就这个问题联系了微软。但我和一位向我保证创建超链接确实有效的人聊天……另一种选择是使用LibreOffice,它没有任何问题。谢谢你花时间来做这件事。我必须承认,我不知道如何用超链接做到这一点。这很有效!!希望我能将这项技术添加到我的知识中。使用这种方法,有没有一种方法可以将由标记限定的文本加粗?如果您从一开始就指定了该要求,这将非常有用。请参阅更新的代码。感谢您提供更新的代码。很抱歉没有提到粗体(选项)。我添加了你在这里发布的代码,效果非常好。我没有提及的原因是为了保持问题的简单性,并且只涉及一点。我把选项放在粗体或其他什么东西上会把事情搞糊涂,或者我是这么想的。非常感谢您的时间和代码。小心。为什么strText会松开超链接并在最终文本之外变成纯文本。我真的需要它来将超链接保留在那个位置。
Sub Demo()
Application.ScreenUpdating = False
Dim RngFnd As Range, StrTxt As String
With Selection
Set RngFnd = .Range
With .Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "[A-Z1-3 ]{1,3}[! \<\>]{1,15} [0-9]{1,3}:[0-9\-\?]{1,7}"
.Replacement.Text = ""
.Forward = True
.Format = False
.Wrap = wdFindStop
.MatchWildcards = True
.Execute
End With
Do While .Find.Found
If .InRange(RngFnd) Then
If .Paragraphs.Count > 1 Then .Start = .Paragraphs(1).Range.End
If .Start = .Paragraphs(1).Range.Start Then
StrTxt = .Text
.InsertBefore "<ref>" & StrTxt & "</ref>"
.Font.Bold = False
.Start = .End - Len(StrTxt)
.Font.Bold = True
End If
If .Hyperlinks.Count > 0 Then
If .Hyperlinks(1).Range.Start = .Paragraphs(1).Range.Start Then
With .Hyperlinks(1).Range
StrTxt = .Text
.InsertBefore "<ref>" & StrTxt & "</ref>"
.Font.Bold = False
.Start = .End - Len(StrTxt)
.Font.Bold = True
End With
End If
End If
Else
Exit Do
End If
.Collapse wdCollapseEnd
.Find.Execute
Loop
End With
End With
RngFnd.Select
Application.ScreenUpdating = True
End Sub