発展1講座第5章 - モジュールレベル変数

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

分割したマクロで、ほぼ同じようなプログラムがある場合は、モジュールレベル変数を利用するとひとつにまとめることができます。モジュールレベル変数は、Option Explicitの後、かつ、最初に出てくるサブプロシージャより前のエリアで宣言します。

この教材についての過去の質問・感想

10941 : 小川慶一の回答 (2019-01-17 08:21:40)

牧野千秋さん:

このタイミングで学ぶとおもしろいですね。
この話は、たとえば、基礎編で最初に変数を学ぶタイミングで教わっても、「だから何!?」って感じになりますw

過去の質問やりとりは、学びの宝庫です。
ひきつづき、存分に活用してください☆


> モジュールレベル変数面白い!
> 本で読んだことがあったのですが、「だから何!?」って感じで使うイメージが出来てなかったです。
> 過去の質問も参考になりました。


10928 : 牧野千秋さんのコメント (2019-01-14 12:35:30)

モジュールレベル変数面白い!
本で読んだことがあったのですが、「だから何⁉︎」って感じで使うイメージが出来てなかったです。
過去の質問も参考になりました。


10552 : 小川慶一の回答 (2018-09-08 10:06:54)

わかやまさん:

「スケーラビリティ」という言葉があります。
「このやり方で、どこまで押し通せるか?」という問いはいつも大切です。

> 小川様
>
> そうですね。くらくらします(笑)。
> これからもよろしくお願いいたします。


10547 : わかやまさんのコメント (2018-09-04 06:45:21)

小川様

そうですね。くらくらします(笑)。
これからもよろしくお願いいたします。


10533 : 小川慶一の回答 (2018-09-01 08:05:33)

わかやまさん:

もっと数を増やすとわかるかな。
より極端な例を出してみます。たとえば、以下の状態のプログラムをリライトするよう人から要求されたとしたら、どうでしょう。

○サブプロシージャが125個ある
○モジュールレベル変数が225個ある
○それぞれのモジュールレベル変数が、以下のどれなのか、コメントは一切ないので判別つかない
・複数プロシージャ間でデータ交換するために使われている
・単に、都度都度プロシージャ内で宣言するのが面倒なので、モジュールレベル変数にしているだけ

そして、変数名が自分のネーミングルールと比して気に入らないので、変更したい。

「影響箇所の調査をしなければならない」と思うだけで、頭クラクラしませんか?

> 小川様
>
> まだまだひよっこですが、お返事の内容はイメージできたように感じています。まだ仕事にいかしきれていないですが、このまま学習を続けて、みんなの仕事の負担(自分の仕事も)を減らせるようなプログラムをかけるまでがんばりたいです。


10532 : わかやまさんのコメント (2018-08-31 21:30:25)

小川様

まだまだひよっこですが、お返事の内容はイメージできたように感じています。まだ仕事にいかしきれていないですが、このまま学習を続けて、みんなの仕事の負担(自分の仕事も)を減らせるようなプログラムをかけるまでがんばりたいです。


10530 : 小川慶一の回答 (2018-08-31 07:36:32)

ゲストさん:

>他の方に対する返答で申し訳ないのですが

