Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA Excel-使用验证设置文本框中的日期格式_Excel_Vba - Fatal编程技术网

VBA Excel-使用验证设置文本框中的日期格式

VBA Excel-使用验证设置文本框中的日期格式,excel,vba,Excel,Vba,所以我正在进行日期验证。我要使用的日期格式是mm/dd/yyyy。请问是否可以在键入时自动插入/?我还在想,我该如何验证该值是否为真实日期 下面的代码允许文本框接受数字和/。它位于类文件下 If KeyAscii >= 47 And KeyAscii <= 57 Then Debug.Print tb.Name, "date" Else MsgBox "The value should be in a DATE format

所以我正在进行日期验证。我要使用的日期格式是
mm/dd/yyyy
。请问是否可以在键入时自动插入
/
?我还在想,我该如何验证该值是否为真实日期

下面的代码允许文本框接受
数字
/
。它位于
类文件

If KeyAscii >= 47 And KeyAscii <= 57 Then
      Debug.Print tb.Name, "date"
   Else
      MsgBox "The value should be in a DATE format: mm/dd/yyyy", vbOKOnly + vbCritical, "Error"
      Debug.Print tb.Name, "other"
      KeyAscii = 0
End If
如果keyscii>=47,并且keyscii用于自动“/”,我尝试使用

If tb.SelStart = 2 Or tb.SelStart = 5 Then
    tb.Text = tb.Text & "/"
End If
进入userform的texbox按键事件,它似乎工作得很好

这是一个对不同位置的不同数字有一些限制的示例:(Userform代码)

Private-Sub-tb\u按键(ByVal-keyscii作为MSForms.ReturnInteger)
如果KeyAscii>=48和KeyAscii=50,则KeyAscii=0
其他的
如果KeyAscii<49,则KeyAscii=0
如果结束
'第一个天数必须介于0和3之间,并获取“/”
ElseIf tb.SelStart=2或tb.SelStart=3,则
如果KeyAscii<48或KeyAscii>51,则
KeyAscii=0
其他的
tb.Text=左(tb.Text,2)和“/”
如果结束
“一天中的一整天必须大于0且小于31
ElseIf tb.SelStart=4然后
如果Mid(tb.Text,4,1)=“0”,则
如果KeyAscii<49,则KeyAscii=0
ElseIf Mid(tb.Text,4,1)=“3”那么
如果KeyAscii<48或KeyAscii>49,则KeyAscii=0
如果不是中间(tb.Text,4,1)=“1”,而不是中间(tb.Text,4,1)=“2”,则
KeyAscii=0
如果结束
'第一个年份数必须介于1和2之间,并获取“/”
ElseIf tb.SelStart=5或tb.SelStart=6,则
如果KeyAscii<49或KeyAscii>50,则
KeyAscii=0
其他的
tb.Text=左(tb.Text,5)和“/”
如果结束
如果结束
其他的
KeyAscii=0
如果结束
端接头
这是一个关于如何限制用户输入正确日期以外的任何内容的示例*

*您仍然可以输入02/30之类的内容,或者使用粘贴功能输入任何内容。

对于自动“/”,我尝试使用

If tb.SelStart = 2 Or tb.SelStart = 5 Then
    tb.Text = tb.Text & "/"
End If
进入userform的texbox按键事件,它似乎工作得很好

这是一个对不同位置的不同数字有一些限制的示例:(Userform代码)

Private-Sub-tb\u按键(ByVal-keyscii作为MSForms.ReturnInteger)
如果KeyAscii>=48和KeyAscii=50,则KeyAscii=0
其他的
如果KeyAscii<49,则KeyAscii=0
如果结束
'第一个天数必须介于0和3之间,并获取“/”
ElseIf tb.SelStart=2或tb.SelStart=3,则
如果KeyAscii<48或KeyAscii>51,则
KeyAscii=0
其他的
tb.Text=左(tb.Text,2)和“/”
如果结束
“一天中的一整天必须大于0且小于31
ElseIf tb.SelStart=4然后
如果Mid(tb.Text,4,1)=“0”,则
如果KeyAscii<49,则KeyAscii=0
ElseIf Mid(tb.Text,4,1)=“3”那么
如果KeyAscii<48或KeyAscii>49,则KeyAscii=0
如果不是中间(tb.Text,4,1)=“1”,而不是中间(tb.Text,4,1)=“2”,则
KeyAscii=0
如果结束
'第一个年份数必须介于1和2之间,并获取“/”
ElseIf tb.SelStart=5或tb.SelStart=6,则
如果KeyAscii<49或KeyAscii>50,则
KeyAscii=0
其他的
tb.Text=左(tb.Text,5)和“/”
如果结束
如果结束
其他的
KeyAscii=0
如果结束
端接头
这是一个关于如何限制用户输入正确日期以外的任何内容的示例*

