マクロ入りの雛形ファイルをコピーして作成された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