2010-11-22 79 views
3

我正在使用此函数来替换字符文档中访问的某些字符串。此功能工作得很好VBA中的“with”子句令人讨厌的问题

Sub reemplazar(doc As Word.Document, after As String, before As String, replaceall As Boolean) 
    With doc.Content.Find 
     .Text = after 
     .Replacement.Text = before 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = True 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
     If replaceall Then 
      .Execute replace:=wdReplaceAll 
     Else 
      .Execute replace:=wdReplaceOne 
    End If 
    End With 
End Sub 

但是...我不知道为什么,如果我重写这样它停止工作的功能。没有错误或警告,但没有更换。

Sub reemplazar(doc As Word.Document, after As String, before As String, replaceall As Boolean) 
    doc.Content.Find.Text = after 
    doc.Content.Find.Replacement.Text = before 
    With doc.Content.Find 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = True 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
     If replaceall Then 
      .Execute replace:=wdReplaceAll 
     Else 
      .Execute replace:=wdReplaceOne 
     End If 
    End With 
End Sub 

有人可以解释这两个片段之间的区别是什么或为什么第二个不工作propertyly? 谢谢!

回答

7

Find属性返回每次调用它的时间查找对象。因此,在你第二代码片段你

  1. 创建查找对象,并设置其Text属性
  2. 创建一个新的查找对象,并设置其属性Replacement.Text
  3. 创建第三查找对象和设置其他一些属性和执行

最后执行查找对象没有它的Text或Replacement.Text属性集。如果你想以这种方式使用它,你可以创建一个对象变量,如

Sub reemplazar(doc As Word.Document, after As String, before As String, replaceall As Boolean) 

    Dim fnd As Find 

    Set fnd = doc.Content.Find 

    fnd.Text = after 
    fnd.Replacement.Text = before 
    With fnd 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = True 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
     If replaceall Then 
      .Execute Replace:=wdReplaceAll 
     Else 
      .Execute Replace:=wdReplaceOne 
     End If 
    End With 
End Sub 
+0

正确的答案 - 原因和答案代码。您可以并且应该清楚地说明您正在枚举第二个代码段的问题。 – jpinto3912 2010-11-22 22:01:51

1

这是您的代码的真正切割和粘贴?这两个应该一致地工作。你确定没有其他事情像奇数行结尾一样?

(我注意到在第一个例子你End If不正确缩进,但我怀疑这是什么做的话)

+0

是的,这实际上是我的代码的副本。我也认为这两个函数应该是一致的......可以肯定的是,WITH子句只是语法糖。这是我的问题和我头痛的原因。谢谢! – Jonathan 2010-11-22 18:32:22