Sub parent_procedure()
Dim name As String '果物の名前
Dim max_price As Long '一番高く売れたときの価格
name = "りんご"
max_price = 300
child_procedure name, max_price
End Sub
Sub child_procedure(fruit_name As String, fruit_price As Long)
Range("A1").Value = fruit_name
Range("B1").Value = fruit_price
End Sub
Sub parent_procedure()
Dim name As String '果物の名前
Dim max_price As Long '一番高く売れたときの価格
name = "りんご"
max_price = 300
child_procedure name, max_price
End Sub
Sub child_procedure(title As String, price As Long)
Range("A1").Value = title
Range("B1").Value = price
End Sub
Sub child_procedure(title As String, price As Long)
Range("A1").Value = title
Range("B1").Value = price
End Sub
Sub kuruma_info()
Dim car_name As String
Dim car_price As Long
car_name = "フェラーリテストロッサ"
car_price = "30000000"
child_procedure car_name, car_price
End Sub
くうちゃんさんの投稿
(投稿ID: 5198)
複数のプロシージャ間で変数を利用するものとして、
メインのSubプロシージャで変数の宣言をして、参照先のSubプロシージャの()内でも変数を宣言するものがあるかと思いますが、
こちらは今回のモジュールレベル変数(=グローバル変数?)と同じようなものだが、
ByValで値を渡したり、ByRefで変数そのものを渡したりと、細かく設定することができる点が違う、という理解であっていますでしょうか。
複数のプロシージャ間での変数は、なかなか理解ができずにいました。
しかし、この動画の説明で、複数のSubプロシージャで共通の変数を使うことのメリットがよくわかりました。
(が、まだ自分で使いこなせる気はしません……)
小川 慶一さんのコメント
(コメントID: 7359)
これにより、モジュールレベル変数が不要になります。
モジュールレベル変数が不要ということは、結合度が低くなるということです。
(結合度が低いというのは、個々の部品を取り扱ううえでの制約が減るということです)
例えば、呼び出し先のプロシージャにモジュールレベル変数を通じて値を渡そうとすると、以下を揃えなくてはならなくなります。
・モジュールレベル変数
・呼び出し元で利用する変数の変数名
・呼び出し先で利用する変数の変数名
これが引数として渡すのであれば、以下のようになります。
・モジュールレベル変数は不要
・呼び出し元で利用する変数の変数名は好きに決めてよい
・呼び出し先で利用する変数の変数名は好きに決めてよい
好きに決めてよいというのはどういうことかというと、例えば、以下のように書いてももちろん問題ないということです。
以下のように書いてももちろんOKです。
child_procedureが内部で利用する引数の名称を変更しました
モジュールレベル変数を使った場合は、こうはいきませんね。
「みんなで同じ変数名で行く」としないと動作しません。
結合度が低いと、再利用も用意になります。
以下では、kuruma_infoは、child_procedureを使いまわしています。child_procedure内でどんな変数名だろうと気にせず、kuruma_info内で生成した値を渡しています。
なんとなく、雰囲気つかめたでしょうか。
あとは、書いているうちに「ああ、そういうことか。『モジュールレベル変数より結合度が低い』とは、こういうことか」と腑に落ちるタイミングがあるかと思います。
小川 慶一さんのコメント
(コメントID: 7360)
以下の講座での、「Functionプロシージャを使ったブラッシュアップ」のあたりは参考になるかと思います。
実践添削事例-パソコンスクールのシフト表・予約フォーム生成マクロ
https://forum.pc5bai.com/lesson/course/84/
くうちゃんさんのコメント
(コメントID: 7362)
引数を渡している、というご説明で、モジュールレベル変数とは別のものだということがわかりました。参照渡し、という言葉に引きずられていました。
いただいたマクロを動かして、処理の流れを追ってみます。
Functionプロシージャの動画も、頑張って見てみます。
このsubの()内の変数、使えなくてもいいのですが、よく目にするので読み解けるようになりたいです。
くうちゃんさんのコメント
(コメントID: 7363)
リンクいただいたパソコンスクールのシフト表 Functionプロシージャをざっくり見てみました。
全くついていけませんでしたが、モジュールレベル変数との違いについては雰囲気がつかめました。
また、「自分で関数なんて作らないから不要」と思っていたFunctionプロシージャですが、このように同じようなプロシージャをまとめて書くときにも使えることを知りました。
やはり、「発展編2」の知識までは持っておくべきですね。頑張ろう!
感想まででした。
小川 慶一さんのコメント
(コメントID: 7364)
Functionプロシージャは戻り値を返すことができます。
これらなしで複雑な機能を実現しようとすると、モジュールレベル変数がぐちゃぐちゃと増えすぎてメンテナンスが相当大変になってしまいます。
引数を渡せるようになると、そういう問題が激減します。
ですので、やはり、使いこなせるとぜんぜん違います。
くうちゃんさんのコメント
(コメントID: 7365)
私のレベルでは、変数名がかわってもちゃんと前のプロシージャから複数の引数をもらえるのか不思議でたまりません(笑)
勉強します!どうもありがとうございました。
小川 慶一さんのコメント
(コメントID: 7366)
そのうえで、前述の講座など、実践例をまずは真似てみることかと。
ひきつづき、よい学びを☆