Excel VBAで動的にプロシージャやイベントコードを追加する方法

その時の状況に応じて、VBAで必要なVBAを追加する方法です。




Homeに戻る > Excel プログラムのTipsへ

動的にプロシージャやイベントコードを追加する場面は、そんなに多くはないと思います。

例えば、時間に応じてや操作者の違いでイベント発生の有無を変えるなどがありますが、他の方法でもできそうです。

こんなこともできるということを覚えておくぐらいでいいかと思います。

コードを追加するには、CodeModuleオブジェクトのInsertLinesメソッドを使用します。

構文

Workbook.VBProject.VBComponents.Item("シート名").CodeModule.InsertLines 行数,コード


Excel2002の場合、下記の設定にしないとエラーになります。

他のバージョンでは未確認です。

(注意:この設定の場合、ウイルスに感染しやすくなります。使わない時は設定を元に戻して下さい。)

  1. メニュー[ツール] - [マクロ] - [セキュリティ] をクリック
  2. [セキュリティ] ダイアログ ボックスの [信頼のおける発行元] タブをクリック
  3. [Visual Basic プロジェクトへのアクセスを信頼する] チェック ボックスをオンにします。

動的処理関連の「コマンドボタンを動的に作成・削除」を掲載しています参照してください。




動的にプロシージャやイベントコードを追加するVBA

Excel実行画面

Excel実行画面

Excelコマンドボタン 「Sheet2にコードを追加」をクリック

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


[実行結果]
シート変更時のイベント

Excelコマンドボタン 「ThisWorkbookにコードを追加」をクリック

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


[実行結果]
ブック変更時のイベント

Excelコマンドボタン 「Module1にコードを追加」をクリック

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に追加したコードの実行結果

標準モジュールに追加した結果

Homeに戻る > Excel プログラムのTipsへ

■■■
このサイトの内容を利用して発生した、いかなる問題にも一切責任は負いませんのでご了承下さい
■■■
当ホームページに掲載されているあらゆる内容の無許可転載・転用を禁止します


Copyright (c) Excel-Excel ! All rights reserved