サブプロシージャから別のプロシージャを呼び出し戻り値を取得する場合、以下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の数が増えると変数の管理が必要
普通はどちらを使うものですか?
No.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
ありがとうございます。
スコープについて調べました。戻り値を指定したとしても、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は戻り値がひとつしか使えないので、現状ではあまり使ってません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VB6.0】 あるフォームから他...
-
sublimit textっていうエディタ...
-
演奏記号の・・・・
-
三項でたとえば交換って
-
他のフォームから別のフォーム...
-
C言語のOpenGLで複数のテクスチ...
-
VB.NETでのイベントの途中終了
-
VS CodeでTEXファイルにPDF形式...
-
VBAでcallで呼び出したsubを終...
-
再帰呼び出し
-
エクセルVBAでテキストボッ...
-
タイムアウトする仕組みを作りたい
-
Excel ユーザーフォームで計算 ...
-
C#のループでtextboxに値を入れ...
-
C言語のサフィックスについて
-
【VBS】クリップボード操作につ...
-
VB.NETのテキストボックスで、...
-
こうもりの撃退法
-
INPUTタグのカンマ対策
-
visual basic初心者です。 visu...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムの素朴な質問です 分...
-
【VB6.0】 あるフォームから他...
-
定数を構造体で・・・
-
プロシージャまたは関数の引数...
-
Excel vba で複数のテキストの...
-
【VBScript】変数のスコープ
-
パーソナルXLSBのfuctionを呼び...
-
【HTML、VBScript】HTAアプリケ...
-
プロシージャを呼び出したプロ...
-
VB6のFriendについて
-
PL/SQLのプロシージャ間でカー...
-
ExcelのVBA。Staticな変数について
-
HTML + VBScript で Sleep でき...
-
整数を二つ読み込み、それらの...
-
プロシージャの引数の取り得る...
-
Excel VBA カーソルを当てた際...
-
subを連続で実行する
-
三項でたとえば交換って
-
VBA public変数はどのようなこ...
-
C#のループでtextboxに値を入れ...
おすすめ情報