VBAのユーザー定義関数の呼び出し方についての解説でよく分からない部分があります。 関数を呼び出すときは、 変数=関数名(引数1、引数2~)

Visual Basic | Excel67閲覧xmlns="http://www.w3.org/2000/svg">25

ベストアンサー

1

1人がナイス!しています

ThanksImg質問者からのお礼コメント

ありがとうございます。

お礼日時:10/26 23:46

その他の回答(3件)

0

普通「関数」というと、「Function」ということだと思いますが、 VBAの場合は、 「Sub」と「Function」、両方を「関数だ」と、 大雑把にとらえてしまってもよいかもしれません。 賛否両論がきっとあるのでしょうけど、初心者のうちはそれでもいいと思います。 (学ぶが進んでから改めるなら改めれば) で、 「Sub」は「Subプロシージャ」のことを指します。 「Function」「は「Functionプロシージャ」のことを指します。 「Subプロシージャ」は「戻り値(返り値)」が無いです。(というか、戻り値をつくれません) 「Functionプロシージャ」は「戻り値(返り値)」が在ります。(無いままにもできます) ※「Subプロシージャ」で「戻り値(返り値)」をつくろうとすると、エラーになります。 ※「イベントプロシージャ」は、「Subプロシージャ」の仲間です。 ※ Excel自身は、先頭に「Private」などのつかない、純粋に「Sub」から始まるプロシージャだけを、「マクロ」と認識しています。標準モジュールに書いたものでも、シートモジュールやブックモジュールに書いたものでも。なお、Funcironで始まるプロシージャやイベントプロシージャはマクロとは認識されません。 >1つめ、「関数を呼び出す」 これは、 「関数を呼び出す」、というよりも、 「プロシージャを呼び出す」、と理解してもいいかもしれません。 特に、「ユーザー定義関数」は、イコール、「プロシージャ」のことなので(多分Functionプロシージャのことを指す場合が多い?)、「プロシージャを呼び出す」、と理解してもいいわけです。 まあでも、どちらでもいいのですが・・・ そのときそのときで、理解しやすいほうでいいt思います。 ヘルプには「プロシージャを呼び出す」という表現があります。 (ただ、「プロシージャを呼び出す」、と理解するほうをおすすめしますけど・・・) で、もし、 「関数を呼び出す」=「ユーザー定義関数を呼び出す」という意味であれば、 それは結局は Subプロシージャを呼び出す、か、 Funcrionプロシージャを呼び出す、か、 の「2つに1つ」です。 3つめ以降は存在しない、と思っていいと思います。 で、そのとき、 『 Subプロシージャや Funcrionプロシージャ、イコール、ユーザー定義関数 』 を呼び出す方法は2つあって、 1つ目は 「Callステートメントを使う」方法で、 2つ目は 「Callステートメントを使わない」方法です。 前者(1つ目)は 「Call プロシージャ名(引数1,引数2・・・)」 みたいな形の呼び出し方です。 「Subプロシージャ」や「戻り値のないFuncrionプロシージャ」を呼ぶときに多いです。 あるいは、戻り値があるFunctionプロシージャだけど、戻り値を使わない場合です。 「戻り値があるFunctionプロシージャ」の場合、 「戻り値を絶対に使わないといけない」というわけではありません。 無視して戻り値を使わないでおくことも自由です。 これは少し話がそれますが、「メソッド」でも同じです。 ついでに言うと、「メソッド」も、Callステートメントで呼び出せます。 例えば Workbooks.Open "d:\11.xlsx" と書くところを、 Call Workbooks.Open("d:\11.xlsx") と書いても良いわけです。 ちなみに、メソッドはSubかFunctionです。 「オブジェクトブラウザ」というもので確認できます。 戻り値のないメソッドはたいてい、Subで、 戻り値のあるメソッドは基本、Functionです。 なので、ユーザー定義関数を呼び出す方法はメソッドも共通、というわけです。 なお、「戻り値」は、大別して文字系のデータ(文字列、数値、日付など)と、オブジェクトの2つに1つのどちらかしかありません。 あと、「Callステートメント」の「Callキーワード」は「省略可能」というルールなので、書かなくても「書いたと同じ」とみなされます。 つまり、 「プロシージャ名 引数1,引数2・・・ 」 という書き方で呼び出しても 「Call プロシージャ名(引数1,引数2・・・)」 と書いて呼び出したのと同じ・・・・ ということになります。 逆に、 「Call プロシージャ名(引数1,引数2・・・)」 という書き方で呼び出しても 「プロシージャ名 引数1,引数2・・・ 」 と書いて呼び出したのと同じ・・・・ ということになります。 後者(2つ目)は 「Let(or Set) 変数名 = プロシージャ名(引数1,引数2・・・)」 とか 「If プロシージャ名(引数1,引数2・・・) >1 Then ・・・・・」 「Dubug.Print プロシージャ名(引数1,引数2・・・) 」 みたいな呼び出しかたです。 これは「戻り値のあるFunctionプロシージャ」の場合が多いですね。 戻り値を持つメソッドも同じです。「Workbooks.Openメソッド」なんかはそうですね。 「Workbooks.Addメソッド」とかも。 プロパティもこっち系の呼び出し方をしますよね。 プロパティは基本、戻り値があるので。 あとは、 Subプロシージャを、「マクロ」として、 (a)「マクロ」メニューから呼び出す。 (b)「図形(オートシェイプ)や図(画像など)に紐付けてそれをクリックしたときに呼び出す。 (c)「シート上に配置したコマンドボタン(フォームコントロールのほうのボタン)に紐付けて、同様にクリックで呼び出す。 といったこともできます。 もちろん、 「戻り値のあるFunctionプロシージャ」なら、数式から「自作のワークシート関数」として呼び出せますよね。 あと、呼び出すときの「書き方のルール」ですが、 Subプロシージャであろうが、 Funcrionプロシージャであろうが、 「戻り値」が存在しようがしまいが、 とにかく、 「戻り値を使わない」ということであれば、 プロシージャを呼び出すときには、「カッコ」は「不要」となります。 一方、「戻り値を使う場合」と「Callキーワードを書いて呼び出す場合」 は「カッコ」が「必要」となります。 これはメソッドも同じルールです。 ちなみにですが、呼び出すときの「名前付き引数」の書き方は、 ユーザー定義関数(=SubやFunction)も、メソッドも、プロパティも同じです。 わかりにくくてごめんなさい。

