【VBA】マクロでVBAコードを自動生成・編集する方法 (CodeModuleオブジェクト)

目次

はじめに

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開発そのものを効率化・自動化する、強力な開発支援マクロを作成することが可能になります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次