電子書籍の厳選無料作品が豊富!

Sub msgbox1()
MsgBox "学生ですか?。", vbYesNo, "確認"
End Sub

関数って通常()の中に引数を書くのにコレにはないけど何故?

A 回答 (4件)

VB(.NETは別)では、関数の戻り値を変数に入れない場合は、以下のようにかけます。

(下のように戻り値を変数に入れるときはかっこが必要です)
---------------------------------------------------
MsgBox "カッコなし"
Dim intRet as integer
intRet = MsgBox("カッコあり")
--------------------------------------------------
次のような書き方はできません。
--------------------------------------------------
intRet = MsgBox "カッコなし"
--------------------------------------------------
    • good
    • 0
この回答へのお礼

この例のような戻り値を変数に格納する必要がない関数の場合、VBにおいてはそもそも括弧を省略して書ける作りになってるんですね。
ウ~ン、作った人は自分で使う場合は便利だろうけどムズカシ~イ。
分らなかったので1ヶ月間程本屋やネットの講座等で調べたけど、理由が書いてあるものは皆無。
NETは別だけどVBではそういう作りになっているんだという仕組みを知っていることに大変な驚き!
kafun-show君は感激で鼻がムズムズしてきました。
ありがとうございました。

お礼日時:2007/05/20 13:46

引数を個々に括弧で囲うと強制的に値渡しになる、というのも知っておいたほうが良いよ。



Sub Foo(ByRef i As Integer)
i = i + 1
End Sub

Dim a As Integer
a = 0
Foo (a) ' aは変更されない
Call Foo((a)) ' aは変更されない

前者は値渡しになっているのに気付かないパターン。
    • good
    • 0
この回答へのお礼

せっかく時間をさいて回答いただきましたが、強制的な値渡しという言葉はkafun-showにはまだ難しくて理解できませんでした。勉強不足ですいません。徐々に実力を上げて理解できるようになろうと思います。
今度はもっと難しい質問ができるよう頑張ります。
ありがとうございました。

お礼日時:2007/05/20 17:33

返り値を必要としない場合、括弧が不要と言うのは2の方のおっしゃる通り。


と言うより、括弧をつけるとエラーになります。(引数が1つの場合、計算の優先順変更の括弧と解釈されて、エラーにはなりませんが)。
個人的には、『関数呼び出しで返り値が不要の場合、Callをつけて呼び出しましょう』を、記述ルールにしています。
質問に書かれていたMsgBoxの例では、

Call MsgBox("学生ですか?。", vbYesNo, "確認")

となります。
この場合、必ず括弧をつける必要があります。
(引数のない関数を呼び出した場合は別です)

この記述のルールには
○括弧をつける、つけないに悩む必要が無くなる。
○返り値不要の関数の呼び出しと明示化される。
○仮にメッセージボックスを、OkOnly(通常は返り値不要)からYesNo(通常は返り値必要)に変更した場合に、書き換え箇所が少なくて済む。
と言った利点があります。
    • good
    • 0
この回答へのお礼

初めての参加だったので、回答があっても操作手順がわからず御礼が遅くなり失礼しました。
kafun-showも見習って以後Callをつけて書くことにします。
ありがとう。又よろしく。

お礼日時:2007/05/20 17:22

単に括弧を打つのが面倒だったからでは。



「括弧を付けなくて文法違反じゃないの?」という質問なら、「言語仕様が許してるならOK」という事です。VisualBasic、Rubyなんかはそうですね。
「括弧を付けない言語仕様にしたのは何故?」という質問だとしたら、設計者に尋ねてみないと答えが分からないかも。
    • good
    • 0
この回答へのお礼

初めての参加だったので、回答があっても操作手順がわからず御礼が遅くなり失礼しました。
ありがとう。又よろしくお願いします。

お礼日時:2007/05/20 17:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!