Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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
使用数据验证验证excel中的数字、文本混合字符_Excel_Validation_Vba - Fatal编程技术网

使用数据验证验证excel中的数字、文本混合字符

使用数据验证验证excel中的数字、文本混合字符,excel,validation,vba,Excel,Validation,Vba,我需要验证一个有一些特定需求的单元。LEN(A1)=6,输入值的组成必须如下所示:大写文本字符、数字值(一位数)、大写文本字符、数字值(一位数)、大写文本字符、数字值(一位数)。下面是一个示例A1B2C1 我将使用此字段验证盘点中的仓位编号,这些编号是手动输入的。我知道我可以验证输入的长度,以及它应该是文本还是数字,但不能验证我需要的特定组合 谢谢如果您计划使用VBA,则可以选择检查ASCII码 要做到这一点,您可以使用 Left([String] , [Amount of Chars]) M

我需要验证一个有一些特定需求的单元。LEN(A1)=6,输入值的组成必须如下所示:大写文本字符、数字值(一位数)、大写文本字符、数字值(一位数)、大写文本字符、数字值(一位数)。下面是一个示例A1B2C1

我将使用此字段验证盘点中的仓位编号,这些编号是手动输入的。我知道我可以验证输入的长度,以及它应该是文本还是数字,但不能验证我需要的特定组合


谢谢

如果您计划使用VBA,则可以选择检查ASCII码

要做到这一点,您可以使用

Left([String] , [Amount of Chars])

Mid([String] , [Starting Char] , [Amount of Chars])

Right([String] , [Amount of Chars])
要获取每个字符,请使用

ASC([Character to Check])
获取ASCII码,并将其与预期进行比较

因此,对于大写字符等为60到95

请参阅下面的一些示例代码,虽然不是最干净的,但它可以工作

If Asc(Mid(StringToTest, 1, 1)) >= 60 And Asc(Mid(StringToTest, 1, 1)) <= 95 And _
   Asc(Mid(StringToTest, 2, 1)) >= 48 And Asc(Mid(StringToTest, 2, 1)) <= 57 And _
   Asc(Mid(StringToTest, 3, 1)) >= 60 And Asc(Mid(StringToTest, 3, 1)) <= 95 And _
   Asc(Mid(StringToTest, 4, 1)) >= 48 And Asc(Mid(StringToTest, 4, 1)) <= 57 And _
   Asc(Mid(StringToTest, 5, 1)) >= 60 And Asc(Mid(StringToTest, 5, 1)) <= 95 And _
   Asc(Mid(StringToTest, 6, 1)) >= 48 And Asc(Mid(StringToTest, 6, 1)) <= 57 Then
    Debug.Print "Pass"
Else
    Debug.Print "Fail"
End If

如果Asc(中(StringToTest,1,1))>=60和Asc(中(StringToTest,1,1))=48和Asc(中(StringToTest,2,1))=60和Asc(中(StringToTest,3,1))=48和Asc(中(StringToTest,4,1))=60和Asc(中(StringToTest,5,1))=48和Asc(中(StringToTest,6,1))这是您可以使用的另一个选项。将其放入工作表模块中,每当更改单元格时,它都会为您验证格式$#$#$#。我已经将其设置为处理单元格“A1”,但您可以将其更改为您需要的任何单元格。也可以将其更改为特定列或特定行中的所有单元格。希望能有帮助

Private Sub Worksheet_Change(ByVal Target As Range)
''   Choose any one of these three range methods
'   By Individual Cell
If Replace(Target.Address, "$", "") = "A1" Then GoTo validate '   Change this to your cell range
''   By Any Cell in Column 1
'If Target.Column = 1 Then GoTo validate  '   Change this to your Column
''   By Any Cell in Column 1
'If Target.Row = 10 Then GoTo validate  '   Change this to your Row

Exit Sub


validate:
If Len(Target) <> 6 Then GoTo errorMsg
For i = 1 To 6
     abc = Asc(Mid(Target, i, 1))
        If i Mod 2 = 0 Then
            If Asc(Mid(Target, i, 1)) < 48 Or Asc(Mid(Target, i, 1)) > 57 Then GoTo errorMsg
        End If
    If i Mod 2 <> 0 And Asc(Mid(Target, i, 1)) > 49 And Asc(Mid(Target, i, 1)) < 58 Then GoTo errorMsg
Next i

Exit Sub

errorMsg:
Target.Interior.ColorIndex = 3
MsgBox "Incorrect Format for this cell"
Application.EnableEvents = False
    Target = ""
    Target.ClearFormats
Application.EnableEvents = True
End Sub
Private子工作表\u更改(ByVal目标作为范围)
“”请选择这三种范围方法中的任意一种
“通过单个单元格
如果Replace(Target.Address,“$”,“)=“A1”,则转到“验证”将其更改为您的单元格范围
“”由第1列中的任何单元格执行
'如果Target.Column=1,则转到验证'将此更改为您的列
“”由第1列中的任何单元格执行
'如果Target.Row=10,则转到验证'将此更改为您的行
出口接头
验证:
如果Len(目标)6,则转到errorMsg
对于i=1到6
abc=Asc(中期(目标,i,1))
如果i Mod 2=0,那么
如果Asc(Mid(目标,i,1))<48或Asc(Mid(目标,i,1))>57,则转到errorMsg
如果结束
如果i Mod 2 0和Asc(Mid(目标,i,1))>49和Asc(Mid(目标,i,1))<58,则转到errorMsg
接下来我
出口接头
错误消息:
Target.Interior.ColorIndex=3
MsgBox“此单元格的格式不正确”
Application.EnableEvents=False
Target=“”
Target.ClearFormats
Application.EnableEvents=True
端接头

LEN、MID、ISNUMBER和ISTEXT似乎可以解决这个问题。如果需要VBA,请尝试一下正则表达式,如果遇到问题,请回来展示一些努力。@Jeeped-ISTEXT不起作用,因为数字是字符串的一部分,因此将显示为true。@Hocus-
=ISNUMBER(--MID(A2,行(2:2),1))
应该这样做。我只是希望看到一些原创作品。任何。。。什么都可以。@Jeeped不确定这是不是该问的地方,但你介意让我看看这个公式,并解释它是如何工作的吗?@Jeeped我用下面的方法尝试验证一个包含13个字符的数字单元格,但我失败了=并且((LEN(E3)=13);(ISNUMBER)),它给出了一个#名称?在本应是一个相当容易的想法失败后,最好在这里提问。如果我因缺乏努力而冒犯了你,请道歉。谢谢@Hocus。我对VBA的接触有限,但会尝试一下并让你知道。嗨@Hocus。你的解决方案也奏效了。它要复杂得多,但我能让它工作。谢谢。谢谢@John Muggins这正是我所需要的,而且效果非常好。