3

语境

我的 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)功能时,它运行良好。

对我来说,这可能与我使用一个类并且在第一次运行后它没有活着的事实有关。但是,我不知道我做错了什么。

提前感谢您在这件事上的时间和帮助。

4

1 回答 1

1

您需要在普通模块(不是 Worksheet 模块也不是 Class 模块)中声明 Collection 的模块级 Public 实例。您也可以将用于管理集合的代码放在那里,并简单地从工作表模块的事件处理程序中调用。每当您删除工作表时,您可能需要重新初始化集合,因为这可能会触发重新编译并重置您的项目,这将终止您的对象。

在标准模块中拥有集合后,您可以通过添加手表来监控其生命周期(VBE 中的 SHIFT-F9)。然后,您可以准确跟踪正在发生的事情。

于 2013-10-24T17:08:06.613 回答