Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';t使用通配符设置在VBA宏中查找和替换将超链接词识别为文本的合法部分_Vba_Ms Word - Fatal编程技术网

为什么';t使用通配符设置在VBA宏中查找和替换将超链接词识别为文本的合法部分

为什么';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 因

下面的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
因此,请不要建议我没有做任何努力来确定这是否可行,或者我没有尝试过不同的设置。如果有人发布这一设置不起作用,至少表明他们花了时间下载宏测试文件并实际进行了测试,那会更有帮助。)

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