人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Excel2000において、ワークシートイベント(セルのダブルクリックや右ボタンクリック時の対応を記述)を組み込んだブックをアドインとして読み込んで見たのですが、ワークシートイベントが起動しません。
ワークシートイベントをブックに一々記載するのは大変なので、ワークシートイベントを記載したブックをアドインとして登録しておき、他のブックからはそのアドインとして参照すれば良いように考えました。
何かうまい方法があれば、ご教示下さい。

●質問者: okehara
●カテゴリ:コンピュータ
✍キーワード:うまい イベント クリック セル ダブルクリック
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● らいず
●27ポイント

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

BOOKのイベント(BeforeDoubleClick,BeforeRightClick)

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


2 ● らいず
●27ポイント

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

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

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

◎質問者からの返答

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

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


3 ● mj99
●100ポイント

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

他のブックのシートのイベントを受け取るには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.

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

◎質問者からの返答

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