hakeの日記

Windows環境でプログラミングの勉強をしています。

EXCEL VBAメモ - xlsmファイル中のマクロの書き換え

マクロ入りの雛形ファイルをコピーして作成されたExcelファイルが多数ある場合の一括マクロ更新などに使用。


基本的に更新対象ファイルの対象モジュールの内容を一括削除して、予め更新マクロ用Excelファイルに用意した、同名のモジュールの内容をそのままコピーさせるのがわかり易いかな。

事前設定

更新用マクロを動作させるExcelで以下の設定を行う
ファイル
→オプション
→セキュリティセンター
→セキュリティセンターの設定
→マクロの設定
VBAプロジェクトオブジェクトモデルへのアクセスを信頼する。にチェック

各機能用のプロシージャ

コードモジュールの行数表示

Private Sub コードモジュールの行数表示()
    Dim cnt As Long
    cnt = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.CountOfLines
    MsgBox "Module1の行数 " & cnt
    
    cnt = ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule.CountOfLines
    MsgBox "Sheet1の行数 " & cnt
End Sub

ThisWorkbookの全行を削除

Private Sub ThisWorkbook全行削除()
    Dim cnt As Long
    With ThisWorkbook.VBProject.VBComponents("ThisWorkbook")
        cnt = .CodeModule.CountOfLines
        .CodeModule.DeleteLines 1, cnt
    End With
End Sub

Sheetモジュールの全行を削除

Private Sub シートモジュール全行削除()
    Dim cnt As Long
    With ThisWorkbook.VBProject.VBComponents("Sheet1") ' "Sheet1"はオブジェクト名であり、Nameプロパティの値ではない
        cnt = .CodeModule.CountOfLines
        .CodeModule.DeleteLines 1, cnt
    End With
End Sub

Module1の全行を削除

Private Sub コードモジュール全行削除()
    Dim cnt As Long
    cnt = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.CountOfLines
    ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.DeleteLines 1, cnt
End Sub

Module3の全行をModule1へコピー

Sub コードモジュールを別モジュールへコピー()
    Dim Code As String
    With ThisWorkbook.VBProject.VBComponents("Module3").CodeModule
        Code = .Lines(1, .CountOfLines)
    End With
    With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        .AddFromString Code
    End With
End Sub

Module1の全行をTarget.xlsmのModule1へコピー

Sub コードモジュールを別ブックへコピー()
    Dim decLine As Long
    Dim allLine As Long
    
    Dim Code As String
    Dim wb As Workbook
    
    Set wb = Workbooks.Open("C:\Users\〇〇\Target.xlsm")
    
    With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        allLine = .CountOfLines              ' 全行数
        decLine = .CountOfDeclarationLines   ' 宣言部行数
    
        ' 宣言部以外のコードをコピー
        Code = .Lines(decLine + 1, allLine - decLine)
    End With
    With wb.VBProject.VBComponents("Module1").CodeModule
        .AddFromString Code
    End With

    wb.Save
    wb.Close
End Sub

Module1を解放

Private Sub コードモジュール解放()
    With ThisWorkbook.VBProject
        .VBComponents.Remove .VBComponents("Module1")
    End With
End Sub

Module1をインポート

Private Sub コードモジュールインポート()
    With ThisWorkbook.VBProject
        .VBComponents.Import ThisWorkbook.Path & "\Module1.bas"
    End With
End Sub

標準Moduleを追加(Module名は自動でModule xになる)

Private Sub 標準モジュール追加()
    With ThisWorkbook.VBProject
        .VBComponents.add vbext_ct_StdModule
    End With
End Sub

標準Moduleをリストアップ

Private Sub 標準モジュール数表示()
    Dim cnt As Long, i As Long
    Dim msg As String


    With ThisWorkbook.VBProject
        msg = "全モジュールの個数:" & .VBComponents.Count & vbNewLine
        cnt = 0
        For i = 1 To .VBComponents.Count
            If .VBComponents(i).Type = vbext_ct_StdModule Then
                cnt = cnt + 1
                msg = msg & .VBComponents(i).Name & vbNewLine
            End If
        Next
        msg = msg & "標準モジュールの個数:" & cnt
    End With
    MsgBox msg
End Sub