【VBA】VBAを使用して、VBAコードを置換する

VBAから
 ・VBAコードを置換
できます!

PR

準備

VBAを使用してVBAコードを置換するには
 ・「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」にチェック
を入れておく必要があります。

「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」にチェック
「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」にチェック


以下の手順で設定画面を表示できます。

①[ファイル]→[その他]→[オプション]をクリックする。
②[トラスト センター]の「トラスト センターの設定」をクリックする。
③[マクロの設定]をクリックする。
④「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」にチェックを入れて「OK」をクリック
⑤「OK」をクリック

PR

VBAコード(置換対象のコード)

ここでは例として、
 ・デスクトップ配下のExcelファイル「sampleMacro.xlsm」の
 ・モジュール「testModule」に
 ・サブプロシージャ「sample」
を作成します。

置換対象のVBAのコードを作成するExcelファイル
置換対象のVBAのコードを作成するExcelファイル
'モジュール「testModule」のサブプロシージャ「sample」
Private Function sample()

    MsgBox "こんにちは!"
    
End Function
モジュール「testModule」のSubプロシージャ「sample」
モジュール「testModule」のサブプロシージャ「sample」
PR

VBAコード(置換を実施するコード)

ここでは例として、
 ・デスクトップ配下のExcelファイル「replaceMacro.xlsm」に
 ・置換対象のコードを置換するVBAコード
を作成します。

置換を実施するVBAのコードを作成するExcelファイル
置換を実施するVBAのコードを作成するExcelファイル


置換する文字列は以下とします。

置換:こんにちは!
置換:Hello!置換しました!

Option Explicit

Sub sample()
    
    Dim exceMacrolFilePath As String
    Dim wk As Workbook
    Dim codeModule As Object
    Dim targetModule As String
    Dim targetProc As String
    Dim srcStr As String
    Dim destStr As String
    Dim startLine As Long
    Dim lineCount As Long
    Dim i As Long
    
    'Excelファイル
    exceMacrolFilePath = "C:\Users\user\Desktop\sampleMacro.xlsm"
    '対象モジュール
    targetModule = "testModule"
    '対象プロシージャ
    targetProc = "sample"
    
    '置換前の文字列
    srcStr = "こんにちは!"
    '置換後の文字列
    destStr = "Hello!置換しました!"
    
    'Excelファイルを開く
    '・「リンクの更新する/しない」のメッセージを非表示
    '・「読み取り専用を推奨する/しない」のメッセージを非表示
    Set wk = Workbooks.Open(Filename:=exceMacrolFilePath, UpdateLinks:=0, IgnoreReadOnlyRecommended:=True)
    
    '対象モジュールを取得
    Set codeModule = wk.VBProject.VBComponents(targetModule).codeModule
    
    With codeModule
        '対象プロシージャの開始Lineと総Line数を取得。2つ目の引数の0はお約束
        startLine = .ProcBodyLine(targetProc, 0)
        lineCount = .ProcCountLines(targetProc, 0) - 2
        '対象プロシージャの中のコードに対して1行ずつ繰り返し
        For i = startLine To startLine + lineCount - 1
            '置換
            .ReplaceLine i, Replace(.Lines(i, 1), srcStr, destStr)
        Next i
    End With

    'Excelファイルを保存して閉じる
    wk.Close SaveChanges:=True

    '後片付け
    Set codeModule = Nothing
                                        
End Sub

以下を指定します(17~21行目)。

・置換対象の「Excelファイル」
・対象モジュール
・対象プロシージャ
※状況に合わせて変更してください。
※上記では先ほど作成した「デスクトップ配下のsampleMacro.xlsm」、「testModule」、「sample」と指定しています。

以下を指定します(24、26行目)。

・置換の文字列
・置換の文字列
※状況に合わせて変更してください。
※上記では「こんにちは
」、「Hello!置換しました!」と指定しています。

「Workbookオブジェクト」の「VBProject」プロパティにより、「VBProjectオブジェクト」を取得します(34行目)。

「VBProjectオブジェクト」と「VBComponentsコレクション」により、指定したモジュールを示す「codeModuleオブジェクト」を取得します(34行目)。

指定した「対象モジュール かつ 対象プロシージャ」のみに対して、置換します(36~45行目)。

PR

実行結果

VBAを使用して、VBAコードを置換できました。

実行
実行後
実行
PR

参考

上記で使用した以下の詳細は、公式サイトをご確認ください。

●「Workbookオブジェクト」の「VBProject」プロパティ


●「VBProjectオブジェクト」


●「VBComponentsコレクション」


●「codeModuleオブジェクト」