このワークブックから他のワークブックにコードを挿入し、一部のサブを Workbook_BeforeSave に実行します。ワークシートの内容を一元化されたワークブックに保存するには、これを行う必要があります。1 つの中央ワークブックと 100 のサテライトがあります。
挿入されたコマンドの 1 つは次のとおりです。
set workbooktostore = workbooks.open(storefile)
インジェクションの最後にワークブックを保存すると、このコマンドはまったく実行されません。ユーザーがサテライト ファイルから保存をクリックすると、この問題は発生しません。
ここに例があります:
Public sub Main
dim workbooktoinject as workbook
set workbooktoinject = workbooks.add
INSERTVBCODE(workbooktoinject)
workbooktoinject.saveas "C:\satellite1.xlsm", xlOpenXMLWorkbookMacroEnabled
End Sub
Private Sub INSERTVBCODE(WorkbookToUpdate As Workbook)
Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
Dim LineNum As Long
Set VBProj = WorkbookToUpdate.VBProject
Set VBComp = VBProj.VBComponents("ThisWorkbook")
Set CodeMod = VBComp.CodeModule
CodeMod.InsertLines LineNum, "Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)"
LineNum = LineNum + 1
CodeMod.InsertLines LineNum, " dim workbooktostore as workbook"
LineNum = LineNum + 1
CodeMod.InsertLines LineNum, " dim storefile as string"
LineNum = LineNum + 1
CodeMod.InsertLines LineNum, " storefile=""C:\storefile.xlsx"""
LineNum = LineNum + 1
CodeMod.InsertLines LineNum, " msgbox ""Test display"""
LineNum = LineNum + 1
CodeMod.InsertLines LineNum, " set workbooktostore = workbooks.open(storefile)"
LineNum = LineNum + 1
CodeMod.InsertLines LineNum, " msgbox workbooktostore.readonly"
LineNum = LineNum + 1
CodeMod.InsertLines LineNum, " workbooktostore.close"
LineNum = LineNum + 1
CodeMod.InsertLines LineNum, "end sub"
end sub
Main を実行すると、「テスト表示」を表示する 1 つのメッセージ ボックスが表示されます。しかし、staellite1.xlsm への保存をクリックすると、2 番目のメッセージ ボックスに "false" と表示されます。SaveAsが実行されたときに同じメッセージボックスを期待していました...