- ベストアンサー
VBAでの引数かっこの使い方がよくわからない
今までプログラム等の経験がなく、今初めてVBAを使っているのですが、引数を入れる()の使い方がよくわかりません。 調べれば調べるほど混乱するような感じです。 例えばプロシージャの後の()は、プログラムのサンプル例で、その()の中にあらかじめ設定された変数(文字列でした)が入っているのを見た事があるのでそのように使うのでしょうけれど、どういう場合に使うものなのでしょうか。 また、msgbox(○○)で、()内に入っているものがメッセージボックスに表示される事も、その現象だけは経験的に知っていますが、それは、 msgbox"○○" や、 msgbox a a=a+1 という場合と何が違うのでしょうか。 例えばmsgbox(a+1) としてしまっては、いけないのですか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
Function ステートメントで定義したプロシージャーは、一般に関数と言われて値を返すプロシジャーですが、こちらを呼び出す時には、 基本的に 名前(引数並び) のようにカッコをつけて呼び出します。 Sub ステートメントで定義されるプロシジャーは、 基本的に 名前 引数並び のようにカッコをつけないで呼び出します。 Call キーワードをつけた場合、 どちらの場合も Call 名前(引数並び) のように呼び出します。この場合、カッコは省略できません。 ちなみに、 #1のご回答で参照先URLの筆者は、勘違いされているようです。 カッコで値渡しと参照渡しが切り替わるのではなくて、 カッコで値渡しと同じ効果があるというだけです。 例えば、 Sub proc(v1, v2) のような場合、 proc (v1, v2) のように呼び出した場合、"値渡しと参照渡しが切り替わるのではなく"てエラーになるはずです。 Sub proc(v1) のような1引数の場合、 proc (v1) は、引数のためのカッコというより、演算をするためのカッコになっています。 そのため、変数(が参照渡しされるの)ではなく、演算結果(としての一時的なもの)がproc に渡されることになり、元の値が変更されないということになります。 (指定が無い場合、あくまでも参照渡しとして処理される)
その他の回答 (6)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#3補足> の場合、返値がありますから >call Funcのプロシージャ名(abc) でなくて retValue = Funcのプロシージャ名(abc) のような形になりますね。 (補足の場合は、引数が定義されていないので違うけど) つまり、概略の方針をまとめると 値を返すプロシジャーは、Function で定義し、 その場合は、名前にカッコをつけて用いる そうでない場合は、カッコはつけない。 カッコをつけたい場合はCall をつける。
補足
何度もごていねいな回答をありがとうございます。 私がもともとよく理解していないゆえ、質問が不適当な部分も多々あるかと思います、お許しくださいませ。 まとめまでしてくださりありがとうございました。
#4です。 > これは、この場合だと、msgboxの命令が与えられた段階では > aの値が定まっていないため0になってしまうという解釈で良いのでしょうか。 それはわかりません。 MsgBoxが実行される以前に、aにはどのような値が入っているか、この二行だけでは回答者には判断がつかないからです。 少なくとも、a+1はaに1が加算された値でしょう。 もちろんMsgBoxが実行されたときにaに何もセットされていなければ、 ご指摘のようにa+1は1ですね。 それと変数は、事前に型とともに宣言しておくべきです。 そして変数名は型に関連したプリフィックス(接頭文字)をつけるべきです。 ちなみに私は、整数型ならint、長整数ならlng、文字型ならstr、論理型ならbln、バリアント型ならvarを変数名の頭につけるようにしています。
補足
ありがとうございます。 そうですね。前もってaに値がセットされているべきなのですね。 セットされていないと、0になります。て事はバリアント型では0になるのか・・・。何だかやってみないとわからない事が多く、いつも時間がかかってしまいます。 変数名にも法則性があるのですね。 何をつけても良いと思っておりましたが、それでは見づらくなりますね。
- kabilunlun
- ベストアンサー率34% (155/446)
引数かっこの使い方というより、使用目的ごとの文法と理解した方が良いと思うのですが。(意味は同じかな。) 1.MsgBox a aという変数(値)を渡してMsgBox関数を呼び出す。 2.Call MsgBox(a) Callを使用して、aという変数(値)を渡してMsgBox関数を呼び出す。 3.lngRet = MsgBox(a,vbYesNo) aという変数(値)とvbYesNoという定数(値)を渡してMsgBox関数を呼び出して、lngRetという戻り値(値)を受け取る。 >これは、この場合だと、msgboxの命令が与えられた段階では >aの値が定まっていないため0になってしまうという解釈で良いのでしょうか。 >どうもプログラムの基本的なことがわかっていない私です。 aのデータ型が何かによって変わってきます。 たとえば、 Integer(整数)型なら「0」ですが、String(文字列)型だと空の文字列となります。
補足
ありがとうございます。 わかりやすい説明でした。 少しステップアップできたと思うので、これを基にまた参考書などを読み直してみます。
「表記の違い」を訊いておられるのだとは思いますが、 > msgbox a > a=a+1 > という場合と何が違うのでしょうか。 > 例えばmsgbox(a+1) > としてしまっては、いけないのですか? と書いてしまうと、#2さんの回答にあるように「MsgBox a+1」と書き直したとしても、 MsgBox a a = a + 1 と MsgBox a + 1 とでは表示される内容が異なってしまいます。 a = a + 1 MsgBox a なら表示される内容は同じになります。 揚げ足をとるつもりはないのですが、回答者にとっては質問文の内容が全てです。 質問文の書き方ひとつで、回答の方向がそれてしまうこともあります。
補足
ご指摘ありがとうございます。 ほんとですね。 MsgBox a a = a + 1 では、表示されるのは0ですね・・・。 恥ついでにおたずねしたいのですが、 これは、この場合だと、msgboxの命令が与えられた段階では aの値が定まっていないため0になってしまうという解釈で良いのでしょうか。 どうもプログラムの基本的なことがわかっていない私です。
- kabilunlun
- ベストアンサー率34% (155/446)
MsgBoxに関して言うと、メッセージを表示するだけなら「()」は使わずに、 MsgBox "メッセージ" でいいでしょう。この場合、画面には「OK」ボタンしか表示されません。 メッセージ画面に「はい」、「いいえ」ボタンを表示してどちらが押されたかによってその後の処理を分けたい場合は、 lngRet = MsgBox("メッセージ",vbYesNo) となります。(VisualBasicでの例です。) lngRetには「はい」か「いいえ」が区別できる値が入ります。vbYesNoは「はい」と「いいえ」ボタンを表示するという定数です。 質問のMsgBox(a+1)はエラーとなるはずです。 MsgBox a+1なら大丈夫です。
補足
ありがとうございます。 おっしゃることはよく理解できました。 引数かっこの使い方の理解に今いち私はまだ届いてないですが・・・。
参照渡しと値渡しの違いのようです。この二つの用語の解説は他の人に任せます。 http://oooug.jp/compati/basic/pukiwiki.php?%B0%FA%BF%F4%A4%C4%A4%AD%A4%C7%A5%B5%A5%D6%A5%EB%A1%BC%A5%C6%A5%A3%A5%F3%A4%F2%B8%C6%A4%D3%BD%D0%A4%B9
補足
ありがとうございました。 まだまだ勉強です。
補足
ありがとうございます。 Functionプロシージャを呼び出す時には Sub 例 call Funcのプロシージャ名(abc) End sub ------------------------------ Function Funcのプロシージャ名 Funcのプロシージャ名=abc End Function という事でしょうか? そうするとsubを呼び出す時にかっこをつけないというのがよくわからなくなって来るので、どうも私の解釈が間違っているのかなあ。 もう少し勉強しないと教えていただいてもわからないのかも知れん、申し訳ないです。