0

関数とは何か、について一度立ち止まって考えた方がいいかもしれません。VBAの話は一旦置いておいて、例えばExcelの関数とは何か? と聞かれたときに、どう答えますか? 関数とは、引数という材料を与えてあげると、何らか値を返してくれるものをいいます。SUM関数は、引数のうち数値を合計したものを返してくれます。VLOOKUP関数は、第2引数のセル範囲のうち一番左の列を検索して、第1引数に該当するセルを1列目とした場合の、第3引数の数値列目に入力されている値を返してくれます。それは文字列化もしれないし、数値かもしれないし、またはエラー値かもしれませんが、とりあえず何かは返ってきます。 引数を渡したら計算結果である値を返す、それが関数です。それは、VBA関数も同じことです。VBA関数は、セルに入力できるWorksheet関数とは別の、VBAの世界でのみ使える関数のことをいいます。 例えば、任意の置換後の文字列を返すReplace関数(Worksheet関数でいうSUBSTITUTE関数)、年・月・日から日付のシリアル値を返すDateSerial関数、数値を整数で返すInt関数(これはWorksheet関数にも同名のものがあります)などがあります。 その本の2つめの言いたいことは、VBA関数であろうが、ユーザー定義関数であろうが、関数名(第1引数,第2引数)……という具合に、呼び出すための書き方は一緒ですよ、ということでしょう。 そして1つめの関数を呼び出すという行為がわからないというのは、より正確に言えば、ユーザー定義関数なんて使いどころがわからないという所に落ち着くのではないでしょうか。VBAまで学んでいるのであれば、Worksheet関数を使った経験は当然あるはずですよね。呼び出すというと仰々しく感じるかもしれませんが、関数が必要で、何かしらの値を得たくてWorksheet関数を使った経験というのはあるはずです。 よくある話だと、データをコピペして入れてるシートが複数あったとして、最後の行の次の行からコピペしたいなあ、なんてことがあります。 Worksheets("○○").Cells(Sheets("○○").Rows.Count,1).End(XlUp).Rowでそのシートの最後の行番号を取得できて、これに+1すれば次にコピペしたい行番号になります。1回書くくらいならなんてことないですが、色んな所でいちいちこれを書くのは面倒だなあという時に、ユーザー定義関数にしてしまいます。 Function GetPasteRow(Sh as Worksheet) as Long With Sh GetPasteRow= .Cells( .Rows.Count,1).End(XlUp).Row +1 End With End Function これは、Worksheetオブジェクトを引数として、その引数のシートの最後の行番号+1を得ようというものです。 ~~~コピペ用のコードで~~~ Dim PstRow as Long PstRow=GetPasteRow(Worksheets("○○")) Range(Cells(PstRow,1) , Cells(PstRow,3)).Value=×× ポケモンの個体値が0~31のいくつなんだろうというものも、レベル、種族値、実際のステータスや努力値を引数にして、繰り返し処理を利用することで上限と下限を求められたりします。艦これでも、艦種や被ダメ等を引数とした、修理に必要な時間を求める関数を作ってました。 自分の思い通りの関数を作れるのは大変便利で捗ることですし、上手く使えばコードを簡単にすることもできます。今は実感が沸かないのが学習の妨げになっていると思うので、こういう関数があったら便利だと思ったら、何でも作ってみたらいいと思います。材料に対して取りえる値が1通りに定まるのであれば、関数にできます。

0

>1つめ、「関数を呼び出す」という行為がそもそもよく分か >らないのですが、どの処理を指すのですか? シート関数と同じです。 表現の方法が見つからずに「関数を呼び出す」という言い方をしているだけです。 SUM関数や、COUNTIF関数などと同様に使えるようになると言うことです。 >2つめ、呼び出し方はVBA関数と同じです。とありま >すが、よく分かりません。 >具体的にどのように呼び出すのですか? 「ユーザー定義関数の呼び出し」とは あなたが、指定した数値が素数か否かを判断する関数「SOSU」で 素数なら、「True」、異なるなら「False」を表示する を作成したとします。 =SOSU(123) と入力すれば、123が素数なら、「True」、異なるなら「False」がセルに表示される。