语境
我的 VBA 代码经常替换工作簿中的工作表。因此我不能直接在工作表模块中使用代码,因为它最终会在这个过程中被删除。
我使用用户定义的类来处理我的事件(强烈灵感来自Chip Pearson 的 withevents 文章)
Public WithEvents ws As Worksheet
Private Sub ws_Activate()
If ActiveSheet.Name = FREEBOM_SHEET_NAME Then
Call FREEBOM_Worksheet_Activate_Handler
End If 'ActiveSheet.Name = FREEBOM_SHEET_NAME
End Sub
Private Sub ws_Change(ByVal Target As Range)
'MsgBox Target.Parent.Name
If Target.Parent.Name = FREEBOM_SHEET_NAME Then
Call FREEBOM_Worksheet_Change_Handler(Target)
End If 'Target.Parent.Name = FREEBOM_SHEET_NAME
If Target.Parent.Name = BOM_SHEET_NAME Then
Call BOM_Worksheet_Change_Handler(Target)
End If 'Target.Parent.Name = BOM_SHEET_NAME
End Sub
打开工作簿时正在实例化该类。
Private Sub Workbook_Open()
Dim WSObj_FreeBOM As FreeBOM_CWorkSheetEventHandler
Dim WSObj_BOM As FreeBOM_CWorkSheetEventHandler
If Freebom_EventCollection Is Nothing Then
Set Freebom_EventCollection = New Collection
End If
Set WSObj_FreeBOM = New FreeBOM_CWorkSheetEventHandler
Set WSObj_FreeBOM.ws = Sheets(FREEBOM_SHEET_NAME)
Set WSObj_BOM = New FreeBOM_CWorkSheetEventHandler
Set WSObj_BOM.ws = Sheets(BOM_SHEET_NAME)
Freebom_EventCollection.Add Item:=WSObj_FreeBOM, Key:=Sheets(FREEBOM_SHEET_NAME).Name
Freebom_EventCollection.Add Item:=WSObj_BOM, Key:=Sheets(BOM_SHEET_NAME).Name
End Sub
在我阅读该主题的过程中,我看到将您的对象链接到公共集合(声明在另一个模块中(一个普通模块 - 不是 Worksheet 模块而不是 Class 模块)。:Public Freebom_EventCollection As Collection
即使执行也会使我的实例保持活动状态离开当前初始化函数的范围。
问题描述
在大多数情况下,我只会引发一个 ws_change 事件。之后,工作表的行为就好像我的代码中没有事件处理程序一样。什么都没有提出,不仅仅是工作表事件。
我看过,Application.EnableEvents
但它总是设置为True
第一次运行后。
此外,当我使用内置Private Sub Worksheet_Change(ByVal Target As Range)
功能时,它运行良好。
对我来说,这可能与我使用一个类并且在第一次运行后它没有活着的事实有关。但是,我不知道我做错了什么。
提前感谢您在这件事上的时间和帮助。