Excel VBA質問箱 IV

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

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


4584 / 13646 ツリー ←次へ | 前へ→

【55803】Worksheet のクラス化について ani 08/5/20(火) 10:04 質問[未読]
【55804】Re:Worksheet のクラス化について ハチ 08/5/20(火) 10:32 回答[未読]
【55808】Re:Worksheet のクラス化について ani 08/5/20(火) 11:03 発言[未読]
【55810】Re:Worksheet のクラス化について ハチ 08/5/20(火) 11:18 発言[未読]
【55822】Re:Worksheet のクラス化について ani 08/5/20(火) 16:40 お礼[未読]

【55803】Worksheet のクラス化について
質問  ani  - 08/5/20(火) 10:04 -

引用なし
パスワード
   こんにちは。

Excel の Worksheet をクラス化したいと思い、いろいろと調べてみたのですがどうしても分かりません。
そもそも実現不可なのかも知れませんが、ご存知の方がみえましたらご教示いただきたく思います。

具体的にやりたいことは以下の通りです。

・コマンドボタンのクリックイベントが存在する Worksheet を複数コピーして
各 Worksheet で同一の処理(各 Worksheet 内で閉じた処理)を行いたい
・コマンドボタンは Worksheet に配置し、クリックイベントは独自のもの(Worksheet クラス標準のイベントでない)
・各 Worksheet にそれぞれ同じ処理を記述したくない(クラス内でイベントをまとめて記述)

<環境>
Windows XP SP2, Excel 2003 SP3

【55804】Re:Worksheet のクラス化について
回答  ハチ  - 08/5/20(火) 10:32 -

引用なし
パスワード
   ▼ani さん:

>・コマンドボタンは Worksheet に配置し、クリックイベントは独自のもの(Worksheet クラス標準のイベントでない)

ここの意味がわかりませんでした。
Worksheetモジュールでのイベント定義は使用しない ということですか?


コマンドボタンのコントロール名が各Worksheetで同じであれば、
WorkSheet全体をクラス化しなくてもできます。

'ThisWorkbookモジュール
Option Explicit

Private WithEvents CmdBtn As CommandButton

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
  On Error Resume Next
    Set CmdBtn = ActiveSheet.CommandButton1
  On Error GoTo 0
End Sub

Private Sub CmdBtn_Click()
  MsgBox "クリック!"
End Sub

【55808】Re:Worksheet のクラス化について
発言  ani  - 08/5/20(火) 11:03 -

引用なし
パスワード
   ▼ハチ さん:
レスありがとうございます。

説明が分かりにくくて申し訳ありません。

>>・コマンドボタンは Worksheet に配置し、クリックイベントは独自のもの(Worksheet クラス標準のイベントでない)
>
>ここの意味がわかりませんでした。
>Worksheetモジュールでのイベント定義は使用しない ということですか?
独自のものというのは例えば「Worksheet_SelectionChange」などの Worksheet のイベントではなく、
「CmdBtn_Click」などの Worksheet クラス以外のイベントという意味です。
Worksheet モジュールでのイベント定義は使用はしますが、(重複するコード等を)極力減らしたいと思っています。

>コマンドボタンのコントロール名が各Worksheetで同じであれば、
>WorkSheet全体をクラス化しなくてもできます。
>
>'ThisWorkbookモジュール
>Option Explicit
>
>Private WithEvents CmdBtn As CommandButton
>
>Private Sub Workbook_SheetActivate(ByVal Sh As Object)
>  On Error Resume Next
>    Set CmdBtn = ActiveSheet.CommandButton1
>  On Error GoTo 0
>End Sub
>
>Private Sub CmdBtn_Click()
>  MsgBox "クリック!"
>End Sub
なるほど。
こういった書き方ができるのですね。
ちなみに「WorkSheet全体をクラス化しない」とは
各 WorkSheet 内でもイベント等を記述できるという解釈でいいでしょうか?
(上記処理はクラス化されている)

【55810】Re:Worksheet のクラス化について
発言  ハチ  - 08/5/20(火) 11:18 -

引用なし
パスワード
   ▼ani さん:

>ちなみに「WorkSheet全体をクラス化しない」とは
>各 WorkSheet 内でもイベント等を記述できるという解釈でいいでしょうか?
>(上記処理はクラス化されている)

やってみるとわかりますよ^^
自ら手を動かすことが大切です。
イベント処理の優先順位は、確認してみてください。

今回のコードでいくと「Worksheetをクラス化している」というよりも、
「コマンドボタンのイベントをクラス化している」ということだと思います
(あってますかね?自信が無くなってきました・・)

【55822】Re:Worksheet のクラス化について
お礼  ani  - 08/5/20(火) 16:40 -

引用なし
パスワード
   ▼ハチ さん:
レスありがとうございます。

>今回のコードでいくと「Worksheetをクラス化している」というよりも、
>「コマンドボタンのイベントをクラス化している」ということだと思います
>(あってますかね?自信が無くなってきました・・)
大変よくわかりました。
どうもありがとうございました。

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