• ベストアンサー

Excel VBAでのコードの書き分け方

Excel VBAについてご質問します。 プロジェクトの項目を見ると、 Sheet1 ThisWorkbook 標準モジュール などさまざまあると思います。 これらに対して、どこにコードを書いていくべきなのかがわかりません。 例えば、Sheet1にボタンを配置して、それがクリックされたときの動作についてはSheet1に書けばいいのだと思います。 ですが、いろんなシートのコード、フォームのコードなどから呼び出される関数はThisWorkbookか標準モジュールのどちらに書けばいいのか悩んでいます。 それ以外のケースも含めて、一般的にこういう風に使い分けをするというのがありましたら、ぜひ教えてください。 よろしくお願いいたします。

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

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

最初。もしくは、小さいものならば、Sheet1にボタンを配置して、それがクリックされたときの動作についてはSheet1に、Workbookが開かれたとか閉じられたとかの動作の場合はThisWorkbook書けばいいです。 慣れてきた。もしくは、やや規模が大きくなってきたならおそらく同じような処理を複数の箇所にコピペして書く事がいやになってきているはずなので、標準モジュールに区分けして書きます。 また、この頃には同じような箇所の修正なのに全部直すの!?も経験しているはずなので、この点に置いても一箇所にまとめて書くくせがあるといいです。 また、もしかしたらこの頃から使いまわせる共通関数群なども出てきているかもしれません。 で、ある意味職業でやる。もしくは、なんでexcelでやるのか分からない^^;状態になれば、クラスの登場です。(※必ず必要なわけではありません。) 変数の初期化や、どのタイミングで変更されているかなど全体を把握しにくくなってきた場合にはクラスを使用し、パーツパーツに役割分担したほうが作りやすい、デバッグしやすい、保守しやすいです。 また、意識的に他でも使用できるものを作成したりします。 このころには、大域変数使うなっつってんだろーぼけーを経験しているはずです^^; この文章でわからない事があれば、まだその機能を使う段階ではないという事だと思われます。 無理やり使用してもあまりいい事はないと思いますので、別にSheet1やThisWorkbookに書けばいいと思います。 以上。参考になれば。。。

noname#224929
質問者

お礼

ご回答ありがとうございます。 No.1さんの回答である程度イメージはできたのですが、それでもまだ疑問に思っていた箇所がすっきりしました。 Sheet1とThisWorkbookはそういう使い分けをすればいいのですね。 クラスは一部で利用しています。 理由は以前C++をかじったときに感じた、関数が種類別(例えばファイル操作など)で固まっていると便利だなぁ、と思ったからなのですが。 あんまり使う理由としてはよくないのかもしれませんね^^; それと、大域変数(グローバル変数ということで間違いないでしょうか?)はついつい使ってしまいます・・・。 極力使わないで済ませたいのですが、どうしても苦し紛れに使うことが・・・。 まだまだ全体の構成を考える力が足りないですね。 長文になりましたが、ありがとうございました。

その他の回答 (1)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

通常のコードは標準モジュールに記入します。 他のシートやイベントで共用される関数やサブルーチンなども同様です。 共用しないコードならシートやThisWorkbookに書いても問題は無いでしょう。 標準モジュールに書いたコードはメニュー([ツール]-[マクロ])から一覧で参照されますが、モジュールの先頭に「Option Private Module」と記入しておくとそのモジュールに書かれたマクロが一覧に表示されなくなります。 (一覧に表示されないだけで、他のモジュールから呼び出す事も、マクロボタンに割り付ける事も出来ます。) コードが多くなって来た場合など、メインのマクロ名だけを表示させておく場合などに便利かと思います。

noname#224929
質問者

お礼

ご回答ありがとうございます。 共有するしない、メニューに表示させるかどうかで使い分けがあるのですね。 なんとなくイメージができてきました。 ありがとうございました。

関連するQ&A