*您仍然可以输入02/30之类的内容,或者使用粘贴功能输入任何内容。

格式化文本框输入和验证 下面的代码将自动添加所需格式的斜杠(可以是dd/mm/yyyy或mm/dd/yyyy)。在顶部的中需要有公共布尔值,以防止在添加斜杠时自动触发。输入完整日期后,它还会检查日期,如果日期无效,它会将文本变为红色。只需调整您需要的内容(即用您的文本框的名称替换
TextBox1
名称),就可以了

我还在一些行的旁边添加了一些注释,这样你就知道它们是做什么的了

Public HaltChanges As Boolean

Private Sub TextBox1_Change()

Dim t As String

If HaltChanges = True Then Exit Sub 'Prevents retrigger from changing the text

t = Me.TextBox1.Text
If Me.TextBox1.ForeColor = vbRed Then Me.TextBox1.ForeColor = vbwindows 'Reset to original color
If Len(t) < 1 Then Exit Sub 'If textbox is empty
If Len(t) > 10 Then 'Date should be no greater than 10 characters including / so prevent anything else being typed
    Me.TextBox1.Text = Left(t, 10)
    Exit Sub
End If
If Len(t) = 10 And IsDate(t) = False Then 'if has 10 characters (full date) and it's not a real date then make text red
    Me.TextBox1.ForeColor = vbRed
End If

HaltChanges = True
If Not IsNumeric(Right(t, 1)) Then 'Check if input is a number or not
    Me.TextBox1.Text = Left(t, Len(t) - 1) 'Remove last entered character if not a number
ElseIf Len(t) >= 3 And Mid(t, 3, 1) <> "/" Then 'These ones are to add the slashes
    Me.TextBox1.Text = Left(t, 2) & "/" & Right(t, 1)
ElseIf Len(t) >= 6 And Mid(t, 6, 1) <> "/" Then
    Me.TextBox1.Text = Left(t, 5) & "/" & Right(t, 1)
End If
t = Me.TextBox1.Text
HaltChanges = False

End Sub
公共暂停更改为布尔值
专用子文本框1_Change()
调暗t作为字符串
如果HaltChanges=True,则Exit Sub可防止重新触发更改文本
t=Me.TextBox1.Text
如果Me.TextBox1.ForeColor=vbRed,则Me.TextBox1.ForeColor=vbwindows将重置为原始颜色
如果Len(t)<1,则如果文本框为空,则退出Sub
如果Len(t)>10,则“日期”不应超过10个字符,包括/因此防止键入任何其他内容
Me.TextBox1.Text=左(t,10)
出口接头
如果结束
如果Len(t)=10,IsDate(t)=False,则“如果”有10个字符(完整日期),且不是真实日期,则将文本变为红色
Me.TextBox1.ForeColor=vbRed
如果结束
HaltChanges=True
如果不是数字(右(t,1)),则“检查输入是否为数字”
Me.TextBox1.Text=左(t,Len(t)-1)'如果不是数字,请删除最后输入的字符
ElseIf Len(t)>=3和Mid(t,3,1)“/”然后‘这些将添加斜杠
Me.TextBox1.Text=左(t,2)和“/”右(t,1)
ElseIf Len(t)>=6和Mid(t,6,1)“/”则
Me.TextBox1.Text=左(t,5)和“/”右(t,1)
如果结束
t=Me.TextBox1.Text
HaltChanges=False
端接头
格式化文本框输入和验证 下面的代码将自动添加所需格式的斜杠(可以是dd/mm/yyyy或mm/dd/yyyy)。顶部的中需要有公共布尔值,以防止在添加斜杠时自动触发。输入完整日期后,它还会检查日期,如果日期无效,则会将文本变为红色。只需调整所需内容(即用文本框的名称替换
TextBox1
名称