excel 从XLSM文件保存另一个工作簿时运行宏

lymgl2op  于 2023-03-04  发布在  其他
关注(0)|答案(1)|浏览(159)

大家好,我有一个小问题,我需要帮助。
我得到了一个名为**"vba.xlsm"**的xlsm文件,我已经在一个目录中设置为自动打开时,任何excel文件打开。这使用打开Excel的启动选项。

现在我需要运行一个代码对xlsm文件,当任何文件被保存。代码是在xlsm文件,让,并需要运行时,任何excel文件被打开和保存。
你知道我该怎么做吗?
澄清:
我有一个文件夹在我的本地驱动器"C:\xls",我有一个xlsm文件"vba.xlsm"。

    • 每次打开或创建**excel工作簿时,都会打开这个vba.xlsm。

在这个vba.xlsm中有一段代码,我需要在每次保存工作簿时执行。
有没有一种方法可以保证我在vba.xlsm中的代码在保存工作簿时运行?
我尝试过Workbook_BeforeSave和Workbook_AfterSave事件,但是只有在保存vba.xlsm时才会触发,而在保存其他工作簿时不会触发。
你知道我如何从我的vba.xlsm中检测另一个工作簿的保存事件吗?
@蒂姆·威廉姆斯

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "saveEvent"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Public WithEvents appevent As Application
Attribute appevent.VB_VarHelpID = -1
    
Private Sub appevent_WorkbookAfterSave(ByVal Wb As Workbook, ByVal Success As Boolean)
   MsgBox Wb.Name & "Saved"
End Sub

Private Sub appevent_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
   MsgBox Wb.Name & "Before Save"
End Sub

这是vba.xlsm的工作簿

Private Sub Workbook_Open()
  Dim objSaveEvent As New saveEvent
  Set objSaveEvent.appevent = Application
End Sub
w8f9ii69

w8f9ii691#

如果要捕获应用程序事件,但执行了以下操作:

Private Sub Workbook_Open()
  Dim objSaveEvent As New saveEvent      '<< your app event-capturing class
  Set objSaveEvent.appevent = Application
End Sub

...那么一旦Workbook_Open完成,您的objSaveEvent对象就会超出作用域并消失,因此不会截获任何事件。
你需要这样的东西...
在“vba.xlsm”的ThisWorkbook模块中:

Dim objSaveEvent As saveEvent 'global, for persistence

Private Sub Workbook_Open()
  Set objSaveEvent = New saveEvent 'populate Global object
  Set objSaveEvent.appevent = Application
End Sub

类模块saveEvent

Option Explicit

Public WithEvents appevent As Application
  
Private Sub appevent_WorkbookAfterSave(ByVal Wb As Workbook, _
                                       ByVal Success As Boolean)
   MsgBox Wb.Name & " Saved"
End Sub

Private Sub appevent_WorkbookBeforeSave(ByVal Wb As Workbook, _
                                        ByVal SaveAsUI As Boolean, _
                                        Cancel As Boolean)
   MsgBox Wb.Name & " Before Save"
End Sub

相关问题