はじめに
VBAの VBProject
オブジェクトを使うと、モジュールをエクスポートしたりインポートしたりできますが、さらに一歩進んで、モジュール内のコードそのものを、マクロを使って一行ずつ読み書きすることも可能です。
これを実現するのが CodeModule
オブジェクトです。CodeModule
オブジェクトのメソッドを使えば、コードの追加、挿入、置換、削除といった操作を自動化できます。
この記事では、CodeModule
オブジェクトの主要なメソッドを使い、VBAのコードをプログラムで自在に編集するという、非常に高度なテクニックを解説します。
【重要】事前準備
このマクロを実行するには、Excelのオプションで「VBAプロジェクト オブジェクト モデルへのアクセスを信頼する」を有効にする必要があります。
CodeModule
オブジェクトの主要メソッド
この例では、「TargetModule
」という名前の標準モジュールを操作対象とします。
1. コードを文字列として追加する (.AddFromString
)
モジュールの末尾に、指定した文字列を新しいコード行として追加します。
サンプルコード
' モジュールの最後にコードを追加する
Sub AddCodeToModule()
Dim codeToAdd As String
codeToAdd = vbCrLf & "' --- このコードはマクロによって追加されました ---"
' TargetModule の CodeModule オブジェクトを取得し、コードを追加
ThisWorkbook.VBProject.VBComponents("TargetModule").CodeModule.AddFromString codeToAdd
MsgBox "コードを追加しました。"
End Sub
2. 指定した行にコードを挿入する (.InsertLines
)
指定した行番号に、新しいコード行を挿入します。既存のコードは下にシフトします。
サンプルコード
' モジュールの2行目にコードを挿入する
Sub InsertCodeIntoModule()
Dim codeToInsert As String
codeToInsert = "' " & Date & " に更新"
' 2行目に文字列を挿入
ThisWorkbook.VBProject.VBComponents("TargetModule").CodeModule.InsertLines 2, codeToInsert
MsgBox "2行目にコードを挿入しました。"
End Sub
3. 指定した行のコードを置き換える (.ReplaceLine
)
指定した行番号のコードを、新しい文字列で完全に置き換えます。
サンプルコード
' モジュールの3行目を置き換える
Sub ReplaceLineInModule()
Dim codeToReplace As String
codeToReplace = " ' この行はマクロによって置き換えられました"
' 3行目の内容を置き換え
ThisWorkbook.VBProject.VBComponents("TargetModule").CodeModule.ReplaceLine 3, codeToReplace
MsgBox "3行目を置き換えました。"
End Sub
4. 指定した行を削除する (.DeleteLines
)
指定した行番号から、指定した行数分のコードを削除します。
サンプルコード
' モジュールの5行目から2行分を削除する
Sub DeleteLinesFromModule()
' 5行目から2行分を削除
ThisWorkbook.VBProject.VBComponents("TargetModule").CodeModule.DeleteLines 5, 2
MsgBox "5行目から2行を削除しました。"
End Sub
まとめ
今回は、CodeModule
オブジェクトを使って、VBAのコード自体をマクロで編集するという、非常に高度なメタプログラミングのテクニックを解説しました。
.AddFromString
: モジュールの末尾にコードを追加.InsertLines
: 指定行にコードを挿入.ReplaceLine
: 指定行のコードを置換.DeleteLines
: 指定行からコードを削除
これらのメソッドを組み合わせることで、例えば「定型的なマクロの雛形を自動生成するツール」や、「古いコードを一括で新しいコードに更新するリファクタリングツール」など、VBA開発そのものを効率化・自動化する、強力な開発支援マクロを作成することが可能になります。