0

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

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

背景:我正在为一个学术机构的编辑部做一个宏。他们收到大量具有相同问题的文档,并要求提供一些帮助以减少在每个文档上花费的时间。

他们想要的两件事:

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

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

顺便说一句,“不等于”的逻辑运算符是什么?我试过 <> 和 >< 但我总是得到一个错误,告诉我需要一个表达式。我是 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 语句来告诉它仅在样式不是超链接时替换吗?

再次感谢,丽莎

PS我搜索了类似的帖子并找到了一个,但从未得到答复。

4

2 回答 2

0

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

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

我只是快速测试了它,它工作得很好。回答第二个问题,“=”和“<>”等操作适用于整数、浮点、长整数等基本类型。 Word.ActiveDocument.Styles("Hyperlink") 返回一个对象。因此,您需要使用“是”和“不是”

希望有帮助。

于 2013-10-07T22:09:42.423 回答
0

(感谢 Black Cr0w,逻辑运算符很好知道)

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

我最终想出了如何编写一个最有效的 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

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

谢谢!

于 2013-10-08T19:15:20.010 回答