gpt4 book ai didi

VBA 事件仅引发一次(间歇性)

转载 作者:行者123 更新时间:2023-12-02 22:00:39 28 4
gpt4 key购买 nike

上下文

我的 VBA 代码经常替换工作簿中的工作表。因此,我无法直接在工作表模块中使用代码,因为它最终会在此过程中被删除。

我使用用户定义的类来处理我的事件(强烈受到 Chip Pearson's withevents article 的启发)

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

在阅读该主题时,我看到将您的对象链接到公共(public)集合(声明位于另一个模块中(普通模块 - 不是工作表模块,也不是类模块)。:Public Freebom_EventCollection As即使执行离开当前初始化函数的范围,Collection 也会使我的实例保持事件状态。

问题描述

在大多数情况下,我只会引发一个 ws_change 事件。之后,工作表的行为就像我的代码中没有事件处理程序一样。没有引发任何事情,而不仅仅是工作表事件。

我查看了 Application.EnableEvents,但在第一次运行后它始终设置为 True

此外,当我使用 Private Sub Worksheet_Change(ByVal Target As Range) 函数中的构建时,它运行良好。

对我来说,这可能与我使用一个类并且它在第一次运行后没有保持事件状态有关。但后来,我不知道我做错了什么。

预先感谢您在此事上花费的时间和提供的帮助。

最佳答案

您需要在普通模块(不是工作表模块,也不是类模块)中声明 Collection 的模块级公共(public)实例。您也可以将管理集合的代码也放在此处,并且只需从工作表模块的事件处理程序进行调用即可。每当删除工作表时,您可能需要重新初始化集合,因为这可能会触发重新编译并重置项目,从而终止您的对象。

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

关于VBA 事件仅引发一次(间歇性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19549053/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com