• ベストアンサー

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

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

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

次ぎのような実験が参考になりませんか。基本的なことだと思うのですが、初等解説書2冊を読み返しましたが載っていませんでした。 ただし下記は理解のため実験的なもので、Module1に書くべきものは、既にご回答があるように、ルールがあり、それに従うべきはいうまでもありません。 (参考までにエクセル95時代はModule1,2、・・が Sheetになっていて、それにコーディングをして、各コントロールのイベントの呼び出しは、OnAction=”プロシジィヤー名”を使っていました。 (1) Form1-1 'このSub ProcedureをAと名づける Private Sub Form_Click() Msgbox "form1" aaa End Sub Private Sub aaa()       'このSub ProcedureをBと名づける Msgbox "mod1"       ’Form1のコードWindowに記述する End Sub 実行-開始をクリックすると「form1」がでて、OKで「mod1」のメッセージが出る。 そのルーチンを通ったことの証です。 ----- (2) 上記のBの部分をModule-1のコードWindowに切り取り-貼りつけ して移す。実行-開始をクリックすると「aaaがSUBまたは・・定義されていません」とエラーが出る。(Privateになっているためが原因) ----- (3) 上記のBの部分をModule-1のコードWindowに切り取り-貼りつけ して移す。BのPrivateをPublicに変えて、実行-開始をクリックすると (1)と結果は同じで上手く行く。Privateを消してしまっても結果は同じ。 ---- (4) AとBを両方ともModule-1のコードWindowに切り取り-貼りつけして 移す。実行-開始をクリックすると、エラーは出ないが、Form1のClickイベントが効いてないようである。Form1実物とForm_Click()のイベントプロシジャー(Module1にある)が関連付けされてないようである。 ----- (5) Form1に Sub Form_Click() bbb aaa End Sub Module1に Sub aaa() MsgBox "mod1" End Sub Sub bbb() MsgBox "form1" End Sub に記述して。実行-開始をクリックすると上手く行く。 ------ (4)に対する対処方法がわたしはわかりません。 お分かりの方は教えてください。これが分かれば、Form1でもModule1でもどちらででも出来ますと納得できると思います。

arex_santa
質問者

お礼

例まで出していただいて大変参考になりました。わかりやすかったです。 ありがとうございました

その他の回答 (2)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

Privateで宣言された関数は、同じモジュールシート内から呼び出すことができません。 ちょっと愚痴を言うようですが、、、 結構前に、出向に出向して、人の作成したプログラムを見たことがあります。 仕事内容は、すでに作成してあるプログラムのバグ修正でした。 それが、とにかくプログラムが汚い!! プログラムにはコーディング規約という物があります。変数やコマンドボタンの名前の付け方にも規約があります。これにぴったり沿わなくてもいいとは思うのですが、それでも統一された名前をつけなければ、他の人が見て解読ができません。 プログラムをみて、「ピクチャボックスを制御している/コマンドボタンの機能」と人目でわかるようにすべきです。 そして、各ボタンなどの機能は共通の処理を行う部分があるのであれば、関数化しておくと便利です。他のフォームからも呼び出すのであるのであれば標準モジュール、そうでなければ同じフォーム内のモジュールに書きます。 プログラムを作成する前に「機能分割」を行い、それに沿ったコーディングをしなければ、誰にも相手をしてもらえないプログラマになります。 最近そういった人が多く見られます。特に会社に就職をしたことが無いSOHOの人に多いです。プログラムを他の人に見られることが無いので、ベタ書きをしているからです。 (先に挙げた出向先のプログラムは、アルバイトのSOHO君が書いた物でした。。。) そういった人は、別のプロジェクトを作成するときも、きっとベタ書きするのでしょうね。 標準モジュールには、「パーツとして扱える関数だけ書いてあり、コピペで他のプロジェクトに引用できるもの」「現在のプロジェクトでしか使わないプロジェクト内部での共通関数や変数」と分けておくと、別のプロジェクトでも、パーツとして扱った関数郡のあるモジュールは、全部使えてしまえます。 これらのことは、VBとかCとかそういう本ではなく、アルゴリズムの本を読んで学ぶことではないかと思います。 (この書き込みは、独自の殻にこもっているSOHOが最近は多く見られるということを言っているので、SOHOの人をけなす意味で書いたものではありません。ぼくも一応SOHO予備軍をしております。。。) http://search.microsoft.com/default.asp?qu=%83R%81%5B%83f%83B%83%93%83O%8BK%91%A5&boolean=ALL&nq=NEW&so=RECCNT&ig=01&ig=02&ig=03&ig=04&ig=05&ig=06&ig=07&ig=08&ig=09&ig=10&ig=11&ig=12&i=00&i=01&i=02&i=03&i=04&i=05&i=06&i=07&i=08&i=09&i=10&i=11&siteid=japan ↑参考URLが長すぎて、リンクが辿れないと思うので、ここに書きます。 以前

arex_santa
質問者

お礼

基本的な考えがわかりました。ありがとうございます。

  • michacha
  • ベストアンサー率37% (9/24)
回答No.1

どこでもいいと思います. ただ,標準モジュールは同じ操作をする場合に 何度も同じことを書くのがめんどくさいのであるものと私は思っています. 引数だけちゃんと渡す事ができれば 標準モジュールがあればものすごく楽にプログラムできますよ!

arex_santa
質問者

補足

早速のお返事ありがとうございます。 理解できたのですが、ということはフォームに書いてあるコードはPrivate sub ()で書いてありますよね?それは他のところ(たとえば標準モジュール)からは参照(呼び出せない)できないのでしょうか?