- 締切済み
Excel VBA callのあるなしの違い
Excel VBA の以下の2つのケースで callがある場合とない場合では何か違いがあるのでしょうか。 (1) 他のモジュール(Main)の中のプロシージャ(main)を呼び出す場合 Main.main Call Main.main (2) VBAのオブジェクトのメソッドを呼び出す場合 ActiveWorkbook.Close (True) Call ActiveWorkbook.Close(True)
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- _backyarD
- ベストアンサー率34% (199/580)
(1)については同じです。 (2)については、この場合は同じですが、Trueの部分が変数の場合、若干挙動が変わってくる可能性があります。前者は本来括弧が不要なのですが、それを付けることで強制的に引数が「値渡し(ByVal扱い)」になります。 ですので、Callを使わない場合は括弧を付けない方が無難です。 具体例をブログに書いておきました。リンクを記載しておきます。
- imogasi
- ベストアンサー率27% (4737/17069)
Googleで「VBA CALL のあるなし」で照会したら、 https://oshiete.goo.ne.jp/qa/8384757.html などの同じような質問をしている人が居ます。 小生も疑問を持っていますが、他の方が作ったプログラムの中だとルーチン名だけの記述(引数無しの場合など)だと、それがサブルーチン(プロシージュアー)名であることが一瞬わからず、?と思い、すぐサブルーチンらしいと気づきます。 普通は同じのようですが、結果が異なる場合があるかどうか、小生は浅学にしてわかりません。 少し話題がズレますが http://officetanaka.net/excel/vba/statement/Call.htm の >Callステートメントの有無に関わらず、関数の戻り値を利用する場合は、引数を括弧で囲まなければなりません などのご教示があります
お礼
回答ありがとうございます。 <https://oshiete.goo.ne.jp/qa/8384757.html> この回答を見ると、Callは省略可能で、 サブルーチンを呼び出していることが分かるように Callを使っている場合があるということですね。 少し話題がズレますが <http://officetanaka.net/excel/vba/statement/Call.htm> で >myFunction(123) エラー と書かれていますが、 myFunction(123)と記述すると myFunction (123)と表示されて エラーにはならないのですが エラーになりますか。 (ActiveWorkbook.Close (True)でもエラーにはならないので) もし分かっていましたら教えてください。 よろしくお願いします。
お礼
ActiveWorkbook.Close (True)の ()は Call ActiveWorkbook.Close(True)の()とは異なり 強制的に引数を値渡しにする括弧ということですね。 よく見るとメソッドと括弧の間に半角スペースが挿入されています。 このような場合には、 呼び出されたサブルーチンの引数にByValの指定がない時は、 Callがある場合とは挙動が異なるということですね。 ありがとうございました。