2010-11-22 16 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 

この2つのスニペットの違いは何ですか?また、2つ目のスニペットの違いは説明できますか? ありがとう!

答えて

7

。だからあなたの第二のコードでは、あなたが

  1. は、Findオブジェクトを作成し、新しいFindオブジェクトを作成し、第三Findオブジェクトの作成と設定
  2. そのReplacement.Textプロパティを設定
  3. そのTextプロパティを設定しているスニペット他のプロパティと実行の束

最後に実行されたFindオブジェクトには、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

正しい答えの原因と回答コード。 2番目のコードスニペットの問題を列挙していることを明確にする必要があります。 – jpinto3912

+1

私はあなたが正しいと確信していますが、プロパティにアクセスするたびに新しいオブジェクトが作成されることは非常に嫌です。 – Vicky

+0

@Vicky ugh、Findメソッドの戻り値に厳密に型指定されたオブジェクトを初期化していないという事実が、Findメソッドがオブジェクトを返すことを意味する場合、実際はそうではありません。 2つの異なる暗黙的に型指定されたオブジェクトのプロパティ値が、お互いの間で状態を維持することを期待しています。 –

1

これはコードの実際の真のカットアンドペーストですか?これらの2つは同じように機能するはずです。奇妙な行末のようなものがないと確信していますか?

は(私は最初の例に気づくあなたのEnd Ifが正しくインデントされていませんが、私はそれはそれを行うには何も疑う)プロパティは、Findオブジェクトあなたはそれを呼び出すたびに返す検索

+0

のようなオブジェクト変数を作成することができます。これは実際に私のコードのコピーです。私はまた、この2つの関数が同じように機能するはずだと考えています... WITH節が構文的な砂糖だけであることを支持しています。これは私の質問の理由と私の頭痛の理由です。ありがとう! – Jonathan

関連する問題