いえいえ (^^

>サブプロシージャの中で変数を宣言すれば、そのサブプロシージャが終わればその変数の値はなくなりますが、「モジュールレベル変数」で宣言すると別のサブプロシージャ間で同じ変数を用いた場合、前の値を引き継ぐため不具合が生じる場合があるのではないでしょうか?

それもあります。
あとは、以下ですね。

○メンテナンス性について:
個別のプロシージャ内で宣言する変数については、そのプロシージャの都合で好きに名前をつけてよいです。名前を変える際も、そのプロシージャだけの都合で即変更できます。
その一方、モジュールレベル変数については、すべてのプロシージャでその名前を使わなくてはなりませんし、名前を変えるとしたら、その変数を使っているすべてのプロシージャ内で当該変数の変数名を変更しなくてはなりません。

○可読性について:
個別のプロシージャ内で宣言する変数については、そのプロシージャ内でしか使わないものと即断できます。
その一方、モジュールレベル変数については、そのプロシージャ内でしか使わないものなのか?複数プロシージャ間でデータ交換をするためのものなのか?ということについては、コード全体を読まないと判断できません。


複数モジュールがあり、プロシージャが20も30もあったとしたら、プロシージャ内で宣言してもよかった変数をモジュールレベル変数にすることで、上述のメンテナンス性、可読性の問題がどれだけプログラマーの負担になるか?ということをイメージできるかと思います。

※イメージできなかったとしたら、それは、その人がたいした規模の、あるいは構造のプログラムを書けてないということなので、受け手側の経験不足故、この話題については納得されるのはムリです。
ある程度経験を積んでから、いつかまたこの解説を読み直してください、としか言いようがないですね。

ということで、最後にひとつ理由を追加すると

○説得力について:
個別のプロシージャ内で宣言すれば済んだはずの変数までむやみにモジュールレベル変数にしていると、優秀なプログラマーからは、「経験不足で無駄の多いイタいヤツ」とは思ってもらえますが、「デキるヤツ」とは思ってもらえません。
その結果、会社でのあなたへの評価はなかなか上がらなくなります (^^;

上司さん「○○くん、『マクロ書ける』ていうけど、優秀くんから見てどう?」
優秀くん「あー、アイツ、まーまー結果は出せてるけど、コード見るとぜんぜんヒヨっ子ですよ。しかも、アイツ、僕がそう言ってコードの不備を指摘しても理解できないレベルに勘が鈍いんです」
上司さん「ふーん、優秀くんが言うんならそうだろうなー。じゃ、評価はたいしてしてあげなくてもいいな。あと、『デキるヤツだけ集めたい』て本部長が言っているプロジェクトがあるんだけど、○○くんを推薦するのはやめとこっと」

と、そんな会話があなたの知らないところでなされます (^^;


> 10367 の小川様の回答について
>
> では、どうして『全ての変数を「モジュールレベル変数」として宣言しちゃえば、個々のサブプロシージャでは変数を宣言しなくて良い』という考えはダメなのか?そのデメリットは何か?ということについては、まずは考えてみてください。
>
> 他の方に対する返答で申し訳ないのですが、サブプロシージャの中で変数を宣言すれば、そのサブプロシージャが終わればその変数の値はなくなりますが、「モジュールレベル変数」で宣言すると別のサブプロシージャ間で同じ変数を用いた場合、前の値を引き継ぐため不具合が生じる場合があるのではないでしょうか?


10529 : ゲストさんのコメント (2018-08-31 06:23:39)

10367 の小川様の回答について

では、どうして『全ての変数を「モジュールレベル変数」として宣言しちゃえば、個々のサブプロシージャでは変数を宣言しなくて良い』という考えはダメなのか?そのデメリットは何か?ということについては、まずは考えてみてください。

他の方に対する返答で申し訳ないのですが、サブプロシージャの中で変数を宣言すれば、そのサブプロシージャが終わればその変数の値はなくなりますが、「モジュールレベル変数」で宣言すると別のサブプロシージャ間で同じ変数を用いた場合、前の値を引き継ぐため不具合が生じる場合があるのではないでしょうか?


10495 : 受講生さんのコメント (2018-08-24 07:18:45)

Option Explicitの後と
最初に出てくるマクロをの前のエリアで変数を宣言しておくと

同じような処理をするマクロに活用できる。

同じような処理をするマクロの前に変数を宣言し直すことが大事。


10367 : 小川慶一の回答 (2018-08-10 10:56:48)

受講生 さん:

おはようございます。

> 全ての変数を「モジュールレベル変数」として宣言しちゃえば、個々のサブプロシージャでは変数を宣言しなくて良いってことですから。

それは典型的な運用の誤りです。
モジュールレベル変数は、複数プロシージャ間での値のやりとりの必要性があるとき「だけ」使ってください。

では、どうして『全ての変数を「モジュールレベル変数」として宣言しちゃえば、個々のサブプロシージャでは変数を宣言しなくて良い』という考えはダメなのか?そのデメリットは何か?ということについては、まずは考えてみてください。

> ところで、こびとちゃんは、どのタイミングでモジュールレベル変数を開放するのでしょうか?

一連のプロシージャが終了したあとも変数に格納されたデータなりオブジェクトへの参照なりは保持されます。
ただし、End (End Sub でも End Function でもなく、Exit Sub でも Exit Function でもなく、End。本講座では紹介していません)で強制終了された場合はすべての変数に格納された値は破棄されます。

以下、参考までに。

Option Explicit
Dim w As Worksheet

Sub hoge()
    Set w = ActiveSheet
End Sub

Sub fuga()
    Debug.Print w.Range("A1").Value
End Sub

Sub piyo()
    End
End Sub



> これは便利ですね。
> 全ての変数を「モジュールレベル変数」として宣言しちゃえば、個々のサブプロシージャでは変数を宣言しなくて良いってことですから。
> ただ、変数名をキチンと把握していないと、おかしな動きをするマクロのデバックに相当苦労する(変数を1つ1つ追わないとミスに辿り着けない)ようなイメージがあります。
> ところで、こびとちゃんは、どのタイミングでモジュールレベル変数を開放するのでしょうか?


10364 : 受講生さんのコメント (2018-08-09 21:01:14)

これは便利ですね。
全ての変数を「モジュールレベル変数」として宣言しちゃえば、個々のサブプロシージャでは変数を宣言しなくて良いってことですから。
ただ、変数名をキチンと把握していないと、おかしな動きをするマクロのデバックに相当苦労する(変数を1つ1つ追わないとミスに辿り着けない)ようなイメージがあります。
ところで、こびとちゃんは、どのタイミングでモジュールレベル変数を開放するのでしょうか?


4317 : 山田 将之さんのコメント (2015-05-19 21:10:29)

難しいですね。


2317 : 受講生さんのコメント (2014-08-31 12:47:24)

モジュールレベル変数、理解できました。


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 発展1講座イントロダクション - 使用するファイル、PDFの確認
    【動画1】 発展1講座イントロダクション - 使用するファイル、PDFの確認 未習得
  2. 【動画2】 発展1講座イントロダクション - デバッグ イミディエイトウィンド
    【動画2】 発展1講座イントロダクション - デバッグ イミディエイトウィンド 未習得
  3. 【動画3】 発展1講座第1章 - オープニング 第1章1
    【動画3】 発展1講座第1章 - オープニング 第1章1 未習得
  4. 【動画4】 発展1講座第1章 - オープニング 第1章2
    【動画4】 発展1講座第1章 - オープニング 第1章2 未習得
  5. 【動画5】 発展1講座第1章 - データの「型」1
    【動画5】 発展1講座第1章 - データの「型」1 未習得
  6. 【動画6】 発展1講座第1章 - データの「型」2
    【動画6】 発展1講座第1章 - データの「型」2 未習得
  7. 【動画7】 発展1講座第1章 - 変数の初期値
    【動画7】 発展1講座第1章 - 変数の初期値 未習得
  8. 【動画8】 発展1講座第1章 - ハンガリアン記法
    【動画8】 発展1講座第1章 - ハンガリアン記法 未習得
  9. 【動画9】 発展1講座第1章 - 変数宣言の強制1
    【動画9】 発展1講座第1章 - 変数宣言の強制1 未習得
  10. 【動画10】 発展1講座第1章 - 変数宣言の強制2
    【動画10】 発展1講座第1章 - 変数宣言の強制2 未習得
  11. 【動画11】 発展1講座第1章 - 総称オブジェクト型
    【動画11】 発展1講座第1章 - 総称オブジェクト型 未習得
  12. 【動画12】 発展1講座第1章 - 固有オブジェクト型
    【動画12】 発展1講座第1章 - 固有オブジェクト型 未習得
  13. 【動画13】 発展1講座第1章 - バリアント型
    【動画13】 発展1講座第1章 - バリアント型 未習得
  14. 【動画14】 発展1講座第2章 - オープニング 第2章
    【動画14】 発展1講座第2章 - オープニング 第2章 未習得
  15. 【動画15】 発展1講座第2章 - コレクション
    【動画15】 発展1講座第2章 - コレクション 未習得
  16. 【動画16】 発展1講座第2章 - コレクション(インデックス)
    【動画16】 発展1講座第2章 - コレクション(インデックス) 未習得
  17. 【動画17】 発展1講座第2章 - コレクション(インデックス)の具体例
    【動画17】 発展1講座第2章 - コレクション(インデックス)の具体例 未習得
  18. 【動画18】 発展1講座第2章 - プロパティ 従属要素のオブジェクト
    【動画18】 発展1講座第2章 - プロパティ 従属要素のオブジェクト 未習得
  19. 【動画19】 発展1講座第2章 - プロパティ 上位のオブジェクト
    【動画19】 発展1講座第2章 - プロパティ 上位のオブジェクト 未習得
  20. 【動画20】 発展1講座第2章 - プロパティ 同レベルのオブジェクト
    【動画20】 発展1講座第2章 - プロパティ 同レベルのオブジェクト 未習得
  21. 【動画21】 発展1講座第2章 - プロパティ 値として表現できるデータ
    【動画21】 発展1講座第2章 - プロパティ 値として表現できるデータ 未習得
  22. 【動画22】 発展1講座第2章 - プロパティ Offset
    【動画22】 発展1講座第2章 - プロパティ Offset 未習得
  23. 【動画23】 発展1講座第2章 - プロパティ Offsetの使い方
    【動画23】 発展1講座第2章 - プロパティ Offsetの使い方 未習得
  24. 【動画24】 発展1講座第2章 - End プロパティの使い方
    【動画24】 発展1講座第2章 - End プロパティの使い方 未習得
  25. 【動画25】 発展1講座第2章 - メソッド1
    【動画25】 発展1講座第2章 - メソッド1 未習得
  26. 【動画26】 発展1講座第2章 - メソッド2
    【動画26】 発展1講座第2章 - メソッド2 未習得
  27. 【動画27】 発展1講座第3章 - マクロの自動記録 イントロダクション
    【動画27】 発展1講座第3章 - マクロの自動記録 イントロダクション 未習得
  28. 【動画28】 発展1講座第3章 - マクロの自動記録 オートフィルタ1
    【動画28】 発展1講座第3章 - マクロの自動記録 オートフィルタ1 未習得
  29. 【動画29】 発展1講座第3章 - マクロの自動記録 オートフィルタ2
    【動画29】 発展1講座第3章 - マクロの自動記録 オートフィルタ2 未習得
  30. 【動画30】 発展1講座第3章 - マクロの自動記録 フォントの設定
    【動画30】 発展1講座第3章 - マクロの自動記録 フォントの設定 未習得
  31. 【動画31】 発展1講座第3章 - マクロの自動記録 カラーインデックス
    【動画31】 発展1講座第3章 - マクロの自動記録 カラーインデックス 未習得
  32. 【動画32】 発展1講座第3章 - マクロの自動記録 アンダースコア
    【動画32】 発展1講座第3章 - マクロの自動記録 アンダースコア 未習得
  33. 【動画33】 発展1講座第3章 - マクロの自動記録 途中改行1 入力支援機能
    【動画33】 発展1講座第3章 - マクロの自動記録 途中改行1 入力支援機能 未習得
  34. 【動画34】 発展1講座第3章 - マクロの自動記録 途中改行2
    【動画34】 発展1講座第3章 - マクロの自動記録 途中改行2 未習得
  35. 【動画35】 発展1講座第3章 - マクロの自動記録 並べ替え
    【動画35】 発展1講座第3章 - マクロの自動記録 並べ替え 未習得
  36. 【動画36】 発展1講座第3章 - マクロの自動記録 個人用マクロブック
    【動画36】 発展1講座第3章 - マクロの自動記録 個人用マクロブック 未習得
  37. 【動画37】 発展1講座第4章 - 論理演算子 イントロダクション
    【動画37】 発展1講座第4章 - 論理演算子 イントロダクション 未習得
  38. 【動画38】 発展1講座第4章 - 論理演算子 解説
    【動画38】 発展1講座第4章 - 論理演算子 解説 未習得
  39. 【動画39】 発展1講座第4章 - 構造文 イントロダクション
    【動画39】 発展1講座第4章 - 構造文 イントロダクション 未習得
  40. 【動画40】 発展1講座第4章 - For Each構文 イントロダクション1
    【動画40】 発展1講座第4章 - For Each構文 イントロダクション1 未習得
  41. 【動画41】 発展1講座第4章 - For Each構文 イントロダクション2
    【動画41】 発展1講座第4章 - For Each構文 イントロダクション2 未習得
  42. 【動画42】 発展1講座第4章 - For Each構文 イントロダクション3
    【動画42】 発展1講座第4章 - For Each構文 イントロダクション3 未習得
  43. 【動画43】 発展1講座第4章 - For Each構文 演習
    【動画43】 発展1講座第4章 - For Each構文 演習 未習得
  44. 【動画44】 発展1講座第4章 - For Each構文 伝票作成マクロ解説
    【動画44】 発展1講座第4章 - For Each構文 伝票作成マクロ解説 未習得
  45. 【動画45】 発展1講座第4章 - For Each構文 セルのコレクション
    【動画45】 発展1講座第4章 - For Each構文 セルのコレクション 未習得
  46. 【動画46】 発展1講座第4章 - For Each構文 カンニングペーパー
    【動画46】 発展1講座第4章 - For Each構文 カンニングペーパー 未習得
  47. 【動画47】 発展1講座第4章 - Do Loop構文 概要
    【動画47】 発展1講座第4章 - Do Loop構文 概要 未習得
  48. 【動画48】 発展1講座第4章 - Do Loop構文 マクロの流れ
    【動画48】 発展1講座第4章 - Do Loop構文 マクロの流れ 未習得
  49. 【動画49】 発展1講座第4章 - Do Loop構文 4つのパターン
    【動画49】 発展1講座第4章 - Do Loop構文 4つのパターン 未習得
  50. 【動画50】 発展1講座第4章 - Do Loop構文 マクロの強制終了
    【動画50】 発展1講座第4章 - Do Loop構文 マクロの強制終了 未習得
  51. 【動画51】 発展1講座第4章 - Exit For、Exit Do、Exit Sub
    【動画51】 発展1講座第4章 - Exit For、Exit Do、Exit Sub 未習得
  52. 【動画52】 発展1講座第4章 - Select Case 概要
    【動画52】 発展1講座第4章 - Select Case 概要 未習得
  53. 【動画53】 発展1講座第4章 - Select Case If文との比較
    【動画53】 発展1講座第4章 - Select Case If文との比較 未習得
  54. 【動画54】 発展1講座第4章 - Select Case 比較する条件の順番
    【動画54】 発展1講座第4章 - Select Case 比較する条件の順番 未習得
  55. 【動画55】 発展1講座第4章 - Select Case 複数条件の並べ方
    【動画55】 発展1講座第4章 - Select Case 複数条件の並べ方 未習得
  56. 【動画56】 発展1講座第4章 - Select Case 条件の範囲選択
    【動画56】 発展1講座第4章 - Select Case 条件の範囲選択 未習得
  57. 【動画57】 発展1講座第5章 - Sub プロシージャの分割と呼び出し
    【動画57】 発展1講座第5章 - Sub プロシージャの分割と呼び出し 未習得
  58. 【動画58】 発展1講座第5章 - Sub プロシージャを分割するメリット
    【動画58】 発展1講座第5章 - Sub プロシージャを分割するメリット 未習得
  59. 【動画59】 発展1講座第5章 - ステップアウト、ステップオーバー
    【動画59】 発展1講座第5章 - ステップアウト、ステップオーバー 未習得
  60. 【動画60】 発展1講座第5章 - モジュールレベル変数
    【動画60】 発展1講座第5章 - モジュールレベル変数 未習得
  61. 【動画61】 発展1講座第5章 - モジュールレベル変数の操作
    【動画61】 発展1講座第5章 - モジュールレベル変数の操作 未習得
  62. 【動画62】 発展1講座第5章 - モジュールレベル変数 変数の重複
    【動画62】 発展1講座第5章 - モジュールレベル変数 変数の重複 未習得
  63. 【動画63】 発展1講座第5章 - モジュールレベル変数 まとめ
    【動画63】 発展1講座第5章 - モジュールレベル変数 まとめ 未習得
  64. 【動画64】 発展1講座第5章 - モジュールレベル変数 アクセシビリティ設定
    【動画64】 発展1講座第5章 - モジュールレベル変数 アクセシビリティ設定 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