实施更改事件以检查文本框值的更改并启用“应用”按钮

时间:2018-11-02 17:09:46

标签: excel vba excel-vba

我需要你的帮助,

在Excel VBA中是否可以为所有文本框和组合框的指定用户窗体应用某种类型的全局更改事件处理程序。我知道可以一对一地进行操作,但是如果您有20个左右的文本框,那么为每个用户窗体控件编写代码_change会太过头了吗?

从本质上讲,我希望在用户键入任何文本框或从组合框中选择任何新值并将按钮启用属性从false更改为true后启用“应用”按钮。

我在网上搜寻了东西,但是找不到符合我要求的解决方案。

任何帮助将不胜感激。很抱歉,我对这里的VBA知识水平不屑一顾。

2 个答案:

答案 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

现在,您的表单中有CollectionDynamicTextBox类实例-您要为每个要处理{的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)

这是一个非常主观的问题,因此没有一个正确的答案。我可以想到一个窍门,但是根据您的应用程序的功能,这可能是一个过大的杀伤力。概述以下步骤。

  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())
    
  2. 使用事件,例如单击表单。还有其他可能     根据您的表单所做的工作。

  3. 在click事件中,使用数组检查每个控件的值以获取 更改。如果是,请启用“应用”按钮并更新阵列

每次单击都运行上述操作可能会增加程序负担,并可能会使您的应用程序变慢。因此,如果您的表格允许,请考虑其他选择。