- ベストアンサー
VBAでの戻り値と引数について
最近VBAでプログラムを勉強しています。 引数と戻り値について教えてください。 定義としては、 引数:プロシージャに渡される定数、変数、および式。 戻り値:呼び出し元に処理の結果を戻す値。 となっているのですがいまいちピンときません。 SubプロシージャとFunctionプロシージャでその違いがあると思うのですが、具体的にどれが引数でどれが戻り値なのかわかりません。 他のプログラミングも全く経験がない初心者で初歩的な質問ですみませんがご教授お願いします。
- komusemari
- お礼率41% (16/39)
- Windows系OS
- 回答数6
- ありがとう数8
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
たとえとして、人に買い物を頼むことを考えると、 何を買ってきて欲しいかを書いたメモやお金を人に渡し、 その人は買い物をしてきて買ったものやお釣を受け取ります。 この場合、「メモ」や「お金」など「やってもらう仕事に関する情報」が引数で、 「買ったもの」や「お釣」などの「やってもらった仕事の結果」が戻り値にあたります。 買い物には公共料金の振込みのように、買い物の結果がないものもあります。 (ここでは領収書などは無視) このような結果がないものがSubプロシージャで、結果を返すものがFunctionです。
その他の回答 (5)
- hana-hana3
- ベストアンサー率31% (4940/15541)
#3 です。 いま見直したら、関数C が抜けてましたね。 追加してお試しください。 (引数が無い関数) Function 関数C() 関数C = 999 End Function
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>実際に使いながらやってみるのですがうまくいきません。 どのようにやってみて、どのようにうまくいかないのでしょうか?
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
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が入る
- hana-hana3
- ベストアンサー率31% (4940/15541)
実行して見ましょう! 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
お礼
回答ありがとうございます。実際のプログラムまで作成していただき、使い方や、結果が見えました。引数と戻り値はこのプロシージャ以外にも多用しますので、ここの違いを整理するのに大変助かりました。ありがとうございました。
- ykym
- ベストアンサー率22% (8/35)
簡単に説明すると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
- エクセルVBA イベントプロシージャに引数を渡せま
お世話になります。 エクセル2003/XP 使用です。 イベントプロシージャに引数を渡せまるかどうか教えていただけますでしょうか? 下記のコード中の変数mysheetnameを ユーザーフォーム、→ CommandButton1のプロシージャに 引数として渡して行きたいのですが、 実行すると、一番最初のWorkbook_SheetBeforeRightClickの時点で、 コンパイルエラー: プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。 とエラー表示されます。 イベントプロシージャに引数を渡すことはできますでしょうか? ---------- ThisWorkBook内 ---------- Public mysheetname As String Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) mysheetname = ActiveSheet.Name UserForm1.Show (mysheetname) '←変数mysheetnameの値をユーザーフォームに渡したい。 End Sub ---------- ユーザーフォーム ---------- Private Sub UserForm_Initialize(ByVal mysheetname As String ) 処理 End Sub Private Sub CommandButton1_Click(ByVal mysheetname As String ) 処理 End Sub ’--------- ここまで 引数について少し理解し始めたばかりの者です。 よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- VBA 引数の簡単な命名規則ありますか?
Excel VBAで 簡単なプロシージャを作る時に引数名で詰まります。 関数化するなら引数は別に名前を付けたい。でも単純すぎてわざわざ別名が 思いつかない…できれば呼びだし元の変数名をそのまま使いたい hoge(text,loop) sub hoge( _text, _loop ) とかできればいいんですが先頭_(アンダーバー)ってダメなんですよね 最後_(アンダーバー)は行継続と紛らわしいし… いまんとこ、 定数UPPER 関数UpperCamelCase 変数loweCamelCase と簡単な程度なんですがなにか短くて気楽な引数の命名規則は無いもんでしょうか?
- ベストアンサー
- Visual Basic
- VB初心者の私に教えてください!
最近VBを始めたんですけど、関数 定数 変数 引数 の意味がよく理解できません・・・。値を返すとか戻り値とか、あとプロシージャを作るってどういうことですか?なにかにたとえて教えてくれればうれしいです! お願いします(^。^)
- ベストアンサー
- Visual Basic
- 戻り値 引数 と API プログラミング初心者
先日 戻り値 引数の関係を学びました。 呼び出しもとが関数を呼び出すときに上げる情報を引数、関数の処理から受け取る情報を戻り値であると学びました。 これを学んだ際に、APIも情報を受けわたす窓口であるという点と異なるもの同士(プロシージャとソフトウェア)で連携するという点で似ているなと感じました。 この考え方や認識に誤りはないでしょうか?よろしくお願いします
- ベストアンサー
- その他(プログラミング・開発)
- oracleのfunctionで戻り値複数個
oracleのストアドプロシージャのファンクションについてですが、 ファンクションは、戻り値を返すことができますが、 それを、複数個返すことはできるのでしょうか。 CREATE [OR REPLACE] FUNCTION ファンクション名(引数 IN データ型[, ...]) RETURN 戻り値の型 IS 宣言部 BEGIN 処理部 END ; お願いします。
- 締切済み
- Oracle
- SubとFunctionの使い分け方。(Access VBA)
Sub:実行するとそのまま処理が終わり、特に次の作業に影響しない。 Function:関数と同じように使い、そこでの戻り値をどこかに代入して利用する。 あるテキストにこの様に書いてありました。 この考え方だと、マクロをVBAに変換すると「モジュールオブジェクト」に出来るFunctionプロシージャは、Subの方が理解にしっくりくるのですど・・・ 例えば、「テーブルを開く」(マクロ)だと、ただテーブルを開いて処理を終了するだけなので、SubでVBAが出来るの方が納得するのですけど。 正直、今の認識では、本を読んでいても何となく分かったような気がするだけで、SubとFunctionの使い分けがイマイチ分かりません。 どなたか、SubとFunctionの使い分けの目安をお教えいただけないでしょうか?。 (Access VBA初心者)
- ベストアンサー
- Visual Basic
- ExcelのVBA。Staticな変数について
あるプロシージャやfunctionで定義したstaticな変数は、その定義したsubやfunctionで有効です。今回、例えば、static a as integer とSub AAA 内で、定義し、その AAA が呼び出す BBB という ユーザーフォームの中でも staticな変数である a に値を代入したり、変更したりし、その後 sub AAAにまた入ったとき、BBBで変更した内容を保持することができるのでしょうか。
- ベストアンサー
- Visual Basic
- 【VBA】値の引渡しについて
VBA初心者です。 VBAの勉強もかねて、今、【 標準モジュール 】と【 UserForm 】を用いて あるプログラムを作っています。 その中で、プロシージャ間をまたいで 『 値の受け渡し 』をしたいと思っています。 今回、質問をさせていただいたのは、その『 値の受け渡し 』が 「できる場合」と「できない場合」があるので、常にできるように その対応方法を教えていただきたく、今回投稿させていただきました。 ---------------------------------------------------------------- 今困っているパターンを例にあげると、 ユーザフォームの中に2つのボタン 「OK」ボタンと「キャンセル」ボタンが あるとします。 【 「キャンセル」ボタンがおされた場合には「終了する」 】という 仕組みにしたいと思っています。 そこで以下のようなプログラムを作ろうとしました。 ---------------------------------------------------------------- ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 1) General部にPublic変数(以下「P変数」)を宣言する。 Public cancel as byte 2) 【標準モジュール】のプロシージャから【フォーム】の「Userform1」を表示させる。 Sub A処理() Userform1.show End sub 3) 【フォーム】のUserform1._CommandButton2に以下のように記述する。 (キャンセルボタンがクリックされた場合) Private Sub CommandButton2_Click() cancel = False Unload Me Exit Sub End Sub 4) 【標準モジュール】のプロシージャの、一連の処理の最後に 以下のようにプログラムを記述する。 Sub A処理() Userform1.show ↓ ↓ if cancel = false then exit sub end if End sub ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 1)~4)のようにして 「キャンセルがクリックされた場合、すべての処理を終了する。」 というようなプログラムを記述してみました。 すると、デバッグを使って、変数「cancel」の中身を見てみると 3)の段階で、その変数「cancel」に「false」値を格納したはずなのに、 プロシージャ間をまたいだことで 4)の段階では、変数「cancel」の中身が必ず「""」と 値が空値になってしまいます。 4)の段階でも、変数「cancel」の値が保持できる、 何かしらの方法はないでしょうか。 回答をよろしくお願いします。
- 締切済み
- Visual Basic
- excel vbaのプログラムが作成できません
プログラミングでexcel vbaを勉強しています。 excel vbaのプログラムでフィボナッチ数列のプログラムを作れという問題なんですけど、正直全くわかりません。誰かこのプログラミングを教えてください。お願いします。 フィボナッチ数列は次のように帰納的に定義される。 fib(1) = fib(2) = 1 fib(n) = fib(n - 1) + fib(n - 2) (ただしn >= 3) この関数fib(n)を定義せよ。ただし引数nはInteger型、fib関数の返す値はLong型とする。 またfib関数を呼び出す適当なメインプロシージャを定義し、A1セルからA20セルまでに fib数列の1~20番目の値を書き出すようにせよ。 という問題です。ほんとに困ってますお願いします
- ベストアンサー
- 情報工学
お礼
回答ありがとうございます。Subは戻り値を返さないこと、Functionは戻り値を返し、また型を指定できることはわかりました。実際に使いながらやってみるのですがうまくいきません。ちょっとまだ僕の認識がズレているのでしょう。