• ベストアンサー

フォームモジュール内に サブプロシージャー

vbaでフォームモジュール内に Sub test() End Sub のように、サブプロシージャーを作るのはよくないですか? そのフォームモジュールに関係のあるサブプロシージャーの場合です。 サブプロシージャーは標準モジュールに作った方が良いのか、 わからないので教えてください。

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

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

こんにちは。 > vbaでフォームモジュール内に......サブプロシージャーを作るのはよくないですか? > そのフォームモジュールに関係のあるサブプロシージャーの場合です。 例えば、専らユーザーフォームモジュールから呼び出し、 主にユーザーフォームに関する処理をするプロシージャであれば、 SubであれFunctionであれ、ユーザーフォームモジュールに書く方が、 一般的ですし、全体的に整理された解り易い構造になります。 いちいちUserform1.Label1などと書かなくても、 ユーザーフォームモジュールではMe.Label1とかLabel1とか書けますよね。 例えば、ユーザーフォームモジュールから呼び出すけれど、 専らSheet1を処理するような内容であれば、 Sub test()をSheet1モジュールに書いておいて、   Call Sheet1.test のように呼び出したりします。 いちいちSheets("Sheet1").Range("A1")などと書かなくても、 Sheet1モジュールではRange("A1")と書けますよね。 つまり、処理するクラス(対象)によって、 それぞれの処理対象のクラスに書く、という風に考えると判り易いかと思います。 VBAでは、標準モジュール以外のモジュールはすべて、 クラスを扱うモジュール(≒特定のオブジェクトを扱う為のモジュール)です。 多彩なオブジェクトを扱う処理なら基本的には標準モジュール、 複数のモジュールから呼び出して、同様の処理をするなら標準モジュール、 フォームコンントロール等への登録を含め、所謂マクロとして扱うなら標準モジュール、 みたいなことは言えますけれども、、、。 もう一つ、あちらこちらで目にするサンプルコードや質問掲示板で書かれた回答コード等では、 特に指示が無い限りは、標準モジュールでの動作を前提にしたコードです。 > vbaでフォームモジュール内に......サブプロシージャーを作るのはよくないですか? > そのフォームモジュールに関係のあるサブプロシージャーの場合です。 「よくない」と言われるようなものではないですから、そういう意味では安心してください。 どのモジュールに書くべきなのか、普段から意識しておいた方が好いとは思います。 以上、ご参考まで。

