|
>フォームボタンは、標準モジュールで設定する事が出来ますが
>コマンドボタンは、Sheetモジュールでしか設定できないのですか?
フォームのボタンとActiveXControlのコマンドボタンとは
ボタン(コマンドボタン)とプロシジャーとの関連付けのしくみが違います。
フォームのボタンは、対象いシートに貼り付けた時点では、実行するプログラムが何なのかは、決まっていません。
ボタン作成後に、クリック時にどのプログラムを実行するかを定義します。
所謂、ボタンと実行するプログラムを関連付け、リンクですね!!
リンクするプログラムは、標準モジュール、シートモジュール
ThisWorkBookのモジュールにあるプロシジャーで OKです。
対して、
ActiveXControlのコマンドボタンは、これにユーザーが施した操作(イベント)によって
記述するプロシジャー(プロシジャー名や呼び出し形式等)が決まっています。
これは、コマンドボタンが最初から用意しています。
例えば、
Commanbutton1をクリックした時のプロシジャー名は
Private Sub CommandButton1_Click()
と コマンドボタン名(又は、変数名)_Click というプロシジャー名前になります。
ユーザーが施した操作(イベント)は、そのオブジェクトによって、規定されます。
コマンドボタンには、他にもコマンドボタン上をマウスが通過した時に発生する
Moveというイベントがあります。そのイベントをきっかけに動作するプログラムは
Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
End Sub
このような手続きで規定されるプロシジャー内に記述します。
これらは、オブジェクトによって違いますが、いずれにせよ そのオブジェクトが
用意しているものなのです。
これらのオブジェクトが用意しているイベントプロシジャーは、
オブジェクトモジュールと呼ばれるモジュールにしか記述はできません。
コマンドボタンを貼り付けたシートのモジュールだと簡単に
Private Sub CommandButton1_Click()
msgbox "ok"
end sub
という記述でクリック時のプログラムが実行できますが、
ちょっとしたコードを記述することによって、コマンドボタンを貼り付けた対象シートではない別のシートのモジュールやThisWorkBookのモジュール、ユーザーフォームのモジュール、クラスモジュール等のオブジェクトモジュールには、記述することができます。
しかし、標準モジュールには、直接記述することはできません。
これが
>コマンドボタンは、Sheetモジュールでしか設定できないのですか?
に対する私の意見です。
>標準モジュールとシートモジュールは、どう違うのですか?
記述したように イベントプロシジャーが記述できないのが標準モジュールで
記述できるのがシートモジュール(オブジェクトモジュール)、
これも違いの一つですよね!!
私は、標準モジュールはなるべく使わない方向でプログラムを作成していますが、
標準モジュールには、
そのブック全体で使うような汎用的な機能を有するプロシジャーを記述します。
シートモジュールには、その対象シートに深く関わりのある処理をするプロシジャーを
記述するようにしています。
ですから、対象シートに配置したコマンドボタンをクリックしたときのプロシジャー
CommandButton1_Click
は、きっと対象シートに深く関わりのある内容なのだと解釈されて、
シートモジュールに記述できるようになっているのではないですか?
どのモジュールに記述するかの判断は、難しいです、私もVBAを始めて10年を超えますが、未だに迷うときが沢山あります。これは、経験が必要だと思います。
以下の記述をその判断のひとつの参考例として、読んだり、操作してみてください。
新規ブック(Sheet1というシート名がある)にて、
Sheet1のモジュールに
Option Explicit
Sub disp_a1()
MsgBox Range("a1").Value
End Sub
標準モジュールに以下のコードでですが、以下はコピーせずにご自分で
キーボードで打ち込んでみてください。
Sub test()
Dim sht1 As Sheet1
Set sht1 = Worksheets("sheet1")
sht1.Range("a1").Value = "ichinose"
sht1.disp_a1
Set sht1 = Nothing
End Sub
sht1. と打ち込んだ時点で Sheet1のプロパティやメソッドの一覧が表示されますが、
その中に disp_a1 も含まれていることを確認してください。
シートモジュールにプロシジャーを記述するという事は、既成のSheet1というオブジェクトに新たに独自のメソッドを追加することなのです。
こんな事実を踏まえて プログラムをどのように記述するかを悩んでみてください。
|
|