我在用于时间分配的多个用户表单上有多个文本框。为了简单起见,请说userform1&userform2,每个都带有textbox1&textbox2。 Userform1用于用户输入,将值放入表中,而userform2从该表中提取值并显示在相关的文本框中。我需要将这些框的输入和显示都限制为[H]:mm格式,其中分钟不能超过59,而小时可以是25+,即125:59而不是4:67
我尝试将这些线程以及其他线程的代码组合在一起,但是似乎无法使其正常工作。
Excel VBA Textbox time validation to [h]:mm
Time format of text box in excel user form
最终我只是试图通过消息框来操纵用户输入,但这仍然使条目容易出错
Sub FormatHHMM(textbox As Object)
Dim timeStr As String
With textbox
'Check if user put in a colon or not
If InStr(1, .Value, ":", vbTextCompare) = 0 And Len(.Value) > 1 Then
MsgBox "Please use HH:mm Format"
textbox.Value = ""
textbox.SetFocus
Else
If Right(.Value, 2) > 60 Then
MsgBox "Minutes cannot be more than 59"
textbox.Value = ""
textbox.SetFocus
End If
End If
End With
End Sub
这允许用户放入字母字符,即使从表中调用时正确输入也显示为值,即5.234 ...而不是125:59
答案 0 :(得分:2)
如何在同一输入框上将小时和分钟分为两个单独的输入字段。 因此,用户必须输入小时数,然后在接下来的字段中输入分钟。这样,您可以检查输入的数字和秒数,大于60的秒。 我知道这不是理想的方法,但这将是规避给定问题的一种方法。
答案 1 :(得分:1)
您是否尝试过使用Like
运算符?这样可以检查每个字符位置的数值。我会这样:
Function FormatCheck(ByVal strEntered As String)
Dim correctformat As Boolean
If strEntered Like "*#:##" And IsNumeric(Mid(strEntered, 1, InStr(1, strEntered, ":", 1) - 1)) Then
If Mid(strEntered, InStr(1, strEntered, ":", 1) + 1, 999) <= 59 Then
correctformat = True
End If
End If
If Not correctformat Then FormatCheck = "Incorrect format"
End Function
这需要在“:”之前至少有一个数字
编辑:下面是Sub
版本,而不是使用Function
。将会像您最初使用的那样弹出一个MsgBox
。您可能会用它替换整个FormatHHMM
子,而不会产生任何不利影响。
Sub FormatCheck(ByVal strEntered As String)
Dim correctformat As Boolean
If strEntered Like "*#:##" And IsNumeric(Mid(strEntered, 1, InStr(1, strEntered, ":", 1) - 1)) Then
If Mid(strEntered, InStr(1, strEntered, ":", 1) + 1, 999) <= 59 Then
correctformat = True
End If
End If
If Not correctformat Then MsgBox "Incorrect format"
End Sub
答案 2 :(得分:0)
我认为这可能会有所帮助:
Option Explicit
Sub test()
Dim str As String
str = TextBox.Value
'Test string lenght. Maximun lenght number 4
If Len(str) <> 4 Then
MsgBox "Enter a valid time. Proper number of digits are 4."
Exit Sub
End If
'Test if string includes only one ":"
If (Len(str) - Len(Replace(str, ":", ""))) / Len(":") <> 1 Then
MsgBox "Use only one "":"" to separate time."
Exit Sub
End If
'Test how many digits are before and after ":"
If InStr(1, str, ":") <> 2 Then
MsgBox """:"" position should be place 2."
Exit Sub
End If
'Test if number 1,3 & 4 are number
If IsNumeric(Mid(str, 1, 1)) = False Or IsNumeric(Mid(str, 1, 1)) = False Or IsNumeric(Mid(str, 1, 1)) = False Then
MsgBox "Enter number in position 1,3 and 4."
Exit Sub
End If
'Test 2 last to digits
If Right(str, 2) <= 60 Then
MsgBox "Second limit is 60."
Exit Sub
End If
End Sub
答案 3 :(得分:0)
您可以使用正则表达式:
Sub inputTimeFormat()
Dim userInput As String
Dim strPattern As String
Dim msgBoxText As String
Dim regEx As New RegExp
Dim objRegex As Object
strPattern = "(^[0-9]+):([0-5])([0-9])$"
msgBoxText = "Insert time in HH:mm, or hit Cancel to escape"
Set objRegex = CreateObject("vbscript.regexp")
With regEx
.ignorecase = True
.Pattern = strPattern
Do
If userInput <> vbNullString Then msgBoxText = "PLEASE RETRY" & Chr(13) & msgBoxText
userInput = Application.InputBox(msgBoxText, Default:="17:01")
If userInput = "False" Then
MsgBox "User hit cancel, exiting code", vbCritical
Exit Sub
End If
Loop Until .Test(userInput)
End With
MsgBox "Format OK"
End Sub
(您需要激活正则表达式:在VBA中,“工具”>“参考”>选中“ Microsoft VBScript正则表达式5.5”>“确定”) 有关How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops
的更多详细信息