1

このワークブックから他のワークブックにコードを挿入し、一部のサブを 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が実行されたときに同じメッセージボックスを期待していました...

4

0 に答える 0