VBA モジュールレベル・パブリックレベルの変数

このQ&Aのポイント
  • Excel VBAにおいて、変数の使い方にはプロシージャレベルを推奨する傾向があります。
  • モジュールレベルやパブリックレベルの変数は、上手な人はあまり使わない傾向があります。
  • モジュールレベル・パブリックレベルの変数を多く使う場合、ソースコードが見づらくなる傾向があります。
回答を見る
  • ベストアンサー

VBA モジュールレベル・パブリックレベルの変数

Excel VBAにおいて(他のプログラミングにも通じることでしょうが)、変数は可能な限り、プロシージャレベルを使うようにしています。 やはり上手な人は、プロシージャレベルの変数を中心に使い、モジュールレベルやパブリックレベルの変数はあまり使わないものでしょうか。 モジュールレベル・パブリックレベルの変数って、一番上に沢山書いていくと、プロシージャを記述するスペースを下に追いやってしまい、ソースが見苦しくなる気がします。上手な人は、そういうモジュールレベル・パブリックレベルの変数をいたずらに増やさないようにする、良い方法とかを持っているのでしょうか?それとも、上手な人でも、モジュールレベル・パブリックレベルの変数は、多くなる時は物凄く多くなったりするのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

> モジュールレベル・パブリックレベルの変数って、一番上に沢山書いていくと、プロシージャを記述する > スペースを下に追いやってしまい、ソースが見苦しくなる気がします 根本的な問題はそれではありません。 スコープ(つまり変数やメソッドなどの宣言部分)適用範囲が広くなればなるほど、 明確な責任範疇がわからなくなり、結果的に悪品質・バグの生み出し易いものが 出来上がるからです。 VBAでは各シート、標準モジュール、クラスが使えると思いますが、 最も悪なのは、以下がすべて当てはまることでしょう。  ・何か処理を書きたい時に、何かにつけていつも標準モジュールを利用している。  ・スコープの狭くていい変数、メソッドすらPublicに定義している。  ・関係性のない変数、メソッドを全て同一の標準モジュールに組み込んでいる。 綺麗に書こうとする人たちは、まずそれがどういった分類にカテゴライズされるものなのかを 明確に切り分け、更にそれぞれの命令の責任範疇を明確にします。 責任範疇を切り分けて処理を細分化することによって、障害が発生した際の障害位置の特定と、 他のロジックへの影響力を小さくするからです。 上手な人は恐らく、よほどのことがない限り、変数が多くなるということはありません。 なぜなら、責任範疇を切り分けている時点で、変数の使用が限られるからです。 それでも変数が多くなる時は、それぞれの変数がどういった分類にカテゴライズされるのかを 再考し、クラスやメソッドを切り分けるべきか、1つのカテゴライズされた変数を1つ定義するか などとなります。 こういった事柄は、一人でやっていても身に付きません。 なぜなら、一人さえ覚えていればなんら問題がないからです。 一人でやるとき、他人がコードを修正する、もしくは拡張して何かを追加する時には どういったコードだと分かりやすいか、それを念頭に考えれば少しずつ綺麗になるし、 上手い人はどういうコードを書くのか、ネットで調べるのも勉強になります。

absolute_space
質問者

お礼

ありがとうございます。他人の書くコードをネットで見たりはしているのですが、サンプルのダウンロードなどもしてみようと思います。標準モジュールばかり利用していますが、それも考えなおしてみます。

