InStrRev-劣化現象はさらに続く

Excel VBAの関数にInStrRevがある。これは比較的新しくできた関数のようである。 Excel2016のオンラインヘルプによると次のような関数である。記述は2018年12月13に最終更新となっているが、この会社はインチキが常習化しているからこれはアテにはならない。
この関数の動作は「ある文字列の中から別の文字列を後方から検索し、最初に見つかったその文字位置を返します。」というものである。

要するに、前から探していくのがInStrで、後ろから探していくのがInStrRevであるという違いである。ただし、両者では引数のstartの位置(順番)が違っているという差があるが、ここでの問題の本筋には何の関係もない。

そして、この関数は次の4個の引数をとる。
InStrRev (stringcheck, stringmatch, [ start, [ compare ]])
stringcheckは対象とする文字列である。stringmatchは検索する文字列である。

疑問点

さて、その戻り値についての記述の中で、次のようになっている部分がある。

条件InStrRevの戻り値
start > Len(stringmatch) 0

問題点
start > Len(stringmatch)」とは、「startの値がstringmatchの文字数より大きいとき」ということであるが、これは疑問である。むしろ、デタラメの間違い記述である。
  1. start (検索開始位置) とstringmatch (検索する文字列) の長さとは何の関係もないし、関連性もない。
  2. しかし、start (検索開始位置) とstringcheck (対象とする文字列) の長さは密接な関係がある。


デタラメが続くカラクリ

このマチガイ、デタラメはどこから湧いて出てきたのか。InStrInStrRevは前から検索するか後ろから検索するかだけの違いで、他はほとんど同じである。それで、この関数の説明についても、InStrのものをそのまま流用したということであろう。

引数名などの変更に合わせて、文字の修正はしてあるが、動作についてはノーチェックであることがわかる。これが新規に作られた関数ならば、その動作チェックは当然するはずであろうし、それに合わせて書き換えることができたはずである。ところが、外面的な字句は変わっているが、動作については両者はまったく同じである。

InStrの戻り値InStrRevの戻り値
InStr(start,string1,string2,compare)InStrRev(stringcheck,stringmatch,start,compare)
場合戻り値
string1 の長さが 00
string1 が NullNull
string2 の長さが 0start
string2 が NullNull
string2 が見つからない0
string2 が string1 内で見つかった見つかった位置
start > string20
条件戻り値
stringcheck の長さがゼロである0
stringcheck が Null であるNull
stringmatch の長さがゼロであるstart
stringmatch が Null であるNull
stringmatch が見つからない0
stringmatch が stringcheck 内に見つかった一致が見つかった位置
start > Len(stringmatch)0

この戻り値で「黄色の部分」の記述は、上で実験したように明らかにマチガイである。

新たに関数を作っても、動作チェックはせずに、昔の記述の字句だけを修正して出していることがわかってくる。同じような動作をする、ということが盲点になって(先入観にあって)、その点検・検討をすっ飛ばしているのである。それでマチガイがそのままほぼ永久に引き継がれていくことになる。


Microsoftデタラメの系譜

InStrRev関数は古いBASICにはない関数である。これがいつ頃できたのかはよくわからない。今手元にある本で見てみると、Visual Basic Ver 4.0の時にはなかった(マニュアルに記載がない)。しかし、Visual Basic Ver 6.0の時にはマニュアルに記載されている。これができたのそのあたり(またはその少し前)であろう。
この時代から今と同じ記述のようである。ここでも、デタラメのまちがい記述が20年以上も続いていることになる。本当に独占企業は気楽なものである(笑)。害悪の垂れ流しである。

- 2019/01/02 -


参考
MSDNデータ/Webページの保存(tpc_0359)
参考/MSDN:InStrRev関数(IE Only)