「excelvba replaceメソッド 戻り値」
という検索が行われていました。
オブジェクトブラウザーでライブラリをExcelに限定して「Replace」を完全一致検索すると、上図のように2つのReplaceメソッドがヒットしますが、私はRange.Replaceメソッドの戻り値について調べていた方による検索ではないかと、想像しています。
Range.Replaceの戻り値はBooleanだが…
オブジェクトブラウザーの詳細ペインでわかるとおり、RangeオブジェクトのReplaceメソッドの戻り値は、Booleanと定義されています。
Range.Replaceメソッドは名前のとおり置換を行うメソッドですから、置換が行われたらTrueが返され、行われなかったときにFalseが返されるのだろうと、多くの方は期待するのではないかと思います。
ところが奇妙なことに、Range.Replaceメソッドは置換が行われても行われなくても、Trueを返してきます。
Range.ReplaceがTrueを返すことを確認するサンプルマクロ
以下のような簡単なマクロを実行して、変数retの値がどうなるかをローカルウィンドウを表示して確認してみてください。
Dim ret As Boolean
ret = Range("A1:A5").Replace(What:="探す文字列", Replacement:="置換後の文字列")
Stop
置換が行われても行われなくても、変数retの値はTrueになっているはずです。
Range.ReplaceがTrueを返す挙動についての情報
Microsoftの公式ドキュメントでは、この挙動について記述を見つけられませんが、
Stack Overflowの「Excel VBA: Use MsgBox if Replace finds nothing to replace」に以下のコメントがあります。
Docs for Range.Replace suggest it returns a Boolean indicating whether any matches were found, but in my testing it always returns True.
ChatGPTとGrokは事実と異なる回答
いくつかの無料版生成aiに
「Excel VBA の Range.Replace の戻り値は Boolean と定義されていますが、どういうときに False を返しますか」
と質問したのですが、ChatGPTは残念ながら以下のような回答をしてきました。
Range.Replace の戻り値は、1つも置換が実行されなかった場合に False を返します。
逆に、置換が 1 件でも実行されれば True です。
「1つも置換が実行されなかった場合に False を返します」と、実験結果と異なる回答をしてきます。
Grokも以下のような回答です。
Range.Replaceメソッドは、指定された範囲内で検索文字列が見つからなかった場合や、置換処理が実行されなかった場合にFalseを返します。
「検索文字列が見つからなかった場合や、置換処理が実行されなかった場合にFalseを返します」と、こちらも実際の挙動と異なる回答です。
Geminiは事実に合致する回答
それに対しGeminiは、以下のように回答してくれました。
Range.Replace メソッドの戻り値は Boolean と定義されていますが、実際には常に True を返します。 これは、Excel VBA の公式ドキュメントや多くのVBA開発者の経験から確認されている動作です。
実際の挙動どおりの回答です。
そして、
なぜ False を返さないのか?
通常、検索系のメソッドで Boolean を返す場合、検索対象が見つからなかったときに False を返すことが期待されます。しかし、Range.Replace メソッドは、検索文字列が見つからなくても、置換処理自体はエラーなく完了するため、常に True を返す設計になっています。
つまり、「置換処理が正常に実行できたか?」という観点では常に True となります。検索文字列が見つからなかった場合でも、それは「0個の置換が正常に行われた」と解釈されます。
と多くのヒトが期待する内容についてまで言及してくれます。
私は、Geminiの回答どおり「見つからなくても、置換処理自体はエラーなく完了するため、常に True を返す設計になって」いるのだろうと想像しています。
最終更新日時:2025-07-04 09:54
- Older:VBA.CDate関数の戻り値は?
Home » Excel VBA Rangeオブジェクト » セル検索 » Range.Replaceメソッドの戻り値は?