我需要你的帮助,
在Excel VBA中是否可以为所有文本框和组合框的指定用户窗体应用某种类型的全局更改事件处理程序。我知道可以一对一地进行操作,但是如果您有20个左右的文本框,那么为每个用户窗体控件编写代码_change会太过头了吗?
从本质上讲,我希望在用户键入任何文本框或从组合框中选择任何新值并将按钮启用属性从false更改为true后启用“应用”按钮。
我在网上搜寻了东西,但是找不到符合我要求的解决方案。
任何帮助将不胜感激。很抱歉,我对这里的VBA知识水平不屑一顾。
答案 0 :(得分:3)
在Excel VBA中是否可以为所有文本框和组合框的指定用户窗体应用某种类型的全局更改事件处理程序。
由于事件处理程序如何连接到VBA中的事件源,答案为“否”。
但是...
在您的项目中添加一个新的类模块,将其命名为DynamicTextBox
(对于DynamicComboBox
,您可以使用另一个模块)。
Option Explicit
Private WithEvents encapsulated As MSForms.TextBox
Public Sub Initialize(ByVal ctrl As MSForms.TextBox)
Set encapsulated = ctrl
End Sub
Private Sub encapsulated_Change()
'handle textbox changed here
End Sub
现在,您的表单中有Collection
个DynamicTextBox
类实例-您要为每个要处理{的New
拥有一个TextBox
实例{1}}事件。
Change
请注意,这种将Option Explicit
Private handlers As VBA.Collection
Private Sub UserForm_Initialize()
Set handlers = New VBA.Collection
Dim ctrl As MSForms.Control
For Each ctrl In Me.Controls
If TypeOf ctrl Is MSForms.TextBox Then
Dim textBoxHandler As DynamicTextBox
Set textBoxHandler = New DynamicTextBox
textBoxHandler.Initialize ctrl
handlers.Add textBoxHandler
'ElseIf TypeOf ctrl Is MSForms.ComboBox Then
' Dim comboBoxHandler As DynamicComboBox
' Set comboBoxHandler = New DynamicComboBox
' comboBoxHandler.Initialize ctrl
' handlers.Add comboBoxHandler
End If
Next
End Sub
MSForms控件封装在类实例中的技术,也可以用于处理在运行时动态添加的控件的事件。
关键是将MSForms控件保持在范围内-这就是模块级WithEvents
的作用。
答案 1 :(得分:1)
这是一个非常主观的问题,因此没有一个正确的答案。我可以想到一个窍门,但是根据您的应用程序的功能,这可能是一个过大的杀伤力。概述以下步骤。
遍历窗体上的所有控件,并存储其文本 数组中的值。像
signalStream
.map[EventDetailsGroup, java.lang.Short]((_, v) => new KeyValue(extractEventDetailsGroup(v), Short.box(1)))
.groupByKey(Serialized.`with`(eventDetailsSerde, Serdes.Short()))
.windowedBy(TimeWindows.of(30 * 60 * 1000).advanceBy(60 * 1000))
.count(Materialized.as("store-name").withCachingDisabled().withLoggingDisabled())
使用事件,例如单击表单。还有其他可能 根据您的表单所做的工作。
每次单击都运行上述操作可能会增加程序负担,并可能会使您的应用程序变慢。因此,如果您的表格允许,请考虑其他选择。