- 締切済み
エクセルでユーザー定義関数を作りたい
エクセルのVBAで、セルに「=findright(セル名,対象)」と書き込めば、その関数を書き込んだセルの右から対象を探してくれる関数を作りたいです。find関数は左から検索してしまいますよね?右から検索したいのです。 <例>セル(a2)から右から数えて何番目に★があるか? =findright(a2,"★") 標準モジュールに書き込んだあとの手順も教えていただけないでしょうか? よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- mitarashi
- ベストアンサー率59% (574/965)
#1にエラー処理も盛り込んだ立派なコードが回答されているので、十分なのですが、VBAには、文字列の右側から検索する関数(戻り値は左側から数えて何番目かですが)があるので、試しにやってみました。 Function FINDRIGHT(arg1, arg2) Dim result As Long result = Len(arg1) - InStrRev(arg1, arg2) + 1 If result > Len(arg1) Then FINDRIGHT = CVErr(xlErrValue) Else FINDRIGHT = result End If End Function
- keithin
- ベストアンサー率66% (5278/7941)
FINDRIGHT(検索文字列,対象) 指定された文字列 (検索文字列) を他の文字列 (対象) の中で検索し、その文字列が他の文字列内で最後に現れる位置を右端から数え、その番号を返します。 検索文字列 検索する文字列を指定します。 対象 検索文字列を含む文字列を指定します。 検索文字列に空白文字列 ("") を指定した場合、先頭文字と一致したものと見なされ、または 1 が返されます。 検索文字列にワイルドカード文字を使うことはできません。 検索文字列が対象の中で見つからない場合、エラー値 #VALUE! が返されます。 public function FINDRIGHT(a1, a2) dim i as long if a1 = "" then FINDRIGHT = "" exit function end if for i = len(a2) to 1 step -1 if mid(a2, i, 1) = a1 then FINDRIGHT = len(a2) - i + 1 exit function end if next i FINDRIGHT = cverr(xlerrvalue) end function 使い方は殆ど自明と思いますが =FINDRIGHT("★",A1) とか =FINDRIGHT(B1,A1) とか =FINDRIGHT(B1,"abcd") とか。
お礼
ありがとうございます!! すぐに出来ました。感謝感謝です。 public functionですね!ずっとfor nextで考えてました。 勉強になりました。
補足
InStrRevが右から検索する関数なんですね! もしよろしければ一行ずつ解説していただけないでしょうか? 勉強したいです!