【问题标题】:VBA-excel: How to check if any of controls were changedVBA-excel:如何检查是否更改了任何控件
【发布时间】: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

标签: vba excel


【解决方案1】:

您可以通过以下方式检测工作簿是否有未保存的更改:

ActiveWorkbook.Saved

如何使用它的示例:

'Here is the code where your userform is prepared for the user...
'maybe you set default values or something like that.  Once you're
'finished the changes YOU (or your VBA) are making to the workbook,
'SAVE it.  This will mark a "starting point" to watch for changes...

 ActiveWorkbook.Save

'And here would be your code (if any) that runs when the user is doing
'he does.  blah blah blah
'When it's time to check if the user made any changes, find out with:

If ActiveWorkbook.Saved then
    'no changes have been made
Else
    'changes have been made
    'do whatever you need to do to save your data.
End If

请参阅下面的链接以了解 AutoSave 可能会或可能不会影响此功能。


更多信息:

【讨论】:

  • 这如何应用于用户表单?
猜你喜欢
  • 1970-01-01
  • 2012-08-22
  • 2013-11-15
  • 2020-12-08
  • 2022-11-22
  • 1970-01-01
  • 2010-12-08
  • 2014-10-28
相关资源
最近更新 更多