我在UserForm中有一个TextBox。使用事件_AfterUpdate(),我想将格式更新为TimeValue," hh:mm"使用此代码。
Private Sub TimeTextBox_AfterUpdate()
On Error GoTo ErrorHandler
With TimeTextBox
.Value = Format(TimeValue(.Value), "hh:mm")
ErrorHandler:
.Value = Format(TimeValue(Now), "hh:mm")
End With
End Sub
问题:即使我在框中输入13:13,它也总会失败。我该如何解决这个问题?
答案 0 :(得分:5)
正如@MatthewD评论的那样,您通过更新update事件中的文本框来创建无限循环。最终VBA退出循环,所以它不是无限的。您不断获得当前时间,因为您Exit Sub
之前没有ErrorHandler:
。错误处理标签下的代码会在100%的时间内执行。
如果您将Exit Sub
放在ErrorHandler:
上方的行上,则只有在出现错误时才会执行以下代码。
但是,我会提出一个不同的方式。
Private mbEventsDisabled As Boolean
Private Sub TimeTextBox_AfterUpdate()
Dim dtTime As Date
'See if you can convert the text into a time
On Error Resume Next
dtTime = TimeValue(Me.TimeTextBox.Value)
On Error GoTo 0
'if you can't, the variable will be zero and you set
'it to the current time
If dtTime = 0 Then dtTime = Now
'To prevent recursive calling, see if you've disabled events
If Not mbEventsDisabled Then
'disable events so you can update the textbox
mbEventsDisabled = True
'now this line will trigger AfterUpdate again, but it won't
'execute this if block because of the variable
Me.TimeTextBox.Value = Format(dtTime, "hh:mm")
'now re-enable events
mbEventsDisabled = False
End If
End Sub
您无法使用Application.EnableEvents
禁用用户表单中的事件,因此您必须自己执行此操作。我创建了一个名为mbEventsDisabled
的模块级变量,它将跟踪事件是否已启用(模块级变量在模块的声明部分中声明,在任何过程之外和之上)。最好将此变量命名为否定,因为默认情况下布尔变量为False,除非您另外设置,否则您希望disabled = false。
我只是在一个地方更新它,而不是更新主代码和错误处理程序中的文本框。它让我认为代码更清晰。