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

User def Function(Png)

[06] Excel ユーザー定義関数の作成

 Excelワークシートからも呼び出せる「関数」を作成してみよう! 

「返り値」を持つ Functionプロシージャ(関数)
「引数(パラメーター)」と「関数の返り値」

・「引数」は , で区切ることにより複数指定可能だが、「関数の返り値」は一つだけ
「ユーザー定義関数」は Excelワークシートからも利用可能




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

 まず、Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。

 Excelワークシートからも呼び出せる「関数」を作成してみよう! 

vba2019_primer[06] 01_png

 「空のブック」Excelファイルを新規作成にて作成後、A1 〜 A3 セルに 1, 2, 3 と入力します。
「A1 : A3」セル選択後、右下のポインタを下にドラッグして「A10」セルにてマウスを離します。

vba2019_primer[06] 02_png

 「A10」セルまで フィルされます。

vba2019_primer[06] 03_png

 「名前を付けて保存…」にて、「Excel マクロ有効ブック(.xlsm)」ファイル形式を選び 任意の名前で保存。

vba2019_primer[06] 04_png

 ( [マクロの記録] ボタンをクリックして)マクロの保存先に「作業中のブック」を指定後 [OK] ボタンをクリックし、「マクロの記録」を開始
「A1」セルを選択後、( [記録終了] ボタンをクリックして)「マクロの記録」を終了

vba2019_primer[06] 05_png

 [マクロ] ボタンをクリックして 先ほど作成した「マクロ名」を選択後、[編集] ボタンをクリック

 「返り値」を持つ Functionプロシージャ(関数) の作成 

vba2019_primer[06] 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

 上記画面のように ワークシート上のセル「B1」に =Fu など3文字位を入力すると 「ユーザー定義関数」も併せて候補表示されるため FuncTest1 をクリックすると関数名が補完され、 =FuncTest1( と表示されます。

vba2019_primer[06] 08_png

 通常の Excel関数と同様に「A1」セルをクリックすると =FuncTest1(A1 まで補完されるため [return] キーを押して =FuncTest1(A1) にて確定すると、「B1」セルに「 FuncTest1(1) ユーザー定義関数 」の実行結果が表示されます。

vba2019_primer[06] 09_png

 「B1」セル選択後 [command] + [C] でコピーし、「B2:B10」セル選択後に [command] + [V] で貼り付けすると「 引数 n に 2 から 10 を指定した場合の結果 」が各セルに順に表示されます。
 どうです 便利だと思いませんか? 自分専用の関数をどんどん追加可能なんですよ! このように、プロシージャ内から 関数を呼び出す以外に Excelワークシートから 自分の作成した関数を利用できる点が Excel VBA が重宝する理由の一つです。

vba2019_primer[06] 10_png


 [command] + [Q] にてまず VBE を終了し、Excel のウィンドウ内を選択して [command] + [Q] にて Excel も終了させます。 「作業中のブック」を保存するか確認のダイアログ画面が表示された場合は 「保存」しましょう。 「自動保存」済みの場合、保存するかどうかの確認ダイアログ画面は表示されません。

 次回は、C言語みたいに 再帰関数で「階乗」を作ります!





広告
  




Macブログ ランキング アイコン
最後まで読んでいただき、ありがとうございます。 また、お越しくださいませ。
// アタル
For follow LINE Reader Group!Subscribe to this blog on Feedly!

Next Post Previous Post
No Comment
Add Comment
comment url