動的にプロシージャやイベントコードを追加する場面は、そんなに多くはないと思います。 例えば、時間に応じてや操作者の違いでイベント発生の有無を変えるなどがありますが、他の方法でもできそうです。 こんなこともできるということを覚えておくぐらいでいいかと思います。 コードを追加するには、CodeModuleオブジェクトのInsertLinesメソッドを使用します。 構文 Workbook.VBProject.VBComponents.Item("シート名").CodeModule.InsertLines 行数,コード Excel2002の場合、下記の設定にしないとエラーになります。 他のバージョンでは未確認です。 (注意:この設定の場合、ウイルスに感染しやすくなります。使わない時は設定を元に戻して下さい。)
動的処理関連の「コマンドボタンを動的に作成・削除」を掲載しています参照してください。 |
Sheet2に「Worksheet_Change」イベントを追加し、イベントが発生するとメッセージを表示します。
Private Sub CommandButton1_Click()
'事前に標準モジュール「Sheet2」を作成しておいてください。
With ThisWorkbook.VBProject.VBComponents.Item("Sheet2").CodeModule
.InsertLines 1, "Private Sub Worksheet_Change(ByVal Target As Range)"
.InsertLines 2, " MsgBox ""Worksheet_Changeイベントが発生しました"""
.InsertLines 3, "End Sub"
End With
End Sub
ThisWorkbookに「Workbook_SheetChange」イベントを追加し、イベントが発生するとメッセージを表示します。
Private Sub CommandButton2_Click()
With ThisWorkbook.VBProject.VBComponents.Item("ThisWorkbook").CodeModule
.InsertLines 1, "Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)"
.InsertLines 2, " MsgBox ""Workbook_SheetChangeイベントが発生しました"""
.InsertLines 3, "End Sub"
End With
End Sub
Module1に「ExTest」プロシージャを追加、コマンドボタンがクリックされると追加したメッセージを表示します。
Private Sub CommandButton3_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'事前に標準モジュール「Module1」を作成しておいてください。
With ThisWorkbook.VBProject.VBComponents.Item("Module1").CodeModule
.InsertLines 1, "Public Sub ExTest()"
.InsertLines 2, " MsgBox ""ExTestが呼び出されました"""
.InsertLines 3, "End Sub"
End With
End Sub
Private Sub CommandButton3_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Call ExTest
End Sub
Module1に追加したコードの実行結果
■■■
このサイトの内容を利用して発生した、いかなる問題にも一切責任は負いませんのでご了承下さい
■■■
当ホームページに掲載されているあらゆる内容の無許可転載・転用を禁止します