• ベストアンサー

VBAでの戻り値と引数について

最近VBAでプログラムを勉強しています。 引数と戻り値について教えてください。 定義としては、 引数:プロシージャに渡される定数、変数、および式。 戻り値:呼び出し元に処理の結果を戻す値。 となっているのですがいまいちピンときません。 SubプロシージャとFunctionプロシージャでその違いがあると思うのですが、具体的にどれが引数でどれが戻り値なのかわかりません。 他のプログラミングも全く経験がない初心者で初歩的な質問ですみませんがご教授お願いします。

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

  • ベストアンサー
  • denbee
  • ベストアンサー率28% (192/671)
回答No.1

たとえとして、人に買い物を頼むことを考えると、 何を買ってきて欲しいかを書いたメモやお金を人に渡し、 その人は買い物をしてきて買ったものやお釣を受け取ります。 この場合、「メモ」や「お金」など「やってもらう仕事に関する情報」が引数で、 「買ったもの」や「お釣」などの「やってもらった仕事の結果」が戻り値にあたります。 買い物には公共料金の振込みのように、買い物の結果がないものもあります。 (ここでは領収書などは無視) このような結果がないものがSubプロシージャで、結果を返すものがFunctionです。

その他の回答 (5)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.6

#3 です。 いま見直したら、関数C が抜けてましたね。 追加してお試しください。 (引数が無い関数) Function 関数C() 関数C = 999 End Function

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

>実際に使いながらやってみるのですがうまくいきません。 どのようにやってみて、どのようにうまくいかないのでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

Subは、戻り値を返しません Sub プロシージャ名(引数1,…) Function プロシージャ名(引数1,…) as 型 引数は、どちらもプロシージャ名の後のカッコの中のリストでこのプロシージャに渡される引数になります。 省略もできます。 Functionの場合、戻り値を型で指定することができます。戻り値を型で指定しない場合の型はバリアントです。 戻り値は、 プロシージャ名に代入することで設定します。 例: function add(a as integer, b as integer) as integer add=a+b end function x=add(1,3) xに4が入る

komusemari
質問者

お礼

回答ありがとうございます。Subは戻り値を返さないこと、Functionは戻り値を返し、また型を指定できることはわかりました。実際に使いながらやってみるのですがうまくいきません。ちょっとまだ僕の認識がズレているのでしょう。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

実行して見ましょう! Sub は、処理を実行するために使います。 Function (関数)は、実行後の戻り値を受け取りたい時に使います。 ですが、「関数A」の場合は戻り値を返していない(セットされていない)ので、機能しては「処理B」と同じになってしまいます。 戻り値を必要としない場合は、Subで作成する方が良いと思います。 Sub 処理見本() Dim 引数1 As Integer, 引数2 As Integer Dim 答え As Integer 引数1 = 5 引数2 = 4 Call 処理A Call 処理B(引数1, 引数2) Call 関数A(引数1, 引数2) Call 関数B(引数1, 引数2) Call 関数C 答え = 関数A(引数1, 引数2) MsgBox "関数A 戻り値 : " & 答え 答え = 関数B(引数1, 引数2) MsgBox "関数B 戻り値 : " & 答え 答え = 関数C() MsgBox "関数A 戻り値 : " & 答え End Sub Sub 処理A() MsgBox "処理A" End Sub Sub 処理B(引数1, 引数2) Dim 答え As Integer 答え = 引数1 * 引数2 MsgBox "処理B : " & 答え End Sub Function 関数A(引数1, 引数2) Dim 答え As Integer 答え = 引数1 + 引数2 'MsgBox "関数A : " & 答え End Function Function 関数B(引数1, 引数2) 関数B = 引数1 - 引数2 'MsgBox "関数B : " & 関数B End Function

komusemari
質問者

お礼

回答ありがとうございます。実際のプログラムまで作成していただき、使い方や、結果が見えました。引数と戻り値はこのプロシージャ以外にも多用しますので、ここの違いを整理するのに大変助かりました。ありがとうございました。

  • ykym
  • ベストアンサー率22% (8/35)
回答No.2

簡単に説明するとSubプロシージャとFunctionプロシージャの違いは"式"の中で使えるかということです。 Function Test1(lngA As Long) As Long という定義をした場合最後の"As Long"がTest1の処理結果にLong型の値を返す指定になります。 Functionプロシージャは呼び出された結果としての値を持たせることが出来るので計算式の中や評価式の中で使用できます。 上記のTest1というFunctionプロシージャの場合 l = Test1(5) や If Test1(5) > 10 Then … などの使い方が出来ますがSubプロシージャの場合は上記のような記述をするとエラーになります。 それ以外の違いはありませんので引数に対してByRefを適宜指定することによって引数から処理結果を取り出すようにすることも出来ます。(ByValを指定しなければ規定値はByRefなのであえて記述の必要はないですが...)

関連するQ&A

専門家に質問してみよう