重要なお知らせ

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

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

いつもお世話になっております。

IF ○○○○ Then
Call ○○○○なときのマクロ
Else
Call ××××なときのマクロ
Endif

というマクロを書きました。
(実際はかなり長くて複雑です)

Callを使用すると、
見た目がすっきりする以外に何かメリット
またはデメリットがあるのでしょうか。
以下の場合と何か異なるでしょうか?

IF ○○○○ Then
'○○○○なときのマクロの内容を記述
~~~~~~~
Else
'××××なときのマクロの内容を記述
~~~~~~~
Endif

ご教示いただければ幸甚です。

A 回答 (6件)

こんにちは。



ご質問は、Call ステートメント自体の意義だと思います。

>見た目がすっきりする以外に何かメリット
というよりも、「明示的」に呼び出している点が、ひとつのポイントだと思います。私は、言語のタイプの問題は一切関係ないと思います。

そして、もう1つの重要なポイントは、呼び出されるプロシージャ側が、参照渡しであろうが、値渡しであろうが、Call ステートメントをすれば、少なくとも、呼び出し側 Main()で、その両者の使い分けをせずに済むという利点があるからではないでしょうか?

以下でいうと、(2)=[参照渡し] と(3)=[値渡し]を、Main側で処理を考慮する必要はないというより、出来ないわけです。だから、呼び出される側(Routine)で、ByVal=[値渡し]にすればよいわけです。(もちろん、以下の場合、出力値のない値渡しは意味がありません)

Sub Main()
Dim a As Integer
 a = 1
 Call Routine1(a) '....(1)
 'Routine1 a '.........(2)
 'Routine1 (a) '........(3)
 MsgBox "a: " & a
End Sub

Sub Routine1(a As Integer)
'Sub Routine1(ByVal a As Integer) '値渡しの場合
 
 a = a + 3
 
End Sub

多くは、共有プロシージャや共有関数に関して行うわけで、同モジュール内のサブルーチンで、そんな必要性はあまりないとは思います。参照渡しと値渡しがはっきりしていない状態では、Call ステートメントはあまり意味がないけれど、私個人では、共有するものにしますが、掲示板では明示的に示す場合が多いかもしれません。構造化すること自体には、Call ステートメントは、あまり関係がないと思います。
    • good
    • 0

短いマクロであればそうでもありませんが、基本的な考え方としては


・処理ごとに部品化する事で再利用しやすくする。
・マクロの処理順と関係なく機能ごとにまとめておけるのでメンテナンスや変更などが容易になる。
・問題が起きた時にどの機能が悪いのかテストしやすくなる。
などがあげられます。それよりも、見た目がすっきりすると言うのは結構重要で、みやすくなる事で打ち間違いなどのバグが少なくなります。
    • good
    • 0

Excel は、操作したことのない門外漢ですが・・・。



Q、見た目がすっきりする以外に何かメリットはあるのか?
A、「大きなプログラムに潜在する複雑さに対処する」というメリットもあります。

次は、カーニハン&リッチーの関数(=マクロ)に関する指摘です。

Cの関数は、Fortran のサブルーチンあるいは関数、Pascal の手続きあるいは関数に対応する。
関数は、その中身に関して、何も心配しないで使えるようにある処理をブラックボックスの中につめ込むのに便利な方法である。
関数は実際、大きなプログラムに潜在する複雑さに対処するただ一つの方法となる。
うまく設計された関数に関しては、いかに処理されるのかということを無視して、何ができるのかを知っていれば十分である。
Cは関数の使用が、やさしく、便利で、かつ能率的であるように設計されている。
たった2~3行しかなくて、1回しか呼ばれない関数を見かけることがよくあるが、それは断片的なプログラムをわかりやすく、はっきりとさせるために使われているのである。
    • good
    • 0

外に出して部品化することで、他のプロシージャからも呼び出せるようになるのが便利なのではないでしょうか?


またNo.2の方が触れている変数の扱いに関しても、値渡しでサブプロシージャに渡せば、
その値をサブプロシージャ内で変更しようが破棄しようがメインのプロシージャが保持している値には影響しないので、
そういう特性が生きるケースの場合には便利だと思います。
    • good
    • 0

Call hogehoge(i,j)


または、
hogehoge i, j
で参照渡しとなります。
また、Call を付けない場合は、

hogehoge (i), j
とすると、i のみ値渡しで、
hogehoge (i), (j)
とすると i, j ともに値渡しです。

ここで値渡し,参照渡しについては参考URLを見てください。

参考URL:http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub0 …
    • good
    • 1

VBAはインタープリターなので、実行速度が速くなる場合が有ります

    • good
    • 1

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