- ベストアンサー
InStr関数、InStrRev関数
Sub Sample() Debug.Print InStr(1, "abcde", "d") Debug.Print InStrRev("abcde", "d") End Sub どちらの関数も結果が4で、同じなのですが、InStrRevは2になるべきではないですか? なぜ左から検索してるのでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
InStrRevは「指定された文字列を後ろから検索する」が、位置は先頭からの文字数だから。 2という結果が欲しいなら、 Debug.Print InStr(1, StrReverse("abcde"), "d")
その他の回答 (4)
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 みなさんの書き込みを何度も読みなおしてみました。 私は読み落としたかもしれませんが、フルパスのことを触れているなら、それで説明すれば分かりやすいと思います。InStrRev()は、必要あって生まれたものです。 mPath = C:\Users\Public\Videos\Sample Videos\abc.wmv となっていて、abc.wmv を取りたい場合に、InStr()と InStrRev()では、以下のような使い方の違いが出るということだと思います。別に右から数えていくつだとしても、Right()関数ぐらいで、あまり必要性がありません。どちらがどうとか、言うまでもありません。このような場合は、InStrRev()の方が、圧倒的に使いやすいです。機能面で比較するのではなく、実用面から考えたほうがよいのです。 それと、この2つの関数は、InStr()の頻度が9/10 ぐらいで、InStrRev()は、1/10ぐらいか、それ以下だと思います。Sample2ぐらいしか使い道はないような気がします。 ※「\」は何個あるのか分からないという前提です。 '//InStr Sub Sample1() Dim mPath As String Dim i As Long Dim j As Long Dim buf As String j = 0 mPath = "C:\Users\Public\Videos\Sample Videos\abc.wmv" Do j = i + 1 i = InStr(j, mPath, "\") Loop Until i = 0 buf = Mid(mPath, j) End Sub '// InStrRev Sub Sample2() Dim mPath As String mPath = "C:\Users\Public\Videos\Sample Videos\abc.wmv" i = InStrRev(mPath, "\") buf = Mid(mPath, i + 1) End Sub
お礼
ありがとうございます。
- 30246kiku
- ベストアンサー率73% (370/504)
#3です InStr、InStrRev を使って何が出来るか、無駄に推測してみます。 InStr("abcde","d") → 4 InStrRev("abcde","d") → 4 この状態であれば、他の関数を使用しなくても、"abcde" 内に "d" は1つである。 と判断できます。 少なくとも、1つ or 複数、を判別できるようにしたのではないでしょうか。 このように、グダグダと推測して、何が正しいのか判断できますか? 使う側ではなく、ぜひ、提供する側になってください。 提供する側の仕様は、使う側ではどうしようもないことだと思います。
お礼
ありがとうございます。
- 30246kiku
- ベストアンサー率73% (370/504)
> どちらの関数も結果が4で、同じなのですが、InStrRevは2になるべきではないですか? > なぜ左から検索してるのでしょうか? そういう仕様になっている。としか言いようがないと思います。 なぜ、そういう仕様にしたのか・・・推測するのは勝手だと思いますが、 使う側から見れば、仕様は曲げ用の無いものです。 2 を得たいのなら、#1さんの様に独自関数を作れば良いと思います。 あなたの思っている事、もしくは、私が思っている事・・・・ それが、仕様から外れている・・・だけだと思います。
お礼
>あなたの思っている事、もしくは、私が思っている事・・・・ それが、仕様から外れている・・・だけだと思います。 名言ですね。 かっこいいです。
- DexMachina
- ベストアンサー率73% (1287/1744)
> なぜ左から検索してるのでしょうか? InStrRev関数は、 a)「右から検索した結果」を 「左から数えた文字数」として 結果を返すものであって、 b)「右から検索した結果」を 「右から数えた文字数」として 返すわけではない、ということかと思います。 サンプルデータとして「abcdeabcde」を使用すると、 InStr関数との違いがわかるかと思います。 (InStrでは「4」になるのに対し、InStrRevでは「9」) では、なぜ、数え方としては素直に思える「b」のように しなかったということを推測すると・・・ 恐らく、一般的な文字列操作関数が左から数えた 結果を使用する前提としたものが多いため(Midなど)、 InStrRevで右から数えた結果を返す形にしてしまうと、 ・わざわざ全文字数から減算するか ・MidRevといったように、右から数えた結果を使用 する関数を改めて定義する といった必要が生じてしまう、ということではないかと 思います。 (例えば「c:\親フォルダ\子フォルダ\ファイル.txt」 といった文字列から、ファイル.txtが保存された フォルダのフルパスを取得する、といった場合に、 InStrRev関数が「右から数えた結果」を返すと すると、「ファイルのフルパスの文字数を別に取得」 し、「そこからその値を減算した値」をLeft関数に 使用することになり、二度手間になる、と)
お礼
ポイントは InStrRev関数は、 a)「右から検索した結果」を 「左から数えた文字数」として 結果を返すものであって、 b)「右から検索した結果」を 「右から数えた文字数」として 返すわけではない、ということかと思います。 ですね、。 まとめてくださりありがとうございます。
お礼
私は勘違いしていたようです。 InStrRev関数は右から数えるものだと思っていましたが左から一番最初の文字を右から数えるようですね。