Word宏中的条件替换

时间:2013-10-07 21:30:07

标签: vba replace conditional

大家好,并提前感谢任何回复;

这个问题是关于仅在某些条件下替换文本。

背景:我正在为一个学术机构的编辑部门制作一个宏。他们获得了大量具有相同问题的文档,并请求一些帮助以减少他们在每个文档上花费的时间。

他们想要的两件事:

  • 如果连字符在两位数之间,请将其更改为en-dash
  • 将每个&符号(&)更改为单词“and”

我有一个RegExp可以找到并替换那些连字符,但我注意到了一个问题。我的查找/替换更改了超链接的“显示文本”。与&符号相同。坏。所以我想弄清楚的是如何排除具有Selection.Style = Word.ActiveDocument.Styles(“Hyperlink”)的文本

BTW,“不平等”的逻辑运算符是什么?我试过<>和><但我总是得到一个错误,告诉我表达是预期的。我是VBA的新手所以请原谅新手问题。

这是有效的(更大的Sub的一部分):

Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
    .Text = "([0-9])-([0-9])"
    .Replacement.Text = "\1" & Chr$(150) & "\2"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = True
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

因此,如果样式不是超链接,我可以创建一个If / Then语句来告诉它替换吗?

再次感谢, Rissa

P.S。我搜索了类似的帖子,发现了一个,但从未得到过回答。

2 个答案:

答案 0 :(得分:0)

查找您的选择是否为超链接可能更安全的方法是使用以下VBA代码:

If Selection.Hyperlinks.Count = 1 Then
    MsgBox "The selection is a hyperlink"
Else
    MsgBox "The selection is not a hyperlink"
End If

我刚刚测试它很快就完美了。要回答第二个问题,请执行“=”和“<>”等操作用于基本类型,如Integer,Float,Long等.Word.ActiveDocument.Styles(“Hyperlink”)返回一个对象。因此,您需要使用“Is”和“Is Not”

希望有所帮助。

答案 1 :(得分:0)

(感谢Black Cr0w,逻辑运营商很高兴知道)

好的,这是交易...... Word Macros并不完全线性执行。

我最终想出了如何编写一个主要起作用的If / Then / Else语句。大多。直到它完成替换(wdReplaceOne)之后才真正检查条件。所以它会改变超链接中的第一个连字符,然后“哦,等等!这是一个超链接!”然后它会跳过该超链接中的任何后续连字符。

所以我最终将我的If / Then / Else分成两个单独的If / Then块。第一个说“继续前进,没有什么可做的”,第二个说,“啊哈!这里是我们需要改变的地方。”下面的代码虽然令人畏缩,却完全符合我的要求。

Sub replaceHyphens()
'
' Find hyphens that occur between digits and change them to en-dash, EXCEPT in hyperlinks
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
    .Text = "([0-9])-([0-9])"
    .Forward = True
    .Format = True
    .Wrap = wdFindContinue
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = True
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Execute
End With
Do While (Selection.Find.Found = True)
    If (Selection.Style = ActiveDocument.Styles("Hyperlink")) Then
       Selection.Move Unit:=wdSentence, Count:=1
    End If
    Selection.Find.Execute
    If (Selection.Style <> ActiveDocument.Styles("Hyperlink")) Then
        Selection.Find.Replacement.Text = "\1" & Chr$(150) & "\2"
        Selection.Find.Execute Replace:=wdReplaceOne
    End If
Loop
End Sub

如果有人想建议一个更清洁的方法来做到这一点,我会全力以赴。

谢谢!