• 締切済み

Excel VBA callのあるなしの違い

Excel VBA の以下の2つのケースで callがある場合とない場合では何か違いがあるのでしょうか。 (1) 他のモジュール(Main)の中のプロシージャ(main)を呼び出す場合 Main.main Call Main.main (2) VBAのオブジェクトのメソッドを呼び出す場合 ActiveWorkbook.Close (True)   Call ActiveWorkbook.Close(True)  

みんなの回答

  • _backyarD
  • ベストアンサー率34% (199/580)
回答No.2

(1)については同じです。 (2)については、この場合は同じですが、Trueの部分が変数の場合、若干挙動が変わってくる可能性があります。前者は本来括弧が不要なのですが、それを付けることで強制的に引数が「値渡し(ByVal扱い)」になります。 ですので、Callを使わない場合は括弧を付けない方が無難です。 具体例をブログに書いておきました。リンクを記載しておきます。

参考URL:
http://backyard.hatenablog.com/entry/20171023/1508730816
yam2012
質問者

お礼

ActiveWorkbook.Close (True)の ()は Call ActiveWorkbook.Close(True)の()とは異なり 強制的に引数を値渡しにする括弧ということですね。 よく見るとメソッドと括弧の間に半角スペースが挿入されています。 このような場合には、 呼び出されたサブルーチンの引数にByValの指定がない時は、 Callがある場合とは挙動が異なるということですね。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

Googleで「VBA CALL のあるなし」で照会したら、 https://oshiete.goo.ne.jp/qa/8384757.html などの同じような質問をしている人が居ます。 小生も疑問を持っていますが、他の方が作ったプログラムの中だとルーチン名だけの記述(引数無しの場合など)だと、それがサブルーチン(プロシージュアー)名であることが一瞬わからず、?と思い、すぐサブルーチンらしいと気づきます。 普通は同じのようですが、結果が異なる場合があるかどうか、小生は浅学にしてわかりません。 少し話題がズレますが http://officetanaka.net/excel/vba/statement/Call.htm の >Callステートメントの有無に関わらず、関数の戻り値を利用する場合は、引数を括弧で囲まなければなりません などのご教示があります

yam2012
質問者

お礼

回答ありがとうございます。 <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)でもエラーにはならないので) もし分かっていましたら教えてください。 よろしくお願いします。

関連するQ&A

専門家に質問してみよう