関連するQ&A

  • VBA モジュールで共通に使う変数の宣言方法

    VBAにてプログラミングを覚えている者です。 現在、いくつかのモジュールがあり、それぞれDimにて宣言している共通の変数があります。 いくつものプロシージャに毎回宣言せず、どこかでひとまとめにしたいと思い、色々と調べています。 例えば、 Dim pic1 As Picture Dim cell1 As String Dim pass1 As String Dim pic2 As Picture などです。 Dimのほかに、Publicの宣言などがありますが、いま一つ使い方がピンときません。 共通宣言する変数をひとつのモジュールとして登録し、活用できると、いざ変更となったときに その内容だけ置き換えればいいと思うのですが、みなさんはどのように宣言をしていますか? (例えば、Stringなどは各モジュールで変更するのが大変だと思うのですが・・・) ヒントを教えていただければと思います。よろしくお願いします。

  • エクセルVBAでの変数のスコープ

    基本的なことなのですが、教えて下さい。 当方、PHPやjavascriptを中心にプログラムしてきたのですが、 今回、エクセル+VBAでプログラムすることになり、VBAを勉強しているところなのですが、ちょっと戸惑っています。 いままでは、グローバル変数をなるべく使わないように、プログラミングをしてきたのですが、 VBAの勉強で、参考にしている本のコードは、全てグローバル変数を使っています。 そもそも、エクセルのシート・セルがグローバル変数のようなもの(?)なので、変数のスコープにこだわってもあまり意味がないのかな?とも思います。 エクセル+VBAである程度の規模のプログラムを作る際、 変数のスコープはどのように使い分けるのが良いのでしょうか? すみませんが、ご教授の程、よろしくお願いします。

  • パブリック変数を宣言する時に・・・

    エクセルVBAの質問です。 モジュールAとBがあるとしまして、 Aの中にあるプロシージャからBの中のプロシージャを呼び出す場合、 変数を引き渡したいとしたらパブリック変数を使いますよね? この場合宣言は、 Aの宣言セクションでするのか、 Bの宣言セクションでするのか、 あるいは両方で同じ変数を宣言するのか、 どれなんでしょ?

  • ExcelのVBAでの変数の範囲指定について

    Excel2010を使っている者です。 VBAでの変数の範囲指定についてわからない点があるのでお願いいたします。 私の使っている参考書に「プロジェクト内のどこでも有効な変数は、プロシージャの中ではなく、モジュールの一番上で、Publicと付けて宣言するように」と書いてあったのですが、プロジェクト内とはどういう意味でしょうか? よろしくお願いいたします。

  • ExcelのVBA。public変数の値が消える

    VBAについて。Excelの2003や2007を使っています。標準モジュールで public 変数を定義しました。 ユーザーformを使い、パブリック変数に値を入れたり変更し、標準モジュールに戻ったとき、そのpabulic変数が resetされてしまっている事があります。全く同じマクロで、この現象が起こることと、起こらないことがあります。excelの2003でも2007でも、同じ現象が起こります。簡単なマクロで再現性のある具体的なものを示したいと思い、試しましたが、できませんでした。簡単なマクロでは、きちんとパブリック変数は保持されています。問題のあるマクロはかなり長いものなので、とても示せません。問題がどこにあるのかわかりません。このマクロで不都合があるという具体的なマクロを示すことができない状態での質問で、申し訳ありません。 また、このようなプログラミングをしていて思ったのですが、ユーザーフォームに対してユーザーが任意の引数を渡す方法あるいは、ユーザーフォームから引数を受け取る方法はあるのですか?今は、pubulic変数を用いたり、具体的なセルに値を代入したりしていますが、どう考えてもそれはエレガントではないし、汎用性もないと思います。引数で引き渡すのが一番綺麗でいいとは思うのですが、それが可能かどうかわかりません。

  • Excel2003 VBA 変数のスコープについて

    お世話になります。 Excel VBAで、Application.Run "Book1!Test"によって、他ブックのプロシージャを実行することができますが、その「他ブックのプロシージャ」で使用した変数を、Application.Run "Book1!Test"終了後も、使用できるような変数宣言の仕方(スコープ)はあるのでしょうか。 よろしくお願いします。

  • エクセルVBAでシートモジュールでのパブリック変数

    エクセル2000です。 標準モジュールで取得したパブリック変数は他のシートモジュールで参照できますが、逆にシートモジュールで取得したパブリック変数は他のシートで参照できないのでしょうか? シートチェンジイベントで取得した文字列を変数nmに格納し、ワークブックモジュールで呼び出そうとしたら何もでてきませんでした。 どうやったらよいのでしょうか? 'シートモジュールの記述 Public nm As String Private Sub Worksheet_Change(ByVal Target As Range) Dim rw As Integer If Intersect(Target, Range("A1").CurrentRegion) Is Nothing Then Exit Sub If Selection.Count > 1 Then Exit Sub rw = Target.Row nm = IIf(Cells(rw, "A") = "", Cells(rw, "A").End(xlUp).Value, Cells(rw, "A").Value) 'MsgBox nm End Sub 'ThisWorkbookモジュールの記述 Private Sub Workbook_BeforeClose(Cancel As Boolean) If nm = "" Then Exit Sub MsgBox nm & "さん、ご苦労様でした。" End Sub

  • VBAの変数は何故「i」から始まることが多い?

    最近、エクセルVBAを始めたものです。 サイトや解説本でいろいろな記述を見たのですが、私が見た限りでは全ての例で、最初に出てくる変数は「i」で表現されていました。 そして次に出てくる変数は「j」。 (例えば、 For i = 1 to 10 ・・・・ Next i とか) 26あるアルファベットからたまたま「i」が選ばれた?にしては、数多くの解説本やサイトで「i」が使用されているので疑問に思いました。 変数を表すのに、例えば「a」「b」「c」……としても何ら問題にならないと思うのですが…… 「i」にしているのには何か理由があるのでしょうか。

  • 標準モジュールとクラスモジュールの違い

    マイクロソフトのAccess2000でVBAプログラミングを行なっておりますが、 基本的なことを教えてください。 「標準モジュール」と「クラスモジュール」の違いはなんですか? 例えば、どこからでも使えるプロシージャ Public Function getSum( i1 as integer, i2 as interger ) getSum = i1 + i2 End Function を定義したとして、標準モジュール内に書くのとクラスモジュール内に 書くのとでは、何が違ってきますか?その他とにかく「標準モジュール」 とクラスモジュールの違いを教えてください。

  • エクセルVBAで標準モジュールを保護したい

    エクセルのVBAマクロを使用したエクセルフィルがあります。 ユーザーは標準モジュールに記述した関数を使ってシートのマクロを変更してカストマイズできます。 ユーザーが標準モジュールを変更すると使用できなくなりますので、この標準モジュールだけをユーザーが変更できない、または見えないようにする方法をご教示いただけませんか。 よろしくお願いします。

専門家に質問してみよう