- 引数って何?そもそもなんて読むの?
- 戻り値って何?
プログラミングの基礎用語として、「引数(ひきすう)」と「戻り値(もどりち)」があります。
引数とは、処理を始める前に受け取る値(変数)のことです。
戻り値とは、処理の後に返してあげる値のことです。
この2つはVBAに限らず、様々なプログラミング言語に登場し、基礎や大規模システムに関わらず絶対に使用する重要要素です。
この記事では、以下について実例を踏まえて解説しています。
- 引数とは何か
- 戻り値とは何か
- VBAの引数の渡し方
ここをマスターしないとこの先必ず苦労することになりますので、まずは用語の意味から理解して使いこなせるようになっていきましょう。
引数(ひきすう)とは
引数とは関数に対して処理をする際に渡してあげる値(変数)のことです。
書き方の例としては、
Sub 引数テスト(test As String) MsgBox test End Sub
このように、「()」の中に受け取るための変数名+型を宣言してあげます。
例の場合、test
が引数になります。
これは、「引数テスト」という処理を呼び出す際に引数test
に文字列型の値を設定してあげる必要があります。
具体的には、以下のように呼び出します。
Call 引数テスト("こんにちは")
VBAでの引数には以下の特徴があります。
- 引数を渡さないと処理が実行できない
- 引数は複数設定可能
└複数設定する場合、カンマで区切ります。 - 引数を設定した処理内では、引数の変数名は使用可能
└上記例の場合、「引数テスト」内ではtest
が使えます。
また、その際初期値は受け取った値になり、途中で代入することも可能です。
引数は、例えるならラーメン屋のようなものです。
ラーメン屋(関数)に、メニューとお金を渡す(引数を渡す)と、ラーメンを作ってくれます。
ラーメンを作るうえで「何を作るのか(種類)」「お金を払ってもらったか(フラグ)」はラーメンを作る(処理)ために必要な値になります。
このように、処理をする上で必要な前提条件などを他から受け取る際に引数を使うことが多いです。
引数の渡し方「参照渡し」と「値渡し」
VBAの引数の渡し方には2種類あり、それぞれ参照渡しと値渡しがあります。
引数の変数名の前に、参照渡しならByRef、値渡しならByValを付けます。
それぞれ解説していきます。
参照渡し
変数ごと渡します。
変数ごと渡すので、渡された関数が変数の編集を行った後、呼び出し元の変数も編集後の状態になっています。
例えば、以下のように引数が設定された関数があった場合、
Sub 参照渡し(ByRef hoge as String) hoge = hoge & "です。" End Sub
以下の通り呼び出すとコメントのような結果が得られます。
Sub 結果確認() Dim test as String test = "MSらるじゅ" Debug.pring test '//MSらるじゅ Call 参照渡し(test) Debug.Print test '//MSらるじゅです。 End Sub
「結果確認」のtest
を関数「参照渡し」で編集したため、処理実行後の「結果確認」の変数の値が変わっています。
後述しますが、戻り値がどうしても複数欲しい場合などに使用します。
値渡し
変数の中身(値)のみを渡します。
値しか渡さないので、呼び出し元の変数が変わることはありません。
例えば、以下のように引数が設定された関数があった場合、
Sub 値渡し(ByVal hoge as String) hoge = hoge & "です。" End Sub
以下の通り呼び出すとコメントのような結果が得られます。
Sub 結果確認() Dim test as String test = "MSらるじゅ" Debug.pring test '//MSらるじゅ Call 値渡し(test) Debug.Print test '//MSらるじゅ End Sub
「値渡し」には、変数の値しか渡していないため、処理前後で「結果確認」の変数の値は変わりません。
なお、困ったら値渡しにしておいてください、参照渡しの場合は呼び出し元の変数が変わってしまうリスクがあるからです。
戻り値(もどりち)とは
戻り値とは、関数の処理後に返す値のことです。
VBAでは、Functionプロシージャのみで書くことができます。Subプロシージャは戻り値を設定することができません。
Functionプロシージャについては以下の記事で解説しています。
【これを覚えてVBAをすんなり理解!】プロジェクト>モジュール>プロシージャとは?
書き方の例としては、
Function 戻り値テスト() As String 戻り値テスト = "このように戻り値を設定します" End Function
このように、プロシージャの後に型を宣言してあげます。
上記例では、「戻り値テスト」というFunctionプロシージャ自体に戻り値を設定しています。
そして、戻り値を呼び出す際は、直接変数に代入したり、変数のように処理用の値として使う必要があります。
Sub test() Dim hoge As String hoge = 戻り値テスト MsgBox 戻り値テスト End Sub
testプロシージャ内2行目では、変数に戻り値を代入しています。
3行目では、MsgBoxに直接戻り値を設定し、戻り値の文字列をメッセージボックスとして表示する処理を行っています。
戻り値もラーメン屋で例えることができます。
ラーメン屋はラーメンを作ったらそれで終わりではなく、ラーメンをお客さんに提供する必要があります。
この提供したラーメンが戻り値ということになります。
このように、戻り値は処理を関数に依頼して、その結果が欲しいときに使うことが多いです。
なお、戻り値は複数設定することができません。
そのため、複数の戻り値が欲しい場合は以下で対応します。
- 引数を参照渡しにする
└引数を参照渡しにすることで、呼び出し先の関数で呼び出し元に値を返すことが可能になります。 - 変数のスコープを変更する
└スコープを広げることでどの関数からも変数にアクセスできるようになり、呼び出し先の関数で呼び出し元と同じ変数を編集することが可能になります。
スコープについては以下の記事で解説しています。
【変数とは?】プログラミングの基礎をVBAを例にわかりやすく解説!
引数&戻り値
引数と戻り値は同じ関数に設定することも可能です。
というか、どちらも設定する関数の方が多いです。
書き方の例としては、
Function 引数と戻り値(ByVal okFlag As Boolean) As String If okFlag = True Then 引数と戻り値 = "合格" Else 引数と戻り値 = "不合格" End If End Function
このように、引数と戻り値どちらも設定してあげます。
この例の場合、引数のokFlag
がTrueなら合格、Falseなら不合格を返す関数になりました。
では、この関数を使うための処理を書いてみます。
Sub result() Dim mathResult As Long Dim scienceResult As Long Dim resultFlag As Boolean mathResult = 60 scienceResult = 70 If (mathResult + scienceResult) >= 120 Then resultFlag = True Else resultFlag = False End If MsgBox 引数と戻り値(resultFlag) End Sub
これは、数学の点数(mathResult
)と理科の点数(scienceResult
)の合計で合格か不合格かをメッセージボックスに表示する処理になっています。
上記処理の場合の順序は以下の通りです。
- 合計は130でIf文で条件を満たすため、フラグ(
resultFlag
)にTrueが入る。 - 関数「引数と戻り値」が呼び出される。
その際の引数はresultFlag
。つまり、Trueが渡される。 - 「引数と戻り値」で、引数がTrueのため、戻り値として「合格」が返される。
- 戻り値の内容(合格)がメッセージボックスで表示される。
このように、引数と戻り値を使うことで、引数のフラグによる判定結果を返したり、引数の値を加工した結果を返したりと幅広い使い方ができるようになります。
また、すべて同じ処理ではなく、判定部分や加工部分を関数として分けてあげることで他の処理の時にも使うことができます。
この考え方はオブジェクト指向を勉強すると身に付けることができます。
上記例の場合だと、国語+英語+社会の点数を合計する別処理で「引数と戻り値」の関数を使ったり、5教科すべての合計や平均点の場合などいろいろなパターンの処理に応用することができます。
まとめ|引数と戻り値はExcel関数にも使われているプログラミングの基礎!
今回はプログラミングの基礎でもある、引数と戻り値について解説しました。
実は、Excelの関数にも引数と戻り値は使われています。
SUM関数を見てみましょう。
=SUM(A1:A10)
この通り、()の中のA1:A10
が引数でその結果、つまりA1:A10の合計が戻り値になります。
知らず知らずのうちに使っていた方も多いと思いますが、理解することで関数の定着率はとても上がります。
合わせて、変数の型について理解することで、「引数に何を設定すればいいのか」などが分かるようになります。
変数については以下で解説しています。合わせてご覧下さい。
【変数とは?】プログラミングの基礎をVBAを例にわかりやすく解説!