dwkxnhnrjsr
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

  • subプロシージャーは標準モジュールではなくフォームのコードを書く部分

    subプロシージャーは標準モジュールではなくフォームのコードを書く部分に書いても問題ないのでしょうか? エクセルにVBAでフォームを挿入し、 「Private Sub UserForm_Initialize()」 などのフォームのモジュールに、 Sub test() MsgBox "あああ" End Sub という標準モジュールに書くべきのsubプロシージャーを書いてもなにもエラーにならないし正常に動きます。 subプロシージャーは標準モジュールではなくフォームのコードを書く部分に書いても問題ないのでしょうか? それともエラーにならなくても標準モジュールに書いた方がいいですか?

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

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

  • 標準モジュールにpublicで宣言するしかない?

    フォームモジュールと標準モジュールで同じ変数を使って値を行き来したい場合、 標準モジュールにpublicで宣言するしかないのでしょうか? 【フォームモジュール】 Private Sub cmd_コマンド0_Click() test = "aaa" Call 標準モジュールtest End Sub 【標準モジュール】 Public test As String Sub 標準モジュールtest() MsgBox test End Sub でいいのですか?

  • フォームのイベントを標準モジュールから呼び出す

    フォームのイベントを標準モジュールから呼び出す事は出来ないのでしょうか? ちなみにアクセスです。 例えば、 Private Sub Form_Load() MsgBox "test" End Sub というのはフォームを開いたときにしか発生しないですよね。 でもフォームを開いている状態でForm_Loadと全く同じ事をしてほしい時は どうすればいいですか? 標準モジュールで Sub a() Call Form_フォーム1.Form_Load End Sub としてみましたが、メソッドまたはデータ メンバが見つかりません。 (Error 461)になりました。 MsgBox "test" だけなら、 Sub a() MsgBox "test" End Sub にすりゃいいじゃん!って思われがちですが、 実際はForm_Loadイベントにはたくさんのコードが書かれています。 標準モジュールからイベントの呼び出しを教えてください。

  • VBA 標準モジュールとフォーム

    ある標準モジュール内で生成した変数の値をフォームのコマンドボタンをクリックしたら表示されるプログラムはどうやってつくるのですか? 標準モジュール sub test() dim a as integer dim b as integer dim sum as string a=5 b=1 sum=a+b End sub フォームのコマンドボタンクリック Sub CommandButton1_Click() MsgBox sum End Sub 標準モジュールで計算した答えがフォームのコマンドボタンをクリックしたら答え6が表示されるようにしたいのですが、どうしたらできますか?

  • 同じマクロ名でも、違うモジュールならエラーにならな

    同じマクロ名でも、違うモジュールならエラーにならない? エクセルVBAについてご教授ください。 標準モジュールに ――――――――― Option Explicit Sub CommandButton1_Click() MsgBox "" End Sub Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― と同じマクロ名を2つ作ったら、コンパイルエラーになりますが、 上記のコードは一度消して、フォームモジュールに ――――――――― Private Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― を一つ作り、 標準モジュールに ――――――――― Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― を一つ作った場合は、エラーにならずにマクロを実行できました。 これは、フォームモジュールがPrivate Subだからでしょうか? フォームモジュールに1つ、 標準モジュールに1つ なら同じマクロ名を使っても、エラーにならないという事でしょうか? よろしくお願いします。

  • エクセル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です。 よろしくお願いいたします。

  • VB.netで標準モジュールからフォームを呼び出す

    お世話になります。 標準モジュールから以下のようにフォームを呼び出しているんですがうまく表示されません。 どこが悪いんですか? 標準モジュール内----------------------   Public Sub Main()     Dim frm1 As New Form1     frm1.Show()   End Sub

  • エクセルVBAユーザーフォームの変数の設定方法について

    すいません、エクセルVBAのユーザーフォームの変数の設定方法について質問があります。 1 ユーザーフォームを2つ用意する。 2 それぞれにComboBox1をおく。 3 立ち上げたユーザーフォームについて、UserForm_InitializeでComboBox1に"a"のAddItemを作る。 この、「立ち上げたフォームのComboBox1に"a"のAddItemを作る」 という作業を各々のユーザーフォームに記載するのではなく、標準モジュールでまとめて記載する方法で躓いています。 Public m As String Private Sub UserForm_Initialize() ’フォーム1を立ち上げた場合   m = "UserForm1"   Call Test1(m) End Sub Private Sub UserForm_Initialize() ’フォーム2を立ち上げた場合   m = "UserForm2"   Call Test1(m) End Sub ↓ 標準モジュールに記載 Sub Test1(m As String) VBA.UserForms.Add(m).ComboBox1.AddItem "a" End Sub これだとUserForm_InitializeとTest1の間で無限ループが始まってしまい、うまく進んでくれません。 ヘルプを見ましたが、Add(変数)でユーザーフォームを変数で指定できるということ以上のことは発見できず行き詰っています。  それぞれのフォームに書けばいいだけの話なのかもしれませんが、メンテを考えると出来ればまとめて記述しておきたいと考えています。 解決方法がありましたらどうぞよろしくご教示願います。

  • VBA 標準モジュールとフォーム (続き)

    先ほど、同じ質問タイトルで質問させていただいたものです。この場合どうなりますか? モジュールでの変数file_nameをフォームのボタンをクリックしたら"text.xls"が表示されるようにしたいです。 (イメージとしては、エクセルのsheet1にコマンドボタンがあってクリックするとフォームが立ち上がってフォームのコマンドボタンをクリックすると"test.xls"が表示される) モジュール Private Sub CommandButton1_Click() ←エクセルsheet1にボタンがある   dim file_name as string file_name="test.xls"   UserForm1.Show End Sub フォーム(UserForm1) Sub CommandButton1_Click() ←フォームにボタンがある MsgBox file_name End Sub

専門家に質問してみよう