Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1058 / 13645 ツリー ←次へ | 前へ→

【76568】コマンドボタン こずえ 15/1/8(木) 10:12 質問[未読]
【76570】Re:コマンドボタン 独覚 15/1/8(木) 10:48 発言[未読]
【76571】Re:コマンドボタン こずえ 15/1/8(木) 11:26 質問[未読]
【76572】Re:コマンドボタン 独覚 15/1/8(木) 11:45 発言[未読]
【76573】Re:コマンドボタン こずえ 15/1/8(木) 13:27 お礼[未読]
【76574】Re:コマンドボタン ichinose 15/1/9(金) 6:42 発言[未読]

【76568】コマンドボタン
質問  こずえ  - 15/1/8(木) 10:12 -

引用なし
パスワード
   お世話になっています

フォームボタンは、標準モジュールで設定する事が出来ますが
コマンドボタンは、Sheetモジュールでしか設定できないのですか?

教えてください
宜しくお願いいたします。

【76570】Re:コマンドボタン
発言  独覚  - 15/1/8(木) 10:48 -

引用なし
パスワード
   ▼こずえ さん:
何をしたいのかが分からないので的外れかもしれませんが…

クリック時イベントをシートモジュールに必ず作成しなければならないですが、クリック時イベントで
標準モジュールに作成したマクロを呼び出すようにすると処理マクロ本体は標準モジュールに
作成できます。

【76571】Re:コマンドボタン
質問  こずえ  - 15/1/8(木) 11:26 -

引用なし
パスワード
   独覚さん 有難うございます。

>クリック時イベントをシートモジュールに必ず作成しなければならないですが、
>クリック時イベントで標準モジュールに作成したマクロを呼び出すようにすると
>処理マクロ本体は標準モジュールに作成できます。
独覚さんが仰ってる事は、なるべくシートモジュールに書いた方が良いと言う事ですね?
私は今まで、Sheet上にフォームボタンを設置。
モジュールは標準に書いてました。
標準モジュールとシートモジュールは、どう違うのですか?
Web検索して読んでも分かりませんでした。

【76572】Re:コマンドボタン
発言  独覚  - 15/1/8(木) 11:45 -

引用なし
パスワード
   ▼こずえ さん:

>独覚さんが仰ってる事は、なるべくシートモジュールに書いた方が良いと言う事ですね?
言葉足らずだったかな。

コマンドボタンでも処理本体は標準モジュールに作成することができる、という話です。

【76573】Re:コマンドボタン
お礼  こずえ  - 15/1/8(木) 13:27 -

引用なし
パスワード
   独覚さん

有難うございました。

【76574】Re:コマンドボタン
発言  ichinose  - 15/1/9(金) 6:42 -

引用なし
パスワード
   >フォームボタンは、標準モジュールで設定する事が出来ますが
>コマンドボタンは、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というオブジェクトに新たに独自のメソッドを追加することなのです。

こんな事実を踏まえて プログラムをどのように記述するかを悩んでみてください。

1058 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free