• ベストアンサー

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

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

noname#224929
noname#224929

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

  • ベストアンサー
回答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

  • 【EXCEL VBA】Visual Basic Editorについて

    お世話になります。 EXCELで「Visual Basic Editor」を開くと、 左側に下記が表示されます。 Microsoft Excel Objects > Sheet1、Sheet2、Sheet3、ThisWorkBook フォーム > UserForm1 標準モジュール > Module1 クラス モジュール > Class1 Sheet1やUserForm1、Module1、Class1にそれぞれコードを 入力できますが、違い、使い分けについて教えてほしいです。 どれにコードを書いていけばいいか分からず困っています。 よろしくお願いします。

  • EXCELのVBAで、あるワークシートでのみ使うユーザーフォームを作り

    EXCELのVBAで、あるワークシートでのみ使うユーザーフォームを作りました。そのワークシート上での定数や、プロシージャや関数をワークシートのモジュールに置いています。そして、その定数や関数などをユーザーフォームのイニシャライズなどで使いたいと思いますが、ユーザーフォームのモジュールはワークシートのモジュールとは別なので、使えません。他への影響を考えると、標準モジュールには、置くのは不適切だと思います。 特定のワークシート上でのみ使うユーザーフォームと、そのワークシートとで、共通の定数や関数などを使う方法は、あるのでしょうか。どのようにすればよいのでしょうか。

  • Excelでセルに入力するとVBA関数が呼び出される

    標記件、あるExcelファイルでセルに入力を行うと、入力後にVBAのある関数が自動で呼び出されるのですが、どこでこの設定を行う事ができるのでしょうか? VBAをOPENし、"ThisWorkbook"と"Sheet"内を開いても、何も記述はありません。通常はここで設定を行うと思うのですが・・・ (SelectionChangeなどで。) なお、呼び出される関数は、標準モジュール内に入っています。 以上、よろしくお願い致します。

  • 【vba】フォームに書いてあるコードをステップインすることは不可能でしょうか?

    エクセルもアクセスも同じなんですが フォームのモジュール?に書いてあるコードを 「F8」のステップインすることは不可能でしょうか? 標準モジュールなら 「F8」で少しずつVBAコードを試すことが可能なのですが、 フォームに書いてあるほうはできません。 ひとつひとつ試したいので Private Sub コマンド1_Click() Call test End Sub とフォームのところに書き、 標準モジュールには Sub test() ・・・ End Sub と書いて 標準モジュールのほうを F8で少しずつデバッグしています。 こうするしかないのでしょうか? よろしくお願いします。

  • VBAのコードを書くところ(初心者)

    今仕事でExcelでVBAを使って物を作っているのですが、コードはどこに書くのが一番よいのでしょうか?。たとえば、本を見ると標準モジュールに書いていっているのですが、自分は今ユーザーフォームでコマンドボタンを作ったりコンボボックスを作って、そのボタンをクリックすると自然とPrivate sub オブジェクト名_Click()と出て、その中に書いているのですが、そうすると標準モジュールに書く必要がなくなってしまう気がするのですが・・・。なので一応標準モジュールに内容を移して、フォームのところで関数として呼び出すようにしたのですが、どのように書くのがよいのでしょう?長々すいませんわかりづらかったら後で補足します。 後、今までCを勉強していたのでオブジェクト?メソッド?プロパティ?の書き方が今ひとつ覚えづらいのは慣れでしょうか?

  • エクセルVBAでブックを開くとマクロを実行するようにしたいのですが

    ブックを開くと同時に開いたシートを保護するようにしたいのですがうまくいきません。通常(?)ボタンを作っておいて押すと実行すると思うのですが、そうせずにブックを開くと実行するようにならないかと思っています。保護をするコードはわかるのですが、どこにそれを書き込んだらいいのかもわかりません。VBAプロジェクトを見るとSheet1,Sheet2,ThisWorkbook,UserForm1とありますが、そのうちのどこかに置くのでしょうか?

  • エクセルVBA フォーム上でOnkeyがうまく出来ない

    エクセルVBAでプログラムをしています。 Application.Onkeyでショートカットを指定したいのですがフォーム上ではうまく指定できません。 フォーム上での指定は不可能なんでしょうか? ショートカットを認識するケース 標準モジュールに Sub test2() MsgBox "test2" End Sub Sub Auto_Open() Application.OnKey "{b}", "test2" End Sub としてシート上で「b」を押した場合はうまくいきます。 ショートカットを認識しないケース 標準モジュールに Sub test() MsgBox "test" End Sub UserForm1フォームに Private Sub UserForm_Initialize() Application.OnKey "{a}", "test" End Sub としてフォームをロード(表示)して「a」を押しても何もおきません。 またフォームが表示されている状態で「b」を押しても何もおきません。 上記のコードはテストで作ったものなのでこれ以外はフォームを開く文以外何も書いておりませんので他との兼ね合いではないと思います。 どうすれば思ったとおりの動作になるのでしょうか? そもそもOnkeyはユーザフォームがアクティブのときは動かないのでしょうか? 動かない場合、フォームがアクティブなときのみフォームごとに違う関数を呼ぶショートカットを作る方法はありませんでしょうか? (コントロールごとにkey_downイベントで確認する方法はコントロールの数が各100個ほどあるのと、フォームが10個以上あるため出来ればやりたくありません。) 環境はwinXP、excel2003です。 よろしくお願いいたします。

  • ExcelVBA ユーザーフォームのコードがない

    いつもお世話になっています。 Excel vbaで質問させてください。 あるExcelブック(test.xlsとします)を開くと、ユーザーフォーム(と思う)が表示されます。 (この時、Excelアプリケーションは「表示」されていてモーダルの状態です) ユーザーフォームで日付を選び、「これでOK」ボタンをクリックすると 新規ブックとして「text_0614.xls」が出来て、これが表示ブックとなります。 (元のtest.xlsは閉じられています) vbaコードの修正がしたくて、VBEから作業しようとしたところ ユーザーフォームモジュールも、標準モジュールも何も見当たりません。 Thisworkbookのイベントも何も書いてありません。 プロジェクトにパスワードがかかっているのかと思いましたが、もしそうだとしても プロジェクトウィンドウに、「フォーム」というフォルダは表示されると思いますし、 また、ダブルクリックしてもパスワードを求められることがありませんので パスワードがかかっているようには見えません。 これはExcelVBAのユーザーフォームじゃないのでしょうか?(VB?) または、もし、この「フォーム」フォルダごと、ユーザーに見せないやり方があるのでしょうか? どなたかご存知の方いらっしゃいましたらご教示ください! WinXP SP3 Excel2003 SP3 使用です。 どうぞよろしくお願いします。

  • ExcelのVBAコードを他のBookへ展開

    OS:Win2000 Excel2000 ExcelでモジュールシートとThisWorkBookにVBAコードを作成しました。 このVBAを他の16個のExcelブックへ展開するのですが、 何か変更があった場合、16個のbookを修正しなければなりません。 管理が煩雑になるので、避けたいのですが何か良い方法はありますでしょうか? 16個のExcelブックは同じフォルダーで管理され、 Lan又はHttp(Web)で複数人が照会、変更を行います。

  • ExcelVBAのコードが知りたい

    ちょっと古いことを教えてほしいのですが。 というのは、新しく知り合いになった方から、古いプログラム(Excel-VBA)を直したい、という相談を受けました。 ところが、ものすご~く古いものらしくて 1)VBAProjectを開いてみると、シートオブジェクトと標準モジュールはあるのですが、フォームが表示されません。     でも、実際の動きをみると、入力用のフォームなどは表示されます。 2)良く見ると(Sheet表示を全部見ると)、シートオブジェクトに表示されないものがあって、そこにX1DG,X2DG・・・という名前のダイアログシートがあって、そのシート上にフォームがありました。 3)Macroを動かすいわゆるボタンはなくて、リボンの中のアドインを選ぶと、”ユーザー設定のツールバー”が表示され、その中にプルダウンメニューが設定されていて、これを操作すると、それぞれの機能が動きます。 3)動作するVBAのコードは標準Module上に書かれていますが、上記のダイアログの中の定義体や、ユーザー設定のツールバーの中のコードがどこを探しても出てきません。 4)VBAの教科書などを見ると、どうもEXCEL95/Excel4.0の時代のもののように見受けられます。 5)今使用している(知り合いの方も、私も)ものは、WinVISTA・Excel2007なのです。 どうしたら、全体構成(VBA・DG)を見ることができるでしょうか? 教えていただけると、むちゃくちゃ嬉しいのですが。 宜しくお願いします。

専門家に質問してみよう