2013-10-07 128 views
0

大家好,并提前感谢任何答复;有条件替换Word宏

这个问题是关于只在某些条件下取代文本。

背景:我正在研究学术机构编辑部门的宏。他们得到大量具有相同问题的文档,并要求他们帮助缩短每个文档的花费时间。

的东西两个他们想:

  • 如果一个连字符是两个数字之间,将其更改为短破折号
  • 改变每号(&)的“和”字

我有一个RegExp,发现并替换那些连字符就好,但我注意到一个问题。我的查找/替换改变了超链接的“显示文本”。与&符号相同。坏。那么我现在想弄清楚是怎么排除有Selection.Style = Word.ActiveDocument.Styles(“超链接”)

顺便说一句,什么是为“不等于”逻辑运算符文本?我尝试了<>和> <,但我总是得到一个错误,告诉我表达式是预期的。我是VBA新手,请原谅这个新手问题。

这是工作(一个更大的小组的一部分):

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

附:我搜索了类似的帖子,发现了一个,但它从来没有回答。

回答

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”)返回一个对象。因此,您需要使用“是”和“不是”

希望有帮助。

0

(感谢黑Cr0w,逻辑运算符是很好的了解)

OK,这里的交易... 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 

如果有人想提出一个更清洁的方式来做到这一点,我洗耳恭听。

谢谢!