
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
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
としましょう
No.4
- 回答日時:
この関数の呼び出しが多用されるのであれば、その処理用の構造体なりクラスなりを用意して、関数の戻りはその型で返すようにするというのが
一番エレガントな答えじゃないかと思います。(手間との兼ね合いがありますが)
ちなみに上のような呼び出しが可能であっても(VB.netで関数の戻りの型を明示すれば可能のはず)上の使い方だと、関数が3回呼び出されることになります。
関数の呼び出しは最小限にして、戻りを変数に格納して使う習慣はつけといていいかと思います。
No1の返信について
>呼び出し側では戻り値に使用する3つの引数には何もセットしない・・ということになるのでしょうか?
何もセットしないというよりは、初期化した変数をセットするというのが無難かと思います。
# FunctionならOutput引数は使わないというのは当然として、個人的には「答えを返す」のであれば極力関数の戻りとしてとるべきだと思っています。(そのほうがよんでいてわかりやすいし)
No.2
- 回答日時:
関数というのは元来アウトプットされるデータが一つのものを指します。
コール・バイ・ネームで引き数を定義すればデータを持ち出すことができますが、これは飽くまで非常手段であり、複数のアウトプットデータがある場合は Procedure として定義するべきです。そしてインプットデータはコール・バイ・バリュー、アウトプットデータはコール・バイ・ネームで宣言すると後のデバッグで紛れがなくなります。自分でコーディングするからいいじゃないか、それは勝手だというのは全く違います。自分で組んだルーチンは殆ど頭に残っておらず、それぞれがどういう計算をしているのかが分からなくなってしまい勝ちなのでできるだけ紛れのない構造にしておくことが大切なのです。引数は何を意味するのかを、註釈で説明しておくことも大切ですよ。
これは大きなシステムを大人数で共同開発するときには必要不可欠なことなのですが、一人で組むプログラムも全く同じですよ。
初心者かつ独学ではじめている為
まだまだ勉強不足です。
一字一句の理解から時間がかかってしまうので
Willytにアドバイスしていただいた語句は
ひとつづつ調べてみて理解していこうと思います。
取り急ぎお礼させていただきます。
ありがとうございました。
No.1
- 回答日時:
同じような質問がありました。
http://oshiete1.goo.ne.jp/qa3511531.html
No.3及びNo.4の回答がそのままではないかと思います。
#個人的には参照型引数使いたいケースですが
早速試したらできました。
とても助かりました!
ありがとうございました。
ちなみに参照型引数について、調べてみました。
引数にも値をセットできるという事でしょうか?
今回の場合でいうと、
もともと必要な2つの引数+値を戻したい3つの引数=5つの引数を指定しておいて
呼び出し側では戻り値に使用する3つの引数には何もセットしない・・ということになるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
このQ&Aを見た人はこんなQ&Aも見ています
-
VBのReturnの使い方
Visual Basic(VBA)
-
Functionの戻り値を配列にしたいのですが
Visual Basic(VBA)
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
-
4
CloseとDisposeの違い
Visual Basic(VBA)
-
5
VB.NET getとsetの概念がわかりません。
Visual Basic(VBA)
-
6
変数の参照でエラーが出てしまいます。(VB.NET)
Visual Basic(VBA)
-
7
Functionの戻り値を2次元配列にする方法
Visual Basic(VBA)
-
8
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
9
VBでファイルが開かれているかどうかを確認したい
Visual Basic(VBA)
-
10
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
11
vb.netで画面のコントロールId名を変数で動的に制御し処理する方法
Visual Basic(VBA)
-
12
VB.NETでフォーム上にExcelのような表を表示する方法
Visual Basic(VBA)
-
13
【VB】タブ切り替え時のイベント
Visual Basic(VBA)
-
14
VBからEXCELのセルの値を取得する方法
Visual Basic(VBA)
-
15
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
16
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
17
VBでグローバル変数を宣言するには
Visual Basic(VBA)
-
18
Integer変数をカラにしたいのですが
Visual Basic(VBA)
-
19
PageLoadの後にJavascript実行したい
Microsoft ASP
-
20
遅延バインディングを使用できません!の回避方法?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どう増強すべきか
-
【C#/Java?】try-catchでcatch...
-
Excel VBA セルの名前があるか...
-
IF文に時間(何時から何時ま...
-
private subモジュールを他のモ...
-
複数個のTextBoxでいずれかの内...
-
Excel2002VBA「~のときは○○、...
-
ProgressBarを用いる場合、全体...
-
【bat&vbs】batからvbsに処理...
-
Vba 互換モードでのAppActiveに...
-
ユーザーフォームを表示中にシ...
-
VBA(エクセル)で自動的にボタン...
-
worksheetFunctionクラスのVloo...
-
VBAがブレークモードになっ...
-
ユーザーフォームに別シートか...
-
VBA シートのボタン名を変更し...
-
VBAで多数のプログラムを一つの...
-
ExcelVBAのユーザーフォームの...
-
「Columns("A:C")」の列文字を...
-
実行時エラー 438になった時の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
vbaのエラー対応(実行時エラー...
-
private subモジュールを他のモ...
-
マクロで、次のコードへ行く前...
-
シグナル 6(SIGABRT)とは?
-
特定の名前のオートシェイプの...
-
IF文に時間(何時から何時ま...
-
どう増強すべきか
-
特定のファイルを他のプロセス...
-
Word VBA。各マクロの間に待ち...
-
どうやってもFor文を抜けてしま...
-
Excel VBA セルの名前があるか...
-
ExcelのVBAで、選択したファイ...
-
【C#】Page_Loadさせない方法に...
-
StatusStripの表示が更新されな...
-
途中で処理を中断させたい (ア...
-
エクセル VBAで複数セル選択時...
-
Functionで戻り値を複数返す方法
-
VBAでBook読み込み時の非表示方...
-
VBA 複数の行を高速で削除する...
おすすめ情報