Excel 2010 vba复制选择工作表,保存并关闭两个工作簿

Excel 2010 vba复制选择工作表,保存并关闭两个工作簿,vba,excel,Vba,Excel,我有一个创建3个日志的工作簿。在关闭之前,我需要将这三张工作表复制到新工作簿中,然后我需要两个工作簿保存并关闭它们。我已经了解了下面的代码,现在当我尝试运行模块时,它会弹出宏窗口,并且不会运行。我确实将其存储在此工作簿中。任何意见都将不胜感激 Mary Option Explicit Private Sub BeforeClose(Cancel As Boolean

我有一个创建3个日志的工作簿。在关闭之前,我需要将这三张工作表复制到新工作簿中,然后我需要两个工作簿保存并关闭它们。我已经了解了下面的代码,现在当我尝试运行模块时,它会弹出宏窗口,并且不会运行。我确实将其存储在此工作簿中。任何意见都将不胜感激

                                                                Mary

Option Explicit

Private Sub BeforeClose(Cancel As Boolean)

'Save worksheets to new workbook
    Dim strSaveName As String
    Dim DstFile As String 'destination File name
    Dim DataWorkbook As Workbook

'Unhide Worksheets
    Set DataWorkbook = ActiveWorkbook
    DataWorkbook.Sheets("Service Change Log").Visible = True
    DataWorkbook.Sheets("Transaction Log").Visible = True
    DataWorkbook.Sheets("Call Initiation Log").Visible = True

    ChDir "P:\CSR Rollback Tool\Test"
    strSaveName = Replace(Application.UserName, ",", "")


'Copy Sheets
    Sheets(Array("Service Change Log", "Transaction Log", "Call Initiation Log")).Copy

'Hide Worksheets
    Sheets("Service Change Log").Visible = False
    Sheets("Transaction Log").Visible = False
    Sheets("Call Initiation Log").Visible = False

'Close Worksheet
    MsgBox "P:\CSR Rollback Tool\" & strSaveName & Format(Now(), "yyyymmdd hh-mm") & ".xlsx"
    Application.DisplayAlerts = False
    DstFile = "P:\CSR Rollback Tool\test\" & strSaveName & Format(Now(), "yyyymmdd hh-mm") & ".xlsx"
    Workbooks(DstFile).Close SaveChanges:=True
    DataWorkbook.Close Save:=True

End Sub

新创建的工作簿将在以下时间后具有焦点:

'Copy Sheets
    Sheets(Array("Service Change Log", "Transaction Log", "Call Initiation Log")).Copy
因此:

'Hide Worksheets
    Sheets("Service Change Log").Visible = False
    Sheets("Transaction Log").Visible = False
    Sheets("Call Initiation Log").Visible = False
将尝试隐藏工作表,但您不能拥有一个没有可见工作表的工作簿*因此您只需要稍微重新调整代码,就可以了

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'Save worksheets to new workbook
    Dim strSaveName As String
    Dim DstFile As String 'destination File name
    Dim DataWorkbook As Workbook

'Unhide Worksheets
    Set DataWorkbook = ActiveWorkbook
    DataWorkbook.Sheets("Service Change Log").Visible = True
    DataWorkbook.Sheets("Transaction Log").Visible = True
    DataWorkbook.Sheets("Call Initiation Log").Visible = True

    ChDir "P:\CSR Rollback Tool\Test"
    strSaveName = Replace(Application.UserName, ",", "")


'Copy Sheets
    Sheets(Array("Service Change Log", "Transaction Log", "Call Initiation Log")).Copy

'Save new workbook
    MsgBox "P:\CSR Rollback Tool\" & strSaveName & Format(Now(), "yyyymmdd hh-mm") & ".xlsx"
    Application.DisplayAlerts = False
    DstFile = "P:\CSR Rollback Tool\test\" & strSaveName & Format(Now(), "yyyymmdd hh-mm") & ".xlsx"
    activeworkbook.saveas(DstFile)
    activeworkbook.close true

'Hide Worksheets in original workbook
    DataWorkbook.Sheets("Service Change Log").Visible = False
    DataWorkbook.Sheets("Transaction Log").Visible = False
    DataWorkbook.Sheets("Call Initiation Log").Visible = False

'Close Worksheet
    DataWorkbook.Close Save:=True

End Sub

首先尝试此操作,将事件处理程序名称更改为:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
而不是:

Private Sub BeforeClose(Cancel As Boolean)

jaybee,明白了,谢谢你,但是,当我尝试运行代码时,宏窗口弹出,我的宏不在列表中。如果我保存,窗口不会弹出,但是代码永远不会触发,因为它从来没有碰到我的断点。正如@Jacouh提到的,您需要为beforeClose事件使用适当的命名约定。上面已编辑。请尝试关闭工作簿。根据您的文字,我知道您正在按F5键查看宏是否工作。如果我这样做,我也会得到一个没有宏的空白宏窗口。但是如果我关闭工作簿,我的工作簿会按预期在关闭前启动。顺便说一句@jacouh是对的:您需要在关闭前在
前面添加
工作簿
,以便在工作簿关闭时具有子触发器。或者:如果您想在工作表打开的情况下测试代码,我想您可以注释掉
(取消为布尔值)
,然后使用F5进行测试。这是我的最后一个问题。现在它像冠军一样发射。非常感谢你的帮助!