ユーザー定義関数の作成 Macユーザー向け Excel VBA 入門 [06] Excel2019 for Mac
[06] Excel ユーザー定義関数の作成
Excelワークシートからも呼び出せる「関数」を作成してみよう!
・「返り値」を持つ Functionプロシージャ(関数)
・「引数(パラメーター)」と「関数の返り値」
・「引数」は , で区切ることにより複数指定可能だが、「関数の返り値」は一つだけ
・「ユーザー定義関数」は Excelワークシートからも利用可能
Macユーザー向け Excel VBA 入門 [06] ユーザー定義関数の作成
まず、Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。
Excelワークシートからも呼び出せる「関数」を作成してみよう!
「空のブック」Excelファイルを新規作成にて作成後、A1 〜 A3 セルに 1, 2, 3 と入力します。
「A1 : A3」セル選択後、右下のポインタを下にドラッグして「A10」セルにてマウスを離します。
「A10」セルまで フィルされます。
「名前を付けて保存…」にて、「Excel マクロ有効ブック(.xlsm)」ファイル形式を選び 任意の名前で保存。
( [マクロの記録] ボタンをクリックして)マクロの保存先に「作業中のブック」を指定後 [OK] ボタンをクリックし、「マクロの記録」を開始。
「A1」セルを選択後、( [記録終了] ボタンをクリックして)「マクロの記録」を終了。
[マクロ] ボタンをクリックして 先ほど作成した「マクロ名」を選択後、[編集] ボタンをクリック。
「返り値」を持つ Functionプロシージャ(関数) の作成
上記画面のように 下記 VBAコード を間違いなく入力するか、(下記コード上でクリックするとコピー用のボタンが右上に表示されるため)コピー後に VBAコード を貼り付け。
Public Function FuncTest1(n As Long) As Long
Rem
Rem FuncTest1 = n * (n + 1) / 2
Rem
Dim i As Long
Dim j As Long
j = 0
For i = 1 To n
j = j + i
Next i
FuncTest1 = j
End Function
「イミディエイト ウィンドウ」上で 追加したVBAコードを実行し、 動作を確認 しましょう。
Debug.Print FuncTest1(3)
入力後に [return] キー押下にて 6 が表示され、 1 + 2 + 3 = 6 で問題ないようです。
? FuncTest1(10)
入力後に [return] キー押下にて 55 が返され、 公式通り 10 * (10 + 1) / 2 = 55 のため 問題ありません。
このように 実行時に(何らかの)結果が返されるプロシージャを VBでは 関数(Functionプロシージャ) と呼び、 Function ステートメントを用います。
15行めのように 関数(Functionプロシージャ)名を左辺として代入することで、 関数の結果(返り値)をセットできます! 右辺には最終的に 指定した型( 今回なら、Long )の値をセットする必要があります。 (ExcelVBAで 整数値を扱う場合、Long 型を指定しておけば 無難)
関数とは異なり Subプロシージャは結果を返しませんが、引数など 2つのプロシージャで他に差異はありません。
「階和」の結果を返す関数で、コード中のコメントにもあるとおり「 n * (n + 1) / 2 」でも計算できますが、前回に引き続き For 〜 Next ループを利用して計算しています。(Step 1 の場合のみ、省略可能)
判別しやすいように「FuncTest1」とコード記述しますが、VB (Visual Basic) は大文字/小文字を区別しないため、呼び出し時は 全部小文字あるいは大文字で入力しても問題ありません。
「引数(パラメーター)」 と 「関数の返り値」の指定方法
前回まで使用したSubプロシージャには引数が無かったため プロシージャ名の後は () でしたが、今回は引数(パラメーター)を1つ持つため FuncTest1( n As Long ) となっている点に注意してください。
引数を利用すると、外部からプロシージャ内へ値を渡すことが可能になります。 変数宣言の Dim 文と同様、引数も「変数名 As 変数の型」のように指定します。 Integer 型では格納できる範囲が限られているため、Integer 型より大きい整数値を格納可能な Long 型を使用しています。
関数は Subプロシージャと同様に () 内に「引数(パラメータ)」を列挙し、 () の後の As 型名 で「関数の返り値」の型を指定。
引数は , で区切ることにより複数指定可能だが、「関数の返り値」は一つだけ
引数は複数指定可能ですが、「関数の返り値」は一つだけしか指定できません。(ただし、配列やポインタ返しを利用すれば、複数の結果を返す事は可能)
Function の前の Public キーワードは前に説明した通り、(このプロシージャを)利用できる範囲 つまり スコープ を指定しています。 Public だとすべてのモジュール( ThisWorkbook を含む )内で有効。
よって Public を指定した関数は 当Excelブック内のワークシートからも呼び出すことが可能で、Excelに元々用意された関数と同様に利用できます。 ExcelVBA のとても便利な機能で、「ユーザー定義関数」と言います!
「ユーザー定義関数」は Excelワークシートからも利用可能
上記画面のように ワークシート上のセル「B1」に =Fu など3文字位を入力すると 「ユーザー定義関数」も併せて候補表示されるため FuncTest1 をクリックすると関数名が補完され、 =FuncTest1( と表示されます。
通常の Excel関数と同様に「A1」セルをクリックすると =FuncTest1(A1 まで補完されるため [return] キーを押して =FuncTest1(A1) にて確定すると、「B1」セルに「 FuncTest1(1) ユーザー定義関数 」の実行結果が表示されます。
「B1」セル選択後 [command] + [C] でコピーし、「B2:B10」セル選択後に [command] + [V] で貼り付けすると「 引数 n に 2 から 10 を指定した場合の結果 」が各セルに順に表示されます。
どうです 便利だと思いませんか? 自分専用の関数をどんどん追加可能なんですよ! このように、プロシージャ内から 関数を呼び出す以外に Excelワークシートから 自分の作成した関数を利用できる点が Excel VBA が重宝する理由の一つです。
[command] + [Q] にてまず VBE を終了し、Excel のウィンドウ内を選択して [command] + [Q] にて Excel も終了させます。 「作業中のブック」を保存するか確認のダイアログ画面が表示された場合は 「保存」しましょう。 「自動保存」済みの場合、保存するかどうかの確認ダイアログ画面は表示されません。
次回は、C言語みたいに 再帰関数で「階乗」を作ります!
最後まで読んでいただき、ありがとうございます。 また、お越しくださいませ。
// アタル