プロが教えるわが家の防犯対策術!

サブプロシージャから別のプロシージャを呼び出し戻り値を取得する場合、以下2方法があると思います。どちらがいいと思いますか?

方法1
宣言セクションで共通変数として宣言します。
Option explicit
Dim x As Long
----------------------
sub A()
call B
end sub
---------------------
sub B()
x=~
end sub

方法2
戻り値xを指定します。
sub A()
Dim x As Long
call B(x)
end sub
-------------------------------
sub B(Byref x As Long)

end sub


当初は方法1を使ってました。方法2を知らなかったからです。
次に方法2によりByrefの方法で戻り値指定が出来ると知り、使い始めました。
ところが、subの数が増えて来ると「あれ?この変数はByref?, Byval?どっちだっけ?」と分かり難く感じるようになりました。その点、方法1は一番上を見れば明らかです。しかしsub同士の独立が無いというか、別モジュールでソースコードを書く時に単純な切り貼りが出来ず、配慮が必要となります。

まとめると
方法1
利点:共通変数は一番上を見ればわかる
欠点:sub同士で独立でない。再利用時に配慮が必要

方法2
利点:sub同士で独立。再利用時の切り貼りが容易。
欠点:subの数が増えると変数の管理が必要

普通はどちらを使うものですか?

A 回答 (1件)

ケースバイケース。

でも変数のスコープ考えたら方法2か。

しかし、Functionを使わないのには何か理由があるのですか?
例示のコードは簡略化されてるのはわかるが、
処理に必要な変数が多くなると大変かも。

Option explicit
----------------------
sub A()
dim x as long
X = funcB() 'call B
end sub

Function funcB() as long

funcB = ~

end function



方法2 戻り値xを指定します。 sub A() Dim x As Long call B(x) end sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
スコープについて調べました。戻り値を指定したとしても、sub AとsubBで変数が違っててもいいようですね。
sub A()
Dim a As Long
call B(a)
end sub
---------------
sub B(Byref b As Long)
b=~
end sub
ということは、AとBで変数を統一する必要は無いってことですね。

もうひとつ、引数が多くなりつつあるのは実感してます。functionは戻り値がひとつしか使えないので、現状ではあまり使ってません。

お礼日時:2014/02/12 10:53

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