Excel2000において、ワークシートイベント(セルのダブルクリックや右ボタンクリック時の対応を記述)を組み込んだブックをアドインとして読み込んで見たのですが、ワークシートイベントが起動しません。

ワークシートイベントをブックに一々記載するのは大変なので、ワークシートイベントを記載したブックをアドインとして登録しておき、他のブックからはそのアドインとして参照すれば良いように考えました。
何かうまい方法があれば、ご教示下さい。

回答の条件
  • 1人2回まで
  • 登録:2007/02/24 17:25:00
  • 終了:2007/02/25 19:41:04

回答(3件)

id:careplanner No.1

らいず回答回数338ベストアンサー獲得回数132007/02/25 00:51:55

ポイント27pt

イベントをシートではなく、ブックに設定してみてはいかがでしょう?

BOOKのイベント(BeforeDoubleClick,BeforeRightClick)

に設定すると、そのブック内であればどのシートでもマクロを実行することができます。

id:careplanner No.2

らいず回答回数338ベストアンサー獲得回数132007/02/25 09:01:34

ポイント27pt

ごめんなさい、もしかしたら勘違いしてました。

作成したVBAを「エクスポート」としてファイルで保存しておいて、それを新しいブックでは「インポート」すればよいと思いますが、どうでしょう?

「ファイル」のメニューから選択できますよ。

id:okehara

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

そのような事を個々のExcelブックでやりたくないのです。

2007/02/25 11:05:26
id:mj99 No.3

mj99回答回数138ベストアンサー獲得回数382007/02/25 01:22:28

ポイント100pt

アドインのマクロにイベントを記入しても、アドイン自身のイベントしか受け取れません。

他のブックのシートのイベントを受け取るにはWithEventsを使って少々複雑なマクロを書く必要があります。

----

0.

エクセルを起動して、Visual Basic Editorを開いてください。


1.

マクロにクラスモジュールを追加してください。

(VBエディタの画面でメニュー「挿入」にあります)


2.

追加したクラスモジュールのオブジェクト名(プロパティ)に

CEventCatch

と、入力してください。


3.

追加したクラスモジュールに以下のコードを記入してください。

ここに、ワークシートイベントを追加できます。

サンプルとして、右クリック時にメッセージを表示して、メニューが表示されないようにしてみました。

Option Explicit

Public WithEvents xWorksheet As Worksheet

Private Sub xWorksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    MsgBox "右クリック禁止にしてみた"
    Cancel = True
End Sub

4.

ThisWorkBookに以下のコードを記述してください。

新しいブックが開いた時や、シートが追加されたときにCEventCatchを生成して、イベントをキャッチできるようにしています。

Option Explicit

Private WithEvents xApp As Application
Private clEvents As New Collection

Private Sub addEventCatch(wb As Workbook, ws As Worksheet)
    ' 自分自身(アドイン自身)は追加しません
    If wb Is Me Then Exit Sub
    
    ' イベントキャッチClassを作成してリストに追加します。
    Dim ev As New CEventCatch
    Set ev.xWorksheet = ws
    clEvents.Add ev
End Sub

Private Sub Workbook_Open()
    ' アドイン起動時、Applicationオブジェクトのイベントをキャッチできるようにします。
    Set xApp = Me.Application
End Sub

Private Sub xApp_NewWorkbook(ByVal wb As Workbook)
    Dim sh As Worksheet
    ' 新規ブックが作成されました。すべてのシートをイベントキャッチリストに追加します
    For Each sh In wb.Worksheets
        Call addEventCatch(wb, sh)
    Next
End Sub

Private Sub xApp_WorkbookOpen(ByVal wb As Workbook)
    Dim sh As Worksheet
    ' 既存ブックがオープンされました。すべてのシートをイベントキャッチリストに追加します
    For Each sh In wb.Worksheets
        Call addEventCatch(wb, sh)
    Next
End Sub

Private Sub xApp_WorkbookNewSheet(ByVal wb As Workbook, ByVal sh As Object)
    ' どこかのブックに新しいシートが追加されました。イベントキャッチリストに追加します
    Call addEventCatch(wb, sh)
End Sub

5.

アドインとして保存して、アドインの追加を行ってください。

id:okehara

希望したことが出来ました。大変ありがとうございました。

クラスを利用したマクロは初めてですので、少々面食らっていますが、ロジックは何とか追いかけられました。非常にうまいロジックになっており感心しております。

クラスを利用したプログラミングについては勉強したいと思いますが、参考になるサイトや書籍等がありましたら教えて下さい。

2007/02/25 11:03:47

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません