【发布时间】:2018-03-12 05:24:55
【问题描述】:
我是 VBA 的新手,想知道是否有任何方法可以检查 UserForm controls 是否已更改?也许所有控件都有一些全局事件处理程序?
例如,我有一个带有一些数据的UserForm1,上面有Controls。还有某种全局布尔值B_bool,默认为False。
如果用户更改任何文本或单击任何单选按钮,或选中任何复选框 B_bool 变为 True。
我尝试为每种类型的控件创建某种事件处理程序和一个 Classmodule,但只有 textbox 和 optionbuttons 类可以正常工作。其他类(复选框、组合框)对 OnChange 事件发誓(对象或类不支持该组事件)
对于每种类型的控件,以下代码基本相同,所以我认为没有理由提出问题
Private WithEvents MyTextBox As MSForms.TextBox
Public Property Set Control(tb As MSForms.TextBox)
Set MyTextBox = tb
End Property
Private Sub MyTextBox_Change()
B_bool = True
End Sub
然后是用户窗体代码
Public tbCollection As Collection
Private Sub Userform_Initialize()
Set tbCollection = New Collection
For Each ctrl In Me.Controls
If TypeOf ctrl Is MSForms.TextBox Then
Set obj_tb = New clsTextBox
Set obj_tb.Control = ctrl
tbCollection.Add obj_tb
End If
Next ctrl
End Sub
【问题讨论】:
-
您希望控件以何种方式改变?您是指单独的 values 吗?您是否只想要一个整体
TRUE/FALSE表示“发生了一些变化”或更具体? -
是的,只有一件事是真或假,没有别的。所有控件的一个全局变量。我想创建类似“文档已更改。您要保存更改吗?”之类的内容。使用我的数据的用户表单
-
啊哈——这改变了一切。您的问题有一个常见的错误,称为XY Problem - 询问您尝试的解决方案,而不是实际的问题。我很高兴你在我浪费时间编写不必要的代码之前澄清了......我不会深入讨论它的语义——简短的版本是:Excel 已经跟踪工作表是否有未保存的更改,所以你可以“问 Excel 。”现在,它是否有任何理由必须仅查看您的用户表单,或者如果它告诉您工作簿中的任何内容是否发生变化,是否可以?
-
很抱歉
-
对于一个复选框,它是一个点击事件。看看我的这个帖子:yoursumbuddy.com/userform-event-class-multiple-control-types