在Excel VBA中将TextBox中的字符串格式化为TimeValue

时间:2015-07-22 13:24:52

标签: excel excel-vba vba

我在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,它也总会失败。我该如何解决这个问题?

1 个答案:

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

我只是在一个地方更新它,而不是更新主代码和错误处理程序中的文本框。它让我认为代码更清晰。