• ベストアンサー

Functionで戻り値を複数返す方法

Functionで戻り値を複数取得したいのですが うまくいきません。(NULLの使い方が不正ですとエラー) 戻り値に配列を使う場合 呼び出し側はどのように記述すればいいでしょうか? <呼び出し側> Private Sub a() wkkekka1 = 処理結果(Kensu, Houhou)(0) ⇒ ここでエラー wkkekka2 = 処理結果(Kensu, Houhou)(1) wkkekka3 = 処理結果(Kensu, Houhou)(2) End Sub <関数> Public Function 処理結果(ByRef lngKensu As Long, ByRef strHouhou As String) Dim kekka(3) As Double If lngKensu = 1000 and strHouhou = aaaaaa then kekka(0) =  0.1 kekka(1) =  2   kekka(2) =  300 Else ↓ (省略)     ↓ End If 処理結果 = kekka End Function

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

関数 処理結果の戻り型を As Double() と定義します 呼び出し元で Dim arKekka as double() arKekka = 処理結果(Kensu, Houhou) で受け取り wkekka1 = arKekka(0) wkekka2 = arKekka(1) wkekka3 = arKekka(2) といった具合にして見ましょう 3個の結果を返すなら変数kekkaの宣言は dim kekka(2) as Double としましょう

teartisu
質問者

お礼

初心者にもとてもわかりやすいアドバイス ありがとうございます。 しっかり理解できました★

その他の回答 (3)

回答No.4

この関数の呼び出しが多用されるのであれば、その処理用の構造体なりクラスなりを用意して、関数の戻りはその型で返すようにするというのが 一番エレガントな答えじゃないかと思います。(手間との兼ね合いがありますが) ちなみに上のような呼び出しが可能であっても(VB.netで関数の戻りの型を明示すれば可能のはず)上の使い方だと、関数が3回呼び出されることになります。 関数の呼び出しは最小限にして、戻りを変数に格納して使う習慣はつけといていいかと思います。 No1の返信について >呼び出し側では戻り値に使用する3つの引数には何もセットしない・・ということになるのでしょうか? 何もセットしないというよりは、初期化した変数をセットするというのが無難かと思います。 # FunctionならOutput引数は使わないというのは当然として、個人的には「答えを返す」のであれば極力関数の戻りとしてとるべきだと思っています。(そのほうがよんでいてわかりやすいし)

teartisu
質問者

お礼

関数が3回呼び出されることになるんですね NO1の返信についてのコメントも ありがとうございます。 よくわかりました。

  • Willyt
  • ベストアンサー率25% (2858/11131)
回答No.2

 関数というのは元来アウトプットされるデータが一つのものを指します。コール・バイ・ネームで引き数を定義すればデータを持ち出すことができますが、これは飽くまで非常手段であり、複数のアウトプットデータがある場合は Procedure として定義するべきです。そしてインプットデータはコール・バイ・バリュー、アウトプットデータはコール・バイ・ネームで宣言すると後のデバッグで紛れがなくなります。自分でコーディングするからいいじゃないか、それは勝手だというのは全く違います。自分で組んだルーチンは殆ど頭に残っておらず、それぞれがどういう計算をしているのかが分からなくなってしまい勝ちなのでできるだけ紛れのない構造にしておくことが大切なのです。 引数は何を意味するのかを、註釈で説明しておくことも大切ですよ。  これは大きなシステムを大人数で共同開発するときには必要不可欠なことなのですが、一人で組むプログラムも全く同じですよ。

teartisu
質問者

お礼

初心者かつ独学ではじめている為 まだまだ勉強不足です。 一字一句の理解から時間がかかってしまうので Willytにアドバイスしていただいた語句は ひとつづつ調べてみて理解していこうと思います。 取り急ぎお礼させていただきます。 ありがとうございました。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

同じような質問がありました。 http://oshiete1.goo.ne.jp/qa3511531.html No.3及びNo.4の回答がそのままではないかと思います。 #個人的には参照型引数使いたいケースですが

teartisu
質問者

お礼

早速試したらできました。 とても助かりました! ありがとうございました。 ちなみに参照型引数について、調べてみました。 引数にも値をセットできるという事でしょうか? 今回の場合でいうと、 もともと必要な2つの引数+値を戻したい3つの引数=5つの引数を指定しておいて 呼び出し側では戻り値に使用する3つの引数には何もセットしない・・ということになるのでしょうか?

関連するQ&A