日本語入力ソフトとVBAの覚え書き

・各種日本語入力ソフトの辞書解説 ・ちょっと楽になるExcel VBA集

逆FIND:対象文字列を右(末尾)から検索して文字位置を取得するユーザー定義関数を作る

f:id:dz_dzone:20170814233145j:plain
Excelの関数で、対象文字列を検索文字で検索したときに位置が何番目かを取得するワークシート関数「FIND」や「FINDB」がありますが、とても便利ですよね。これらの関数は「対象文字列を左(先頭)から検索したときの位置」を取得するものですが、「右(末尾)から検索したときの位置」を取得するにはちょっと面倒なことをしなくてはいけません。ここでは、VBAを使って分かりやすいユーザー定義関数を作ってみます。

逆FIND:FINDrev

Public Function FINDrev(ByVal KWord As String, _
                        ByRef myCell As Range) As Long
  '== 末尾から検索して検索文字位置を取得するユーザー定義関数 ==
  Dim RevText As String

  '**対象セルの文字列を逆文字にする
  RevText = StrReverse(myCell.Text)

  '**文字位置を取得
  FINDrev = InStr(RevText, KWord)
End Function

書式: FINDrev(検索文字列, 対象セル)
検索文字列は String型、対象セルは Range型、戻り値は Long型 です。

解説

VBA関数でワークシート関数のFINDに相当するものはInStr関数です。

書式: InStr([開始位置, ]対象文字列, 検索文字列[, 比較モード])

開始位置と比較モードは省略可能ですが、今回は明示的に指定しました。なお、比較モードを指定した場合は開始位置も指定しなくてはなりません。
また、対象文字列を逆文字にする関数 StrReverse を使っています。これを使うことで、「ややこしいことをして右からの位置を取得」するのではなく、「逆文字の左からの位置を取得」しています。

逆FINDB: FINDBrev

書式: FINDrev(検索文字列, 対象セル)

こちらはFINDBの逆、つまりバイト単位で調べるものです。InStrB関数を使用していますが、やっていることは同じです。

Public Function FINDBrev(ByVal KWord As String, _
                         ByRef myCell As Range) As Long
  '== 対象文字列を末尾から検索した時の位置(バイト単位) ==
  Dim RevText As String
    
  '**対象セルの文字列を逆文字にする
  RevText = StrReverse(myCell.Text)
  
  '**文字位置を取得
  FINDBrev = InStrB(1, RevText, KWord, vbTextCompare)
End Function

おまけ:FINDrev2

Public Function FINDrev2(ByVal KWord As String, _
                         ByRef myCell As Range) As Long
  '== 末尾から検索して検索文字位置を取得するユーザー定義関数 ==
  FINDrev2 = InStrRev(myCell.Text, KWord)
End Function

文字列単位の場合だけに限られますが、実は InStrRev関数というものもあり、これはそのものズバリ「末尾から検索する関数」です。逆文字を作ることなく文字列単位での末尾からの位置を一発で取得することが可能です。