Vba 在运行时检查和更改数字格式

Vba 在运行时检查和更改数字格式,vba,excel,Vba,Excel,假设我们在userform中有一个文本框,它将在其中接收任何数字输入以及frontslash“/”。但是我想要一个输入的定义格式;如果用户试图输入任何不符合格式的字符,则应 a) 不接受该字符,或 b) 接受它并立即删除该字符(以表明它不接受输入) 我有这个密码 Private Sub DateTextBox_Change() With DateTextBox If .value Like "#" Then Exit Sub If .value Like "[0-1][0-9]" Th

假设我们在userform中有一个文本框,它将在其中接收任何数字输入以及frontslash“/”。但是我想要一个输入的定义格式;如果用户试图输入任何不符合格式的字符,则应

a) 不接受该字符,或

b) 接受它并立即删除该字符(以表明它不接受输入)

我有这个密码

Private Sub DateTextBox_Change()

With DateTextBox
  If .value Like "#" Then Exit Sub
  If .value Like "[0-1][0-9]" Then Exit Sub

  If .value Like "#[/]" Then Exit Sub
  If .value Like "[0-1][0-9][/]" Then Exit Sub

  If .value Like "#[/][0-9]" Then Exit Sub
  If .value Like "[0-1][0-9][/][0-2]" Then Exit Sub
  If .value Like "#[/][0-9]#" Then Exit Sub
  If .value Like "[0-1][0-9][/][0-2]#" Then Exit Sub

  If .value Like "#[/][3]" Then Exit Sub
  If .value Like "[0-1][0-9][/][3]" Then Exit Sub
  If .value Like "#[/][3][0-1]" Then Exit Sub
  If .value Like "[0-1][0-9][/][3][0-1]" Then Exit Sub

  If .value Like "#[/][3][0-1][/]" Then Exit Sub
  If .value Like "[0-1][0-9][/][3][0-1][/]" Then Exit Sub
  If .value Like "#[/][0-9]#[/]" Then Exit Sub
  If .value Like "[0-1][0-9][/][0-2]#[/]" Then Exit Sub

  If .value Like "#[/][3][0-1][/]#" Then Exit Sub
  If .value Like "[0-1][0-9][/][3][0-1][/]#" Then Exit Sub
  If .value Like "#[/][0-9]#[/]#" Then Exit Sub
  If .value Like "[0-1][0-9][/][0-2]#[/]#" Then Exit Sub

  If .value Like "#[/][3][0-1][/]##" Then Exit Sub
  If .value Like "[0-1][0-9][/][3][0-1][/]##" Then Exit Sub
  If .value Like "#[/][0-9]#[/]##" Then Exit Sub
  If .value Like "[0-1][0-9][/][0-2]#[/]##" Then Exit Sub

  If .value Like "#[/][3][0-1][/]###" Then Exit Sub
  If .value Like "[0-1][0-9][/][3][0-1][/]###" Then Exit Sub
  If .value Like "#[/][0-2]#[/]###" Then Exit Sub
  If .value Like "[0-1][0-9][/][0-2]#[/]###" Then Exit Sub

  If .value Like "#[/][3][0-1][/]####" Then Exit Sub
  If .value Like "[0-1][0-9][/][3][0-1][/]####" Then Exit Sub
  If .value Like "#[/][0-2]#[/]####" Then Exit Sub
  If .value Like "[0-1][0-9][/][0-2]#[/]####" Then Exit Sub

  If Len(.value) = 0 Then Exit Sub
  .value = Left(.value, Len(.value) - 1)
End With

End Sub
这不接受日期
2017年2月9日
。它将只接受最多为
02/
的字符


提前谢谢你

如果您等待用户完成键入(这有助于更好的用户体验!),那么您只需执行类似于
将myDate设置为Date:If IsDate(DateTextBox.Value)然后myDate=CDate(DateTextBox.Value)或者MsgBox“Invalid Date”
,这样用户就可以以任何有效格式输入日期(例如“2017年5月25日”)如果这在您的区域设置中有效),则不需要检查每个字符。之后,您可以将日期变量视为日期(包括使用
格式
将其变成字符串,如果您愿意)。哦-等待用户完成键入的另一个好处是,您不允许使用无效日期,例如2017年2月29日(甚至任何一年的2月30日)和4月31日(任何一年)。或者使用弹出式日历。@YowE3K,是的,先生。显然,在保存数据之前检查数据的方法有很多,如果没有的话,还有其他的方法,而且这样做的理由更多。然而,我想做的不仅仅是日期。作为用户,您不喜欢自动添加/删除delimeter的表单(在正确的位置)以符合正确的格式,而不是经常被提醒您使用了无效的格式吗?抱歉,我无法正确表达自己的意思,因为英语不是我的母语。@RomcelGeluz-当我想将输入字段从“30/09/2017”更改为“31/10/2017”时,我真的很生气,当我将“30”更改为“31”时,应用程序会抱怨并且说它是无效的,所以我必须先改变月份,然后再改变日期。但在同一应用程序中,从“2017年10月31日”到“2017年11月30日”,您必须更改第一天和第二个月。(我认为是我的网上银行账户在使用这种愚蠢的验证。)在我输入数据之前编辑数据对我来说是违反直觉的。(但这只是个人意见。)