ユーザー定義関数の作成 Macユーザー向け Excel VBA 入門 [06] Excel2019 for Mac

[06] Excel ユーザー定義関数の作成
Excelワークシートからも呼び出せる「関数」を作成してみよう!
・「返り値」を持つ Functionプロシージャ(関数)
・「引数(パラメーター)」と「関数の返り値」
・「引数」は , で区切ることにより複数指定可能だが、「関数の返り値」は一つだけ
・「ユーザー定義関数」は Excelワークシートからも利用可能
Macユーザー向け Excel VBA 入門 [06] ユーザー定義関数の作成
まず、Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。
Excelワークシートからも呼び出せる「関数」を作成してみよう!
![vba2019_primer[06] 01_png](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrmDIQah0QZSXWNj5geGcD3HHaIjh1hUsFCTKtCGPAxJYMDyTyoKIO9jeiGcvPDR-DNR-OkEDszmfAfSbTjKfTHyT-EfS8k4pNkH6dZbOcWw8VNHogNSFJVVrhngw5KSQeENP_Ahg_XVo/s0/20210717_01.png)
「空のブック」Excelファイルを新規作成にて作成後、A1 〜 A3 セルに 1, 2, 3 と入力します。
「A1 : A3」セル選択後、右下のポインタを下にドラッグして「A10」セルにてマウスを離します。
![vba2019_primer[06] 02_png](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOiFD0FOizZSsvIfO0YENXmHPu37PNx8hc-9vcD9E5eKDQNejfO7_P89prnu_niThdkheYgpCHMeC3i3q2zTUbrN1fZw8W6JzxKhFjK84jwaFHTVSyyRk7AgN_lnGXenDzatwEksOvero/s0/20210717_02.png)
「A10」セルまで フィルされます。
![vba2019_primer[06] 03_png](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz7DBW53-o_b_V9TUesKc2OtPDzoDm_V0lyirMZAnT1t2KthTYkKJzOgwQyzy1jcPLboq0XPowEhPLkpNO3vfCeKo39hfKe-DiHftJUXgIh8f8ERJrxyt4KND7Rp10FGCpVSiiIKYE7XE/s0/20210717_03.png)
「名前を付けて保存…」にて、「Excel マクロ有効ブック(.xlsm)」ファイル形式を選び 任意の名前で保存。
![vba2019_primer[06] 04_png](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1kohy546JQHnF6QYwVMT-sayczOncAwyUqAbJteKdKwRnWcJy4pfobsWjU1G161MyCyl3Ky7txZEfrylZPM2HpdMBFhpfVB5Sw7ygam1oxudMNKHIPOkElkg9Xd3h89oi9FC5MV3bT8M/s0/20210717_04.png)
( [マクロの記録] ボタンをクリックして)マクロの保存先に「作業中のブック」を指定後 [OK] ボタンをクリックし、「マクロの記録」を開始。
「A1」セルを選択後、( [記録終了] ボタンをクリックして)「マクロの記録」を終了。
![vba2019_primer[06] 05_png](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg13uCNo0mrYHtTNm1Rsg6akBhyphenhyphenBariTq_4s-NsJOGswvwdPENo80Xs7sv-_V9wmaBCMG3I9sZQrHMvi7o7eLA08iW_vlOqc1Dq1Dqyq1UgxSbWnVI_cd3J5NXUsyit1905ZdO1BAwOHa4/s0/20210717_05.png)
[マクロ] ボタンをクリックして 先ほど作成した「マクロ名」を選択後、[編集] ボタンをクリック。
「返り値」を持つ Functionプロシージャ(関数) の作成
![vba2019_primer[06] 06_png](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikvHz8Ww_yIUdkvbGjHl7ULomfconDVlIoHAEVsKzauP3zfn4CGhRNQJJA302iPPaAnueuKA1meFdzv12TmRqfKL5fH2tiZSuxBNtyUdPmbvdQIdB_6cxifs__ZmjvQJw7q6rFTM_kc0M/s0/20210717_06.png)
上記画面のように 下記 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ワークシートからも利用可能
![vba2019_primer[06] 07_png](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkpYJWGF67dcPoViRU2JFAE2KBIeAOYnxTdJ5cllsfnEc18_acYngdb1ckIWi7FXWZY3TMYlQwJCfDv8zfR-XxfQtK_VdNAoeVmhVhzkj42MXxmtejD18nzaysn0_jZsq0osK5Ei-CCHY/s0/20210717_07.png)
上記画面のように ワークシート上のセル「B1」に =Fu など3文字位を入力すると 「ユーザー定義関数」も併せて候補表示されるため FuncTest1 をクリックすると関数名が補完され、 =FuncTest1( と表示されます。
![vba2019_primer[06] 08_png](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtYVJt_ZZ02D7Uk0H0H4hHU3VEbYfv8vyM7ezt56nEaeIsczwV9tD0wvRNoO-1KltMhUkNINisw2jfDGnlqfK_ux-2ICw08m8P3s8z_Xu-5vuhjTGqaZGcFeCB4W_yywIq3R7nSR3hcM0/s0/20210717_08.png)
通常の Excel関数と同様に「A1」セルをクリックすると =FuncTest1(A1 まで補完されるため [return] キーを押して =FuncTest1(A1) にて確定すると、「B1」セルに「 FuncTest1(1) ユーザー定義関数 」の実行結果が表示されます。
![vba2019_primer[06] 09_png](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikDGJ0_cfFns-Wk7uuOzg-5TRc9wD5ZHuBSAGWqUOTbKSDspVk70FzYeUn3b8pO45YJOsmHBB_xXVfxweeNqa-CYoDRzyLSB-IjrTBvBFy5uEei8IRls_RbsLkRQNYR6PdFpXsEcZSwXk/s0/20210717_09.png)
「B1」セル選択後 [command] + [C] でコピーし、「B2:B10」セル選択後に [command] + [V] で貼り付けすると「 引数 n に 2 から 10 を指定した場合の結果 」が各セルに順に表示されます。
どうです 便利だと思いませんか? 自分専用の関数をどんどん追加可能なんですよ! このように、プロシージャ内から 関数を呼び出す以外に Excelワークシートから 自分の作成した関数を利用できる点が Excel VBA が重宝する理由の一つです。
![vba2019_primer[06] 10_png](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPY-TKTBicmAWEouvZdxIxLVruUB5wyouY0dNYKNnjLULvE-i5y2jq1PU-5hmOqRWqH6NFcdCLL1f97yRJZXPKk_nXDdEMT54hXhxzB37mcxgy-7aQhq7KojbhkXK9HcMPdG3XCmq1oQk/s0/20210717_10.png)
[command] + [Q] にてまず VBE を終了し、Excel のウィンドウ内を選択して [command] + [Q] にて Excel も終了させます。 「作業中のブック」を保存するか確認のダイアログ画面が表示された場合は 「保存」しましょう。 「自動保存」済みの場合、保存するかどうかの確認ダイアログ画面は表示されません。
次回は、C言語みたいに 再帰関数で「階乗」を作ります!
最後まで読んでいただき、ありがとうございます。 また、お越しくださいませ。
// アタル