戻り値を複数返す方法
Functionプロシージャでは戻り値を返すことが出来ますが、2つ以上の複数の値を返してほしい場合があります。
しかし、残念ながら戻り値は1つしかありません。戻り値を増やすことは出来ません。
そこで、疑似的な戻り値として別の方法で複数の値を返す方法を考える必要が出てきます。
その場合の対応方法にはいくつかあります。
- 戻り値に配列を利用する
- 戻り値をArray関数で配列化する
- 必要な戻り値の数だけ引数を用意する
他にも戻り値にユーザー定義型やコレクションを利用することも可能です。戻り値に設定するものが何か、という違いしかなく、書き方は配列の場合と変わりません。
モジュールの強度や結合度を考えるのであれば、引数を利用するのが一番ですが、そこまでこだわらなくてもいい場合は、戻り値に配列などを利用します。
ここでは上で挙げた3つについてサンプルコードを紹介します。
1. 戻り値に配列を利用する
以下は配列で戻り値を返す関数とその利用例です。
配列を返す関数
引数でファイルパスを渡され、それを\文字で区切った結果の配列を戻り値として返す関数です。
Split関数の結果はVariant型の配列になるため、それをそのまま返しています。
1 2 3 4 5 6 7 |
Function MultiReturn(a_sPath) Dim v v = Split(a_sPath, "\") MultiReturn = v End Function |
配列を返す関数の利用例
ファイルパスを渡してフォルダとファイルが配列の各要素に分割されていることを確認するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub MultiReturnTest() Dim sPath Dim v Dim s sPath = "C:\web\test\abc.txt" v = MultiReturn(sPath) For Each s In v Debug.Print s Next End Sub |
2. 戻り値をArray関数で配列化する
以下は配列をArray関数で作成して戻り値を返す関数とその利用例です。
配列をArray関数で返す関数
引数のファイルパスをパス部分とファイル名部分に分ける関数です。戻り値にはパスとファイル名をArray関数で配列化して返します。
1 2 3 4 5 6 7 8 9 10 11 12 |
Function MultiReturnArray(a_sPath) Dim sPath Dim sFile Dim i i = InStrRev(a_sPath, "\") sPath = Left(a_sPath, i) sFile = Mid(a_sPath, i + 1) MultiReturnArray = Array(sPath, sFile) End Function |
配列をArray関数で返す関数の利用例
先の利用例と同じですが、ファイルパスを渡して、それがパスとファイル名に分かれていることを確認するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub MultiReturnArrayTest() Dim sPath Dim v Dim s sPath = "C:\web\test\abc.txt" v = MultiReturnArray(sPath) For Each s In v Debug.Print s Next End Sub |
3. 必要な戻り値の数だけ引数を用意する
戻り値として必要な値を引数に用意する方法のサンプルです。
必要な値を引数で返す関数
1番目の引数はIN用引数で、2番目と3番目がOUT用引数になります。
1 2 3 4 5 6 7 8 9 10 |
Sub MultiParam(a_sPath, a_sDir, a_sFile) Dim sPath Dim sFile Dim i i = InStrRev(a_sPath, "\") a_sDir = Left(a_sPath, i) a_sFile = Mid(a_sPath, i + 1) End Sub |
必要な値を引数で返す関数の利用例
関数の引数に合わせて呼び出し元でも引数を用意し、それで関数の結果を受け取ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub MultiParamTest() Dim sPath Dim s Dim sDir Dim sFile sPath = "C:\web\test\abc.txt" Call MultiParam(sPath, sDir, sFile) Debug.Print sDir Debug.Print sFile End Sub |