ここから本文です

subプロシージャとfunctionプロシージャの違いがわかりませんっ!

grand_apollo_projectさん

2010/12/1022:46:40

subプロシージャとfunctionプロシージャの違いがわかりませんっ!

VB超初心者です。
subプロシージャとfunctionプロシージャの違いがわかりませんっ!

というか、
functionプロシージャはなんとなく納得がいくんです。
値を返すんですよね?
イメージ的には関数のような感じ?

ただ、
subプロシージャがよくわかりません。
値を返さないという意味がわかりません。
動きをみてると返してるようにみえるし・・・。

質問の意味がわかりずらくて申し訳ないんですが、
ご教授ください。

閲覧数:
64,941
回答数:
6
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

hagechabinnnさん

編集あり2010/12/1404:56:06

>subプロシージャがよくわかりません
この質問に関しての説明は、他の回答者さんのおっしゃる通りだと思います。
私は、プログラムを例に挙げ説明してみます。


乗算した結果をメッセージボックスに表示するだけの簡単なプログラムです。
実行するには、標準モジュールにコードを貼り付け(FunctionとSubどちらか一方のみ)、プロジェクトの設定をコンソールアプリケーションにして、スタートアップフォームをSubMainに指定して下さい。

>説明
MULUプロシージャを、Function、Subをそれぞれ作成しました。Functionの方のMULUプロシージャは、プロシージャ内で乗算だけをして、その結果を戻り値で返しているだけです。MULUプロシージャから出た後(戻った後)で、乗算結果を表示しています。
Subの方のMULUプロシージャは、プロシージャ内で乗算をしてその結果も表示しています。プロシージャから出た後は何もしていません

簡単なプログラムですので、みて頂いて違いを理解して頂ければよろしいかと思います。

'Functionで記述
Private Sub Main()
Dim a,b,c As Integer
a = 2:b =3
c = MULU(A , B)
MsgBox(c)
End Sub

Private Function MULU(ByVal x As Integer, ByVal y As Integer) As Integer
MULU = x * y
End Function



'Subで記述
Private Sub Main()
Dim a,b As Integer
a = 2:b =3
MULU(a,b)
End Sub

Private Sub MULU(ByVal x As Integer, ByVal y As Integer) As Integer
MsgBox(x*y)
End Sub

質問した人からのコメント

2010/12/14 22:42:28

降参 具体例があって分かりやすかったです!他に回答してくださった方々も分かりやすく説明して頂きありがとうございました。
subプロシージャで定義した仮引数にByRefを指定していたので混乱していたようです。

ベストアンサー以外の回答

1〜5件/5件中

並び替え:回答日時の
新しい順
|古い順

2010/12/1316:26:26

具体的な内容は皆さんお答えになっている通りです。
違った視点から物事をとらえてみましょう。
一つのプロシージャの中に全部のコーディングを入れようとするとものすご~く長くなって見づらいです。
この長ーいコードの一部をSUBやFUNCTIONなど別のルーチン内処理で処理してあげましょう。
ほーら、元の処理が簡素化されて見やすくなりましたね。
その別ルーチンに移す際に、戻り値が必要だったりする場合はFUNCTION、特に必要ない場合はSUB。

のような理解ではだめでしょうかね?

biwyfiさん

2010/12/1202:25:43

‘function’は、直訳の「関数」そのもの。
「functionプロシージャ」は、用語としては変。
‘sub’は‘subroutine’の略で、片仮名だと「サブルーチン」になる。戻り値を持たない(返せない)。
戻り値が無いだけで、渡された物を変更する事は、サブルーチンでも可能。

本来は、関数は必ず戻り値を使う必要が有り、式の中でしか使えない物だった。
逆にサブルーチンは戻り値を持たない代わりに式以外でも使えた。また、大昔は、ユーザ定義の関数機能すら無かったので、唯一の処理共通化手段だった。
が、自動的に関数の戻り値を捨てる機能が入って、今は、戻り値の有無以外に違いは無い。

まあ、歴史的由来の違いが反映されているだけで、深く考える必要は無いかと。

ついでに混乱させて置くと、機械語レベルだと、サブルーチンしかない。
が、CPUには「レジスタ」と云う変数が常時存在するので、特に一番使うレジスタを「戻り値」とするのが機械語レベルでの関数。
レジスタが常時在るので、サブルーチンも関数も動作は変らない。
使う側が、戻って来た時のレジスタを使うか否かで関数かサブルーチンかに変化する。

古い言語だと、関数とサブルーチンの機能を使い分ける様な仕様だったが、C言語では、面倒なので全部関数に単純化された。
昔のC言語仕様では、return文で明示的に、戻り値のレジスタを設定しない場合、途中で偶然戻り値のレジスタに入った値が返ると云う超手抜き仕様で、使わない/使えない時は戻り地を捨てる方式になった。
この「戻り値を捨てる」仕様が、C言語のAPIも流用出来る様にする為に、VBのfunctionに引き継がれている。
一方、subプロシージャは、歴史的に伝統のある使い方なので、互換性の為に未だに残ってる。
結果、初心者が混乱する事になった。

k15745さん

2010/12/1100:32:13

subもfunctionも、その内部の処理が終了すると、元の呼ばれた箇所に戻る点は同じです。

その際、functionの場合は、数値や文字列やオブジェクトなど、指定された型に応じた値を返すことができます。
イメージ的には関数のような感じというか、まさに関数です。
(functionは「機能」や「関数」という意味です 数学の世界の関数で使う「f」記号はその頭文字です)

それに対してsubは、呼ばれた箇所に戻る点ではfunctionと同じでも、何も値を返せません。
(もし返そうとするとコンパイルが通りません)
値を返す必要があるかどうかで、subとfunctionを使い分けます。

プロフィール画像

カテゴリマスター

2010/12/1023:00:39

”functionプロシージャは関数のような感じ?”
感じでは無く関数その物です。

値を返すと言う事は
MsgBox (自作Function(123,456))
とすれば
自作Function(123,456)
の結果が表示されますが、

MsgBox (自作Sub(123,456))
ではおそらくコンパイルエラーで実行出来ないでしょう。
(やった事が無いので多分です。)

rohikiannさん

2010/12/1022:56:04

function と sub の違いは、値を返すか返さないかの違いと思って
間違いないです。
functionは、関数のような感じではなくて、関数です。
subは、コマンドですね。
返ってきた値を使わないのなら、どっちを使っても同じです。
値を返してほしいときは、Funcionを使います。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。