【问题标题】:Add one function to many controls向多个控件添加一个功能
【发布时间】:2017-05-17 08:07:49
【问题描述】:

假设我有一个包含 5 行的用户表单。每行包含多个控件,例如:

<Text field> | <Text field> | <Combo box>

当任一行中的第一个控件/列(文本字段)的值发生更改时,我有一个要调用的函数。如果不创建五个单独的 _Change 函数(每行一个),这是否可能?

【问题讨论】:

  • 被调用的函数是否会影响特定的控件(例如您更改的控件,或者同一行中的控件),还是全局性的(例如将时间打印到一个特定的文本框中) ?
  • 它会影响特定的控件,但不会影响调用函数的控件。例如,它可能会影响摘要文本字段,显示第一列中所有值的总和(如果所有输入均为数字)。
  • kk。在SUM-Field 的特定情况下,您可以考虑将.ControlSource[Text0]+[Text1]+.... 添加到那个特定的 总和字段(手动或在控件上循环)。那么就不需要弄乱输入字段的事件了。对于需要 VBA 的更复杂的功能,请参阅下面的帖子。
  • 但是当其中一个控件(文本字段)发生更改时,是否有触发该特定字段的更新?也许是一种检查整个表单是否有任何变化的方法?

标签: vba excel controls


【解决方案1】:

有一种相当快速但不合理的肮脏方式将事件处理程序添加到多个控件中......

i) 使用Change 定义您要调用的函数。 Afaik 它必须是普通模块中的Public Function

ii) 使用调用您的函数的RunCode-Event 创建一个 Access-makro(不是 VBA)。

iii) 将事件添加到您的控件中,无论是在您的设计视图中还是通过类似的方式

Private Sub Form_Current()
    Dim ctl
    For Each ctl In Me.Controls
        With ctl
            If .ControlType = acTextBox Then
                .OnChange = "Makro1"
            End If
        End With
    Next ctl        
End Sub

注意:

  • 上面的代码将事件添加到所有文本框(由于我很懒)。将If .ControlType = acTextBox Then 换掉以查看您的喜好。你可以使用标签、智能标签、tbx_c1r1 等简单的命名约定或控制数组,如果你喜欢的话

  • 如果您的函数以某种方式包含Caller,这将变得相当困难。确保发布您的功能,也许我们可以想办法。

希望这会有所帮助!如果有人提出更聪明的方法,我会很高兴。

【讨论】:

  • 感谢您的建议。虽然很脏(如你所说),但它实际上可以解决我的问题。我宁愿不必使用 Access(但也许我必须)。
  • 非常抱歉,我不知何故错过了您获得 excel,但无法访问!
  • 不用担心。如果您有兴趣,我在这里找到了一个可能的解决方案:stackoverflow.com/questions/5940596/… - 尽管我正在努力使其与_Exit() 一起工作,而不仅仅是_Change()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
相关资源
最近更新 更多