文字位置の取得や編集

●InStrRev関数

 InStrRev関数は、ある文字列の中から指定した文字を最後の文字位置から検索し、最初に見つかった文字位置(その位置までの文字数)を返します。既存のInStr関数でも同じでは? と思われる方もいらっしゃるでしょう。確かに、文字列の中に検索したい文字がひとつしか含まれていない場合には、InStr関数でもInStrRev関数でも同じように使えます。
 例えば、
sano@projecta.co.jp
のような電子メールアドレスの中から、ユーザー名だけを取得するケースを考えてみます。まずはリスト4とリスト5を参照してください。

リスト4:InStr関数を使った場合

 Sub InStrSample1()
     Dim myData  As String
     Dim i       As Integer
     
     myData = "sano@projecta.co.jp"
     
     i = InStr(myData, "@")
     
     MsgBox Left(myData, i - 1)
     
 End Sub

リスト5:InStrRev関数を使った場合

 Sub InStrRevSample1()
     Dim myData  As String
     Dim i       As Integer
     
     myData = "sano@projecta.co.jp"
     
     i = InStrRev(myData, "@")
     
     MsgBox Left(myData, i - 1)
     
 End Sub

「@」を検索文字列とすると、InStr関数、InStrRev関数ともに、「5」を返します。あとは、Left関数を組み合わせれば、左端のユーザー名が取得できます(図7)。

図7:ダイアログボックスにユーザー名の“sano”が表示された

 しかし、文字列の中に検索したい文字が複数含まれている場合(例えばフルパス名からファイル名を取得する場合など)、InStr関数とInStrRev関数の違いがわかります。
 それでは、

C:¥My Documents¥Sample.txt
の中からInStr関数とInStrRev関数、それぞれを使ってファイル名を取得しているリストをご覧ください(リスト6・7)。

リスト6:InStr関数を使った場合

 Sub InStrSample2()
     Dim myData  As String
     Dim i       As Integer
     
     myData = "C:¥My Documents¥Sample.txt"
     
   'myDataの中に"¥"が見つからなくなるまでLoopする
     Do Until InStr(myData, "¥") = 0−
         i = InStr(myData, "¥")
         myData = Mid(myData, i + 1)
     Loop
     
     MsgBox myData
     
 End Sub

リスト7:InStrRev関数を使った場合

 Sub InStrRevSample2()
     Dim myData  As String
     Dim i       As Integer
     
     myData = "C:¥My Documents¥Sample.txt"
     
     i = InStrRev(myData, "¥")
     
     myData = Mid(myData, i + 1)
     
     MsgBox myData
     
 End Sub

 どちらのコードを実行しても同じ結果が得られますが、InStr関数の場合には、指定した文字を先頭から検索するので、ファイル名を取得するにはリスト6ののように、「検索文字“¥”が見つからなくなるまで」という繰り返しの処理になります。もちろん、その分コードの処理速度も低下します。
 しかし、InStrRev関数ならば、最後の“¥”の先頭からの位置「16」を返すので、16に1を加算してMid関数で切り出せば、処理を繰り返すことなくファイル名を取得できるのです。
 InStrRev関数の構文は以下のとおりです。

InStrRev(文字列,検索文字列[,検索開始位置[,比較モード]])
 次に、応用編として、引数の検索開始位置を指定して“C:¥My Documents¥Sample.txt”の最初の“¥”の位置を取得してみましょう。リスト7の
i = InStrRev(myData, "¥")

i = InStrRev(myData, "¥",15)
とします。この場合、15文字目から先頭に向かって検索が行なわれますので、「i」には文字位置「3」が返されます。
 なお、InStrの正式な構文は、
InStr([開始位置,]文字列,検索文字列[,比較モード])
であり、InStrRev関数とは引数の指定順序が違うので注意してください。