![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
今までプログラム等の経験がなく、今初めてVBAを使っているのですが、引数を入れる()の使い方がよくわかりません。
調べれば調べるほど混乱するような感じです。
例えばプロシージャの後の()は、プログラムのサンプル例で、その()の中にあらかじめ設定された変数(文字列でした)が入っているのを見た事があるのでそのように使うのでしょうけれど、どういう場合に使うものなのでしょうか。
また、msgbox(○○)で、()内に入っているものがメッセージボックスに表示される事も、その現象だけは経験的に知っていますが、それは、
msgbox"○○"
や、
msgbox a
a=a+1
という場合と何が違うのでしょうか。
例えばmsgbox(a+1)
としてしまっては、いけないのですか?
No.3ベストアンサー
- 回答日時:
Function ステートメントで定義したプロシージャーは、一般に関数と言われて値を返すプロシジャーですが、こちらを呼び出す時には、
基本的に
名前(引数並び)
のようにカッコをつけて呼び出します。
Sub ステートメントで定義されるプロシジャーは、
基本的に
名前 引数並び
のようにカッコをつけないで呼び出します。
Call キーワードをつけた場合、
どちらの場合も
Call 名前(引数並び)
のように呼び出します。この場合、カッコは省略できません。
ちなみに、
#1のご回答で参照先URLの筆者は、勘違いされているようです。
カッコで値渡しと参照渡しが切り替わるのではなくて、
カッコで値渡しと同じ効果があるというだけです。
例えば、
Sub proc(v1, v2)
のような場合、
proc (v1, v2)
のように呼び出した場合、"値渡しと参照渡しが切り替わるのではなく"てエラーになるはずです。
Sub proc(v1)
のような1引数の場合、
proc (v1)
は、引数のためのカッコというより、演算をするためのカッコになっています。
そのため、変数(が参照渡しされるの)ではなく、演算結果(としての一時的なもの)がproc に渡されることになり、元の値が変更されないということになります。 (指定が無い場合、あくまでも参照渡しとして処理される)
この回答への補足
ありがとうございます。
Functionプロシージャを呼び出す時には
Sub 例
call Funcのプロシージャ名(abc)
End sub
------------------------------
Function Funcのプロシージャ名
Funcのプロシージャ名=abc
End Function
という事でしょうか?
そうするとsubを呼び出す時にかっこをつけないというのがよくわからなくなって来るので、どうも私の解釈が間違っているのかなあ。
もう少し勉強しないと教えていただいてもわからないのかも知れん、申し訳ないです。
No.7
- 回答日時:
#3補足>
の場合、返値がありますから
>call Funcのプロシージャ名(abc)
でなくて
retValue = Funcのプロシージャ名(abc)
のような形になりますね。
(補足の場合は、引数が定義されていないので違うけど)
つまり、概略の方針をまとめると
値を返すプロシジャーは、Function で定義し、
その場合は、名前にカッコをつけて用いる
そうでない場合は、カッコはつけない。
カッコをつけたい場合はCall をつける。
この回答への補足
何度もごていねいな回答をありがとうございます。
私がもともとよく理解していないゆえ、質問が不適当な部分も多々あるかと思います、お許しくださいませ。
まとめまでしてくださりありがとうございました。
No.6
- 回答日時:
#4です。
> これは、この場合だと、msgboxの命令が与えられた段階では
> aの値が定まっていないため0になってしまうという解釈で良いのでしょうか。
それはわかりません。
MsgBoxが実行される以前に、aにはどのような値が入っているか、この二行だけでは回答者には判断がつかないからです。
少なくとも、a+1はaに1が加算された値でしょう。
もちろんMsgBoxが実行されたときにaに何もセットされていなければ、
ご指摘のようにa+1は1ですね。
それと変数は、事前に型とともに宣言しておくべきです。
そして変数名は型に関連したプリフィックス(接頭文字)をつけるべきです。
ちなみに私は、整数型ならint、長整数ならlng、文字型ならstr、論理型ならbln、バリアント型ならvarを変数名の頭につけるようにしています。
この回答への補足
ありがとうございます。
そうですね。前もってaに値がセットされているべきなのですね。
セットされていないと、0になります。て事はバリアント型では0になるのか・・・。何だかやってみないとわからない事が多く、いつも時間がかかってしまいます。
変数名にも法則性があるのですね。
何をつけても良いと思っておりましたが、それでは見づらくなりますね。
No.5
- 回答日時:
引数かっこの使い方というより、使用目的ごとの文法と理解した方が良いと思うのですが。
(意味は同じかな。)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(文字列)型だと空の文字列となります。
この回答への補足
ありがとうございます。
わかりやすい説明でした。
少しステップアップできたと思うので、これを基にまた参考書などを読み直してみます。
No.4
- 回答日時:
「表記の違い」を訊いておられるのだとは思いますが、
> 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になってしまうという解釈で良いのでしょうか。
どうもプログラムの基本的なことがわかっていない私です。
No.2
- 回答日時:
MsgBoxに関して言うと、メッセージを表示するだけなら「()」は使わずに、
MsgBox "メッセージ"
でいいでしょう。この場合、画面には「OK」ボタンしか表示されません。
メッセージ画面に「はい」、「いいえ」ボタンを表示してどちらが押されたかによってその後の処理を分けたい場合は、
lngRet = MsgBox("メッセージ",vbYesNo)
となります。(VisualBasicでの例です。)
lngRetには「はい」か「いいえ」が区別できる値が入ります。vbYesNoは「はい」と「いいえ」ボタンを表示するという定数です。
質問のMsgBox(a+1)はエラーとなるはずです。
MsgBox a+1なら大丈夫です。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_16.png?e8efa67)
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで “:” を含むセルの特定 2 2023/05/11 16:30
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Java Java モンスターブリーダー 1 2023/02/05 09:44
- Excel(エクセル) Excel VBAで、行の高さを、上下1文字分程度高くしたい 3 2023/04/23 00:17
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Excel(エクセル) excel vba 参照渡しと値渡し 2 2022/04/27 10:45
- Excel(エクセル) エクセルVBA Msgboxでの変数の活用 4 2023/07/23 08:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パソコンへの「Dropbox...
-
Excel VBA コンボボックスについて
-
サービスアプリからメッセージ...
-
Access メッセージボックスで文...
-
worksheetFunctionクラスのVloo...
-
VBA(エクセル)で自動的にボタン...
-
VBA シートのボタン名を変更し...
-
実行時エラー 438になった時の...
-
「Columns("A:C")」の列文字を...
-
なぜこんな初歩的なVBAのIf文で...
-
コンボボックスの文字によるif...
-
vbaのエラー対応(実行時エラー...
-
ユーザーフォームを表示中にシ...
-
エクセル・VBA CheckBoxのオブ...
-
VBAのボタンの位置が変わって困...
-
ユーザーフォームのテキストボ...
-
エクセルエラー13型が一致しま...
-
モーダルフォームとモードレス...
-
ウォッチ式の文字数制限について
-
ExcelVBAのユーザーフォームの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パソコンへの「Dropbox...
-
エクセルでマクロを実行中に「...
-
VBA listBoxから
-
Excel VBA コンボボックスについて
-
今日スマホでネットをしていた...
-
メッセージボックスの再表示の方法
-
リストボックスの全行表示
-
AccessのMsgBox表示位置について
-
QT グループボックスについて
-
ダイアログボックス?メッセー...
-
Excel VBAでMsgboxの値を取得す...
-
Access メッセージボックスで文...
-
Excelで、リストボックスでカテ...
-
エクセルでコンボボックス内に2...
-
処理中メッセージを出しておき...
-
GHzとMHzとは
-
windows10 上にぴょこぴょこ出...
-
メディアプレーヤー11の使用...
-
VB.net コンボボックス
-
VAB:メッセージボックスの色に...
おすすめ情報