ここから本文です

クラスモジュールに書いたのと似たようなコードをThisWorkbookに書いて同じ結果が...

fz4********さん

2016/10/300:13:07

クラスモジュールに書いたのと似たようなコードをThisWorkbookに書いて同じ結果がでるのですが仕組みはどうちがうのですか?

クラスモジュールの書き方を調べていたら似たようなコードをThisworkbookに書いて同じ結果が出る例を見つけて混乱しています。
①*****************************
---Class Module---
Public WithEvents Appl As Application

Private Sub Appl_SheetActivate(ByVal Sht As Object)
MsgBox Sht.Name 'シートがアクティブになったときシート名を表示
End Sub

---ThisWorkbook---
Dim Cls As New Class1

Private Sub Workbook_Open()
Set Cls.Appl = Application
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Set Cls = Nothing
End Sub

②*****************************
---ThisWorkbook---
Private WithEvents Appl As Application

Private Sub Workbook_Open()
Set Appl = Application
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Set Cls = Nothing
End Sub

Private Sub Appl_SheetActivate(ByVal Sht As Object)
MsgBox Sht.Name 'シートがアクティブになったときシート名を表示
End Sub

閲覧数:
109
回答数:
2
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

som********さん

2016/10/305:00:24

WithEventsキーワードは、クラスモジュールでしか使えませんが…。

以下VBAのヘルプから抜粋

クラス モジュール内でのみ有効です。キーワード WithEvents を使用して任意の数の変数を個別に宣言できます。ただし、配列は作成できません。また、キーワード New はキーワード WithEvents と共には使用できません。



①も②も同じブックに作り込んでいませんか?

②だけだったら、Set Cls = Nothingでエラーになるはずです。

  • som********さん

    2016/10/309:06:16

    >クラス モジュール内でのみ有効
    厳密にいうと、標準モジュールには使えないということでしょうか。

    ネットで探すと、同様の使い方を書いた記事がありました。
    移植性を考えると、いい使い方ではありません。

    まずイベントの違いから。

    ブックモジュールでオブジェクトボックスからWorkbookを指定すると
    そのブックのイベントプロシージャをプロシージャボックスから選択して記述できます。
    この場合は、自分のブックのイベントしか拾えません。
    ところが、WithEventsでアプリケーションレベルのイベントが拾えると
    他のブックのイベントも拾うことができます。

    これが一番の違いです。

  • その他の返信(2件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

ina********さん

2016/10/310:47:50

>クラスモジュールに書いたのと似たようなコードをThisWorkbookに書いて同じ結果がでるのですが仕組みはどうちがうのですか

簡単に言って、ThisWorkbookモジュールもSheet1などの
シートモジュールもUserFormなどのフォームモジュール
もクラスモジュールの一種なので同じようなイベント補足
のプログラムが書けるという事です。

汎用的なコードを書こうと思うのであれば、一般的な
いわゆるクラスモジュール(Class1など、但し実際
に作る時はオブジェクト名はユニークな名前に変更すべき)
を使います。

今回の例のように、Applicationレベルのイベントで、
他のブックのイベント処理をする場合は、わざわざ一般の
クラスモジュールを使わなくても②の方でも構わないと
思います。その方がコード全体としてシンプルになると
思いますので。

なお、②の方は、

Set Cls = Nothing

は間違いで、

Set Appl = Nothing

です。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる