重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

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

https://www.moug.net/tech/exvba/0150033.html
http://officetanaka.net/excel/vba/statement/Call …

VBAですが、
これらのページに
subやfunctionの呼び出し時のcallを省略できると書かれてあります。

二つ質問なのですが
call無しでsubを呼び出した際に
引数が二つ以上あると呼び出せないように思うのですが
これは仕様でしょうか?


functionの呼び出しは通常
abc = myFunction(123)
のようにして得られた結果を変数に格納するような形で使われますが

Call myFunction(123)

myFunction 123
のような形で使ってもエラーが出ません
このような形で使う場合
どのような用途で用いられるのでしょうか?

質問者からの補足コメント

  • 括弧を外すと2つ以上でも使えるのですが
    括弧をつけると2つ以上だと実行できないのですが
    そうはなっていませんか?
    Excel2010ですけど。
    有効な例
    Macro1 abc xyz

    無効な例
    Macro1 (abc xyz)

    あと二つ目のご回答に関してですが
    subとfunctionの違いは返り値の受け取り方だけなので
    返り値を受け取らないのであればどちらも同じになってしまうと思うのですが合っていますでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/11/06 11:59

A 回答 (3件)

artooさんが答えられている事の補足となります



>どのような用途で用いられるのでしょうか?
実際に使用されている例としてはMsgBox関数が該当します
これはOKボタン等のボタンを押した事を返しますが、通常受け取り用の変数は設定しないと思います
この様に返り値が必要であったり、不要であったりするケースの場合もfunctionで定義すべきとなります
    • good
    • 0

> 括弧をつけると2つ以上だと実行できないのですが


質問文の2つ目のURLのページに書いてありますが、callを書かないときは引数全体を囲う括弧は付けません。
引数1つの時にエラーにならなかったとすると、例えば、式で、
x = (y)
のように不要なところに無意味に括弧を付けても良いと言うことで、エラーになっていないのでは無いかと思います。

なお、文法の基本的なことを調べる際には、誰か知らない人が過去に書いたページを参考にするので無く、まず最初はVBAエディタ付属のヘルプを見ることをお勧めします。間違ったことが書いてあることは無いので。
マニュアルを読み慣れておらず、ヘルプを読んでもわかりにくいときに、はじめて検索です。

>返り値を受け取らないのであればどちらも同じになってしまうと思うのですが合っていますでしょうか?
そういうことですね。
    • good
    • 0

>call無しでsubを呼び出した際に引数が二つ以上あると呼び出せないように思うのですがこれは仕様でしょうか?


いいえ。そんなことはありません。引数が二つ以上でも正常に呼び出せます。

>このような形で使う場合どのような用途で用いられるのでしょうか?
普通はそういうのをやらないと思いますが、あるとすると、「本来はSubで書くべき処理なんだけど、処理成功・失敗などの結果を返値で返すことにして、Functionで書いてみた。でも、今回は返値のチェックが必要じゃ無い。」というようなケースでしょうか。

別の言語の例ですが、Cではprintfという文字列出力関数があります。これは普通は返値をチェックせずに使うことが多いです。VBでいうとSubで書かれているかのような利用ですね。ただ、返値として「出力した文字数およびエラーの有無」を返すので、それが必要な場合は返値を変数に代入したりします。このときはFunction的な使い方。
普通:
printf("%d",123); ・・・・・・ "123"という文字列を出力
返値利用:
x = printf("%d",123); ・・・・・"123"という文字列を出力し、xには3が代入される。出力時にもしエラーがあればxには負の数が代入されるので、正常に出力されたのかエラーで出力できなかったのか区別できる
この回答への補足あり
    • good
    • 0

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