• 締切済み

エクセルでユーザー定義関数を作りたい

エクセルのVBAで、セルに「=findright(セル名,対象)」と書き込めば、その関数を書き込んだセルの右から対象を探してくれる関数を作りたいです。find関数は左から検索してしまいますよね?右から検索したいのです。 <例>セル(a2)から右から数えて何番目に★があるか? =findright(a2,"★") 標準モジュールに書き込んだあとの手順も教えていただけないでしょうか? よろしくお願い致します。

みんなの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#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

yumeataru
質問者

補足

InStrRevが右から検索する関数なんですね! もしよろしければ一行ずつ解説していただけないでしょうか? 勉強したいです!

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

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") とか。

yumeataru
質問者

お礼

ありがとうございます!! すぐに出来ました。感謝感謝です。 public functionですね!ずっとfor nextで考えてました。 勉強になりました。

関連するQ&A

  • エクセルのユーザー定義関数で(VBA)

    エクセルのVBAで、セルに「=SheetName」と書き込めば、その関数を書き込んだセルが属するシート名をセルに代入さるようなユーザー定義関数を作りたいと考えています。 で、標準モジュールに Public Function SheetName(test) SheetName = ????? End Function と、書き込んでふと止まりました。 ユーザー定義関数を書き込んだシートの名前ってどうやって取得すればいいのでしょうか?VBでいうSenderみたいなのってあるんでしょうか? どなたか?詳しい方教えて頂けないでしょうか? 宜しくお願いいたします。

  • ユーザー定義関数をEXCELに常駐させたい

    VBAの標準モジュールで作成したユーザー定義関数を、*.bas形式でエクスポートしています。 エクセルを立ち上げるたびに、インポートしなければならず、非常に手間です。 また、*.basファイルを職場の仲間にも広めたいと思っているのですが、毎度インポートすることになると、面倒になります。 そこで、誰のEXCEL本体にも常駐させ、SUM関数のようにいつでも使用できる状態にするにはどうすればいいでしょうか?

  • Excelのユーザー定義関数

    シート名の一部とセルの値が一致したらLOOKUP関数をかえす関数を作成したいのですが… 例として。。。 シート名:20020301売上表、セルA1:2002/3/1の値があります。 シート名の"01"とA2の日付"1日"が一致したら、セルA2にLookup関数をかえす関数を作成したいのですが。。。 よろしくお願いします

  • エクセルのCOUNTA関数について

    エクセルのCOUNTA関数について COUNTA関数の 文字列に 取り消し線を入れたセルを、無視するようにしたいです。VBAによる標準モジュールのコードを教えてください。質問番号:3526540に似ています。質問番号:3526540は、SUMの場合でした、COUNTAでのコードを教えてください。

  • エクセルのFIND関数について

    エクセルのFIND関数は、特定の文字列が左から何文字目にあるかを求める関数であると理解していますが、右から何文字目にあるかを検索出来ないものでしょうか? なお、検索する文字列は数値以外であり右より一番右にある文字の右からの文字数を検索したいです。  対象文字列    右から数値以外の一番最初の文字の文字数 30%1       →   2 200mg20    →   3 2.5mg1     →   2 1          →   0 25%1       →   2 0.5g1キット(生理食塩液100            →   4 1010       →   0

  • エクセルのユーザー関数が小文字に

    WindowsXP Proffessional OFFICE2003の構成でエクセルを使用していてサービスパックも入れています。 自分でユーザー関数を作って使用しているのですが標準、モジュールのほうで大文字で関数を書いているのにワークシートのほうで使用すると勝手に小文字に書き換えられてしまいます。 標準モジュール一つだけ関数マクロがあるだけでシートのほうには何も記述していません。 ちょっと前まで標準モジュール内の関数を大文字に指定していても小文字に戻されてしまうので、わざとシートのほうに大文字で関数を書くと標準モジュール内の関数が自動的に変わって問題は解決したと思ったのですが、エクセル本体?の関数が変わっておりません。 関数そのものの動きは思った通りに動いています。 こういうときはみなさんはどうなさいますか?

  • エクセル VBAで関数を定義したけれどもうまくいかない

    以前ここで教えていただいた方法ですが、 セルB1からB100までのいずれかを変更した際に プロシージャが起動する方法として まず VBAで標準モジュールに 関数を定義して Function mykansu(dum As Range) for i=1 to 100 if cells(i,2)=1 then cells(i,6)="yes" next i End Function そしてexcelシートでセルA1に =mykansu(B1:B100) とやれば、B列の変更を加えたらプロシージャが起動する と教えていただきました。 しかし A1に #Value と出たきりでVBAのプロシージャが動かないのはなぜでしょうか。教えてください。

  • エクセルユーザー定義関数(1)

    エクセル初心者です。 複数のセル範囲(例えばRange("A1:A100"))を入力させ、入力されたセル範囲すべてのセルを3乗した総和を求めるユーザー定義関数は作ること可能でしょうか? Function Y(a As Range) As Variant ここに、aで選択されたセル全てを3乗して総和を求める関数Yを定義したい。 End Function よろしくお願い致します。

  • エクセルの関数で以下のようなのってありますか?

    エクセルの関数で以下のようなのってありますか? A1からK1まで以下の数字が入ってるとします。(左のセル以上の数字が入ります) 1 2 3 4 4 5 5 6 7 7 7 んで、左から検索をしていって、初めて7が現れる行数を関数で求めたいのです。 マクロではなく関数でお願いします。 -- エクセル2003

  • Excelでセルに入力するとVBA関数が呼び出される

    標記件、あるExcelファイルでセルに入力を行うと、入力後にVBAのある関数が自動で呼び出されるのですが、どこでこの設定を行う事ができるのでしょうか? VBAをOPENし、"ThisWorkbook"と"Sheet"内を開いても、何も記述はありません。通常はここで設定を行うと思うのですが・・・ (SelectionChangeなどで。) なお、呼び出される関数は、標準モジュール内に入っています。 以上、よろしくお願い致します。

専門家に質問してみよう