EXCEL VBAメモ - xlsmファイル中のマクロの書き換え
マクロ入りの雛形ファイルをコピーして作成されたExcelファイルが多数ある場合の一括マクロ更新などに使用。
- 参考サイト:VBAでVBEを操作する
基本的に更新対象ファイルの対象モジュールの内容を一括削除して、予め更新マクロ用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