Excelって関数が色々ありますよね?
代表的なものだと
- SUM関数
- SUMIF関数
- IF関数
- VLOOKUP関数
- COUNTIF関数
などなど…
これがある事により、Excelでの作業が大幅に効率が上がりますよね?
今回からExcelVBAで関数を自作していつも行う作業の効率をあげられるようにお勉強していきましょう。
関数とは!?
関数とは基本的に「引数(ひきすう)」といわれるものを与えられて動作するものです。
引数を与えられ、その引数を元に命令をこなし結果を呼び出し元に返すものの事ですね。
この呼び出し元に返す値の事を「戻り値」といいます。
引数とは!?
では引数について考えてみましょう。
ひとまずExcelで想像してみましょう。
例えばSUM関数で考えてみましょう。SUM関数とは与えられた数字、あるいは与えられたセルの場所に入っている数字を合計して返してくれる関数ですね。
この指定する数字、あるいはセルの場所のことを引数といいます。
この様に=sum(と入力した時に出てくる数値1,[数値2]のようなものが引数と呼ばれるものですね。ちなみにこの[]は省略可能という事です。
つまり、このSUM関数は最低1つ以上の数値が与えられれば動作しますという事ですね。
そしてこの1つ目の数値、つまり数値1の事を「引数1」、2つ目の数値、つまり数値2の事を「引数2」と呼んだりします。
そして引数が与えられた結果がセルに出力されるわけですよね。
この出力される結果が「戻り値」というわけです。
簡単なSUM関数をVBAで作ってみましょう
関数の定義をしましょう
では数値が絶対に2つ必要なシンプルな作りのSUM関数をVBAで作ってみましょう。
戻り値のある関数を作る時はFunctionプロシージャというものを使用していきます。
今までのSubの代わりにFunctionになっただけですね。
関数の名前は「mySum」としました。()の中身が引数になります。Dimがないのでちょっと違和感があるかも知れませんが変数として扱うわけですね。
引数1として与えられたaはLong型、引数2として与えられたbもLong型という事ですね。
そしてこれまた違和感があるかも知れませんが()の後にもAs Longと書いてますね。
これはこの「mySum」という関数は戻り値としてLong型の数値を呼び出し元に返しますよ!という事です。
実際の処理を記述しましょう
今回作るのはSUM関数的なものなので引数1と引数2を足して呼び出し元に返すだけですね。
という事で記述してみましょう。
Function mySum(a As Long, b As Long) As Long mySum = a + b End Function
たったのこれだけです。
関数の場合は呼び出し元に値を返すので自分自身(関数名)に値を入れるだけです。
これで引数1と引数2の合計値が呼び出し元に返ります。
関数を呼び出してみよう
関数の呼び出しは簡単です。
関数名 引数1,引数2
と記述するだけです。
ただし、関数の場合はその値をセルに出力するか変数に代入する事が多いと思います。
その場合は
変数 = 関数名(引数1,引数2)
セル範囲 = 関数名(引数1,引数2)
の様に引数を()で括ってあげなければいけません。
では実際にSubプロシージャを作ってSubプロシージャの中で関数を呼び出す記述をしてみましょう。
Sub function_test() Dim c As Long c = mySum(1, 2) Debug.Print c End Sub Function mySum(a As Long, b As Long) As Long mySum = a + b End Function
今回はcという変数をLong型で宣言してその変数に1+2の結果を返しているわけですね。
この際気を付ける事は関数の戻り値となる型と代入する変数の型は一致させるようにすることです。
この場合はcという変数をInteger型で宣言しても正常に動作しますが、Integerの範囲を超える値が戻り値だった場合はエラーになってしまいます。
cという変数がString型でも正常に動作しますが、返り値が文字列に変換されてしまいます。
そして引数として与える数値も引数の型で宣言したものと合わせましょう。この場合は整数型で与える事が必要ですね。
仮に変数に入った値をmySumで計算するとしましょう。
引数1に与える予定の変数がInteger型、引数2に与える予定の変数がByte型だったとします。
この場合はエラーになってしまいます。
「コンパイルエラー:ByRef 引数の型が一致しません。」となってしまいます。
これは関数として定義したものの引数の型と呼び出し元の引数の型が一致してませんよ!っていうエラーです。
この様に関数を自作して使用する場合はより一層と型に気を配る必要がある。というわけですね。
まとめ
- 関数とは、引数を与えられて動作するものである。
- 引数とは、関数が処理をする為に必要なものである。
- 処理した結果が呼び出し元に返る。この値を「戻り値」という
- 関数の戻り値を出力、あるいは代入する場合は引数を()で括る
- 引数・戻り値の型に気を付けよう
では次回からはもう少し複雑な関数を作っていこうかと思います。