• ベストアンサー

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

  • 引数で戻り値を取得するプログラム

    以下のように、引数で戻り値を取得するプログラムを書きたいのですが どのように書けば正しいでしょうか? VB6とVB2005の両方の書き方を教えてください。 sub kekka(byval src as string, byref dst() as string) dim ret() as string ret(0) = "abc" ret(1) = "efg" kekka = ret end sub kekka("xxx", dat() ) msgbox(dat(0)) msgbox(dat(1))

  • EXCELVBAでのFunctionプロシージャの戻り値について

    こんにちは。EXCELVBAの本を見てわからないことがあったので、教えてください。 まず、ソースコードは↓です Function P_OpenDatabase() As Integer On Error GoTo Err_Proc   Cn.ConnectionString=P_CnString()   Cn.Open Err_Proc:   If (Err.Number <> 0) Then     Call MsgBox(Err.Description)     Call MsgBox("データベースに接続できません")   End If   P_OpenDatabase = Err.Number…★ End Function で、わからないところは★の部分です 本の解説は↓です。 「プロシージャの戻り値を設定します。Errオブジェクトの「Number」プロパティにはエラーの番号が設定されているので、そのまま戻り値とします。処理が正常に行われたときには、Errオブジェクトの「Number」プロパティは「0(ゼロ)」になるので、戻り値も「0(ゼロ)」になります。」 僕が疑問に思っているのは処理が正常にされたとき(エラーがなかったとき)は、Err_Procの中の処理はされないので、戻り値には0が入らないのでは?と思ってしまうのですが。。 どうなんですかね?わかる方は教えてください。よろしくお願いします。

  • Functionの戻り値を配列にしたいのですが

    vbを始めたばかりですがよろしくお願いします。 Functionの戻り値を配列にしたいのですが Function fnc(ByVal a As Byte, ByVal b As Byte) As Integer() fnc(0) = a + b fnc(1) = a - b End Function というような使い方はできないのでしょうか? 一つのFunctionで二つの計算結果をかえすには どうしたらよいのでしょうか? お願いします。

  • Function プロシージャの戻り値にバグ?

    いつも拝見させていただいてます。 今回Excel VBAでタイムスケジュールを作成したところ、まったくわけのわからないエラーが発生してしまい途方に暮れており、皆様のお力をお借りしたく投稿させていただきます。 エラーの内容は簡単に言うと Function プロシージャの戻り値がなくなってしまう(0になっている)ことです。 ESC = ESColumn(EventStart) ---------------------------------- Function ESColumn(TimecoluConv As Date) As Integer Select Case TimecoluConv Case "8:00:00" ESColumn = 2 Case "8:10:00" ESColumn = 3 Case "8:20:00" ESColumn = 4 ・・・ End Select End Function と、このようなコードで入力された時間を数値に変換しているのですが、 繰り返し処理をしているといきなり戻り値が0になってしまいます。 今回は8:00を6回取得した後、8:10を変換しようとしたら戻り値が0になっていました。 戻り値を使用して、セルを選択するため、そのタイミングでエラーになります。 なぜ繰り返し処理の途中で発生するのでしょうか。 解説と対策をご教示していただけると大変助かります。 よろしくお願いします。

  • Functionでの戻り値のとり方

    こんばんわ。 以下のように、Functionで引数に配列を指定して、戻り値も配列で取得したいのですが、方法としては以下のようにしかできないのでしょうか? ------------------------- '配列を宣言 dim Ary() as string dim AryRet() as string '戻り値の配列 Call Get_Ary(Ary(),AryRet()) ------------------------- Function Get_Ary(Ary() as string , AryRet() as string) 'Ary()を参照して、AryRet()を取得する End Function という風に書いているのですが、Functionのところを以下のように 書くのは無理でしょうか? うまく取れないというのはやっぱ無理なのかな・・ ------------------------- '配列を宣言 dim Ary() as string dim AryRet() as string '戻り値の配列 AryRet() = Get_Ary(Ary()) Function Get_Ary(Ary() as string) As string 'Ary()を参照して、AryRet()を取得する 'それを関数の戻り値とする Get_Ary = AryRet(index) End Function このように書くと、配列の最後のインデックスの値だけ取れてしまう ようなんですが、、やっぱ配列で返すというのは上記のやり方でないと 無理なのでしょうか? 詳しい方ご教示願います。

  • oracleのfunctionで戻り値複数個

    oracleのストアドプロシージャのファンクションについてですが、 ファンクションは、戻り値を返すことができますが、 それを、複数個返すことはできるのでしょうか。 CREATE [OR REPLACE] FUNCTION ファンクション名(引数 IN データ型[, ...]) RETURN 戻り値の型 IS 宣言部 BEGIN 処理部 END ; お願いします。

  • ExcelVBAで他のファイル(project)のプロシージャから配列の戻り値を取得したい

    自作アドインに、byref型で配列を引数にしたプロシージャを作り、別のファイルのプロシージャからそのアドインを呼び出して、アドインのプロシージャで配列に処理をして、その結果を呼び出し元のファイルのプロシージャで使用したいのですが、処理できないようです。 例えば、 アドイン側 myAddin.xla sub test(byref strAry() as string) strAry(0)="a":strary(1)="b" end sub 呼び出し元 sub execute() dim myAry() as string redim myAry(1) application.run macro:="myAddin.xla!test",arg1:=myAry() msgbox myAry(0) & "-" & myAry(1) end sub 上記のコーディングをしても、表示されるメッセージは "-" のみです。 アドインの処理はまったく反映されていません。 変数であればアドイン側をFunctionにして戻り値を取得できたのですが、配列ですとうまくいきません。 別のプロジェクトから、配列を返す方法はありませんか?

  • 別ブックのFunctionを呼び出し戻り値を取得

    こちらの識者の方々にはいつもお世話になっています。 関数の質問です。 タイトルが分かりづらくて申し訳ありませんが、詳細は下記ご参照ください。 環境は下記になります。 OS=windows7 pro 64bit Office=Excel2010(14.0.7128.5000) ・やりたいこと 別のBookのFunctionを呼び出し、戻り値を取得したい。 同一Book内であれば Module1: Sub aaa()  MsgBox bbb End Sub Module2: Function bbb() As String  If Date Mod 2 = 0 Then   bbb = "余り0"  Else   bbb = "余り1"  End If End Function というような書き方で、"余り0"か"余り1"のメッセージボックスが表示されますが、 Function bbbを別のブックに書き、同じく"余り0"か"余り1"のメッセージボックスが表示させるには、どのようなコードが適していますでしょうか? 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

  • 戻り値について

    学校の課題で分からないところがあります。 教えていただけないでしょうか? VB.Net2002です。 Private Function CheckNumber(ByVal NumTextBox As TextBox) As Boolean If IsNumeric(NumTextBox.Text) Then Return True Else MessageBox.Show("数値を正しく入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) NumTextBox.SelectAll() NumTextBox.Focus() End If End Function Private Sub ExecButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ExecButton.Click If Not CheckNumber(Num1TextBox) Then Exit Sub End If --------------質問----------------------------- ExecButton_Clickプロシージャの If Not CheckNumber(Num1TextBox, Num1) Then の処理内容が分かりません。 CheckNumberでReturn Trueが返ってくるか エラーのメッセージボックスが 表示されるのは分かりますが、 Notで否定してもFalseが返ってくる事はないのでは? ならこの処理は何なのですか? ----------------------------------------------- 長くなってしまいすみません(>_<)

  • Functionの戻り値を2次元配列にする方法

    VB.NETを使いはじめた初心者です。 Functionの戻り値を2次元配列にして データを取得したいのですが、 「Doubleの1次元配列はDoubleから派生していないためDoubleの1次元配列の1次元配列の値をDoubleの2次元配列に変換できません」とエラーがでます。 どのように変更すればよいでしょうか。 ご教授願います。 Function f1 As Double()() Dim temp(2,3) As Double ・・・・・ Return temp End Function

専門家に質問してみよう