今仕事でExcelでVBAを使って物を作っているのですが、コードはどこに書くのが一番よいのでしょうか?。たとえば、本を見ると標準モジュールに書いていっているのですが、自分は今ユーザーフォームでコマンドボタンを作ったりコンボボックスを作って、そのボタンをクリックすると自然とPrivate sub オブジェクト名_Click()と出て、その中に書いているのですが、そうすると標準モジュールに書く必要がなくなってしまう気がするのですが・・・。なので一応標準モジュールに内容を移して、フォームのところで関数として呼び出すようにしたのですが、どのように書くのがよいのでしょう?長々すいませんわかりづらかったら後で補足します。
後、今までCを勉強していたのでオブジェクト?メソッド?プロパティ?の書き方が今ひとつ覚えづらいのは慣れでしょうか?
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でもどちらででも出来ますと納得できると思います。
No.2
- 回答日時:
Privateで宣言された関数は、同じモジュールシート内から呼び出すことができません。
ちょっと愚痴を言うようですが、、、
結構前に、出向に出向して、人の作成したプログラムを見たことがあります。
仕事内容は、すでに作成してあるプログラムのバグ修正でした。
それが、とにかくプログラムが汚い!!
プログラムにはコーディング規約という物があります。変数やコマンドボタンの名前の付け方にも規約があります。これにぴったり沿わなくてもいいとは思うのですが、それでも統一された名前をつけなければ、他の人が見て解読ができません。
プログラムをみて、「ピクチャボックスを制御している/コマンドボタンの機能」と人目でわかるようにすべきです。
そして、各ボタンなどの機能は共通の処理を行う部分があるのであれば、関数化しておくと便利です。他のフォームからも呼び出すのであるのであれば標準モジュール、そうでなければ同じフォーム内のモジュールに書きます。
プログラムを作成する前に「機能分割」を行い、それに沿ったコーディングをしなければ、誰にも相手をしてもらえないプログラマになります。
最近そういった人が多く見られます。特に会社に就職をしたことが無いSOHOの人に多いです。プログラムを他の人に見られることが無いので、ベタ書きをしているからです。
(先に挙げた出向先のプログラムは、アルバイトのSOHO君が書いた物でした。。。)
そういった人は、別のプロジェクトを作成するときも、きっとベタ書きするのでしょうね。
標準モジュールには、「パーツとして扱える関数だけ書いてあり、コピペで他のプロジェクトに引用できるもの」「現在のプロジェクトでしか使わないプロジェクト内部での共通関数や変数」と分けておくと、別のプロジェクトでも、パーツとして扱った関数郡のあるモジュールは、全部使えてしまえます。
これらのことは、VBとかCとかそういう本ではなく、アルゴリズムの本を読んで学ぶことではないかと思います。
(この書き込みは、独自の殻にこもっているSOHOが最近は多く見られるということを言っているので、SOHOの人をけなす意味で書いたものではありません。ぼくも一応SOHO予備軍をしております。。。)
http://search.microsoft.com/default.asp?qu=%83R% …
↑参考URLが長すぎて、リンクが辿れないと思うので、ここに書きます。
以前
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
pythonでファイル移動できません。
-
エクセルVBAで標準モジュー...
-
【Excel VBA】標準モジュールに...
-
偶数/奇数の判定
-
シャープ製品JH-WB1821 と BCG...
-
Excel VBA 『Call』で呼び出す...
-
テキストボックスの数値を3桁ご...
-
VBでグローバル変数を宣言するには
-
グラフのX,Y座標を取得したい
-
VBAで別モジュールへの変数の受...
-
シリアルポート制御
-
モジュールとクラスの違いって...
-
msoFileDialogFolderPicker
-
エクセルVBA クラスモジュール...
-
Access VBA標準モジュールにつ...
-
エクセルVBAでシートモジュール...
-
Excel VBA 定義されたプロージ...
-
ユーザー定義関数に#NAME?が返...
-
本当にPublicな変数(配列で)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
ユーザー定義関数に#NAME?が返...
-
Excel VBAで、ユーザーフォーム...
-
VBでグローバル変数を宣言するには
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
-
モジュールの最大数はいくつな...
-
VBAで旧字体を異字体に一括で変...
-
'Range'メソッドは失敗しました
-
VBA This Workbookモジュール...
-
vba userFormのSubを標準モジュ...
-
グラフのX,Y座標を取得したい
-
VBAで別モジュールへの変数の受...
-
Form間の値の渡し方
-
ベースモジュールって?
-
【vba】フォームに書いてあ...
-
acwzlibとは?
-
標準モジュールを削除したい。(...
-
Excel VBA 標準モジュール内で...
-
Access VBA標準モジュールにつ...
おすすめ情報