Excel用户定义的function – 字段符合特定条件

新的vba – 我基本上试图使这个很长的if语句到用户定义的函数。 该函数将检查字段是2个字母,2个数字,下划线,1个字母,2个数字的正确格式。

=IF(AND(AND(CODE(MID(A2,1,1))>64,CODE(MID(A2,1,1))<91),AND(CODE(MID(A2,2,1))>64,CODE(MID(A2,2,1))<91),AND(CODE(MID(A2,3,1))>47,CODE(MID(A2,3,1))<57),AND(CODE(MID(A2,4,1))>47,CODE(MID(A2,4,1))<57),CODE(MID(A2,5,1))=95,AND(CODE(MID(A2,6,1))>64,CODE(MID(A2,6,1))<91),AND(CODE(MID(A2,7,1))>47,CODE(MID(A2,7,1))<57),AND(CODE(MID(A2,8,1))>47,CODE(MID(A2,8,1))<57),"Good","Bad Syntax") 

A2的例子是AA01_A05

下面的代码 – 最后飞过它。 任何帮助,将不胜感激。

 Function bincheck(strValue As String) As Boolean Dim AislePos As Integer, Rackno As Integer, Udr As Integer, ShelfPos As Integer, BinNo As Integer Dim TrueAisle As Boolean, TrueRack As Boolean, TrueUdr As Boolean, TrueShelf As Boolean, TrueBin As Boolean For AislePos = 1 To 2 Select Case Asc(Mid(strValue, AislePos, 1)) Case 65 To 90 TrueAisle = True Case Else TrueAisle = False Exit For End Select Next For Rackno = 3 To 4 Select Case Asc(Mid(strValue, Rackno, 1)) Case 48 To 56 TrueRack = True Case Else TrueRack = False Exit For End Select Next For Udr = 5 To 5 Select Case Asc(Mid(strValue, Udr, 1)) Case Is = 95 TrueUdr = True Case Else TrueUdr = False Exit For End Select Next For ShelfPos = 6 To 6 Select Case Asc(Mid(strValue, ShelfPos, 1)) Case 65 To 90 TrueShelf = True Case Else TrueShelf = False Exit For End Select Next For BinNo = 7 To 8 Select Case Asc(Mid(strValue, BinNo, 1)) Case 48 To 56 TrueBin = True Case Else TrueBin = False Exit For End Select Next Select Case bincheck Case TrueRack = True And TrueAisle = True And TrueUdr = True And TrueShelf = True And TrueBin = True bincheck = "Good" Case Else bincheck = "Bad" End Select End Function 

整个事情可以简化为一个Like语句

 Function bincheck(strValue As String) As Boolean bincheck = strValue LIKE "[AZ][AZ]##_[AZ]##" End Function 

如果你想让你的函数返回“Good”或“Bad”等文本,那么你的第一行必须是

 Function bincheck(strValue As String) As String 

如果你想返回一个二进制值(如你的variables名所示),那么你可以保留第一行

 Function bincheck(strValue As String) As Boolean 

但是最后的variablesbincheck必须被调整以返回一个二进制值,例如TrueFalse

 bincheck = True Case Else bincheck = False 

但是,函数的名字是bincheck这可能是令人不bincheck ,我会build议一个替代名称的function,如:

 Function IsTheStringFormattedCorrectly(strValue As String) As Boolean 

那么TrueFalse的返回值可能会更好理解。

我似乎是最后一个Select Case语句,

 Select Case bincheck Case TrueRack = True And TrueAisle = True And TrueUdr = True And TrueShelf = True And TrueBin = True bincheck = "Good" Case Else bincheck = "Bad" End Select 

…会更好,

 bincheck = TrueRack And TrueAisle And TrueUdr And TrueShelf And TrueBin 

你不需要检查布尔是否等于 true。 这已经是真的还是假的。

检查传递给函数的string的长度可能是最好的作为整体“包装”如果条件。 如果不符合,那么布尔值中的任何一个都不会被设置超过它们的默认声明值False(即当它们被声明为布尔值时,它们以False开始)。

 Function bincheck(strValue As String) As Boolean Dim pos As Integer Dim TrueAisle As Boolean, TrueRack As Boolean, TrueUdr As Boolean, TrueShelf As Boolean, TrueBin As Boolean If Len(strValue) = 8 Then For pos = 1 To 2 Select Case Asc(Mid(strValue, pos , 1)) Case 65 To 90 TrueAisle = True Case Else TrueAisle = False Exit For End Select Next For pos = 3 To 4 Select Case Asc(Mid(strValue, pos , 1)) Case 48 To 56 TrueRack = True Case Else TrueRack = False Exit For End Select Next For pos = 5 To 5 Select Case Asc(Mid(strValue, pos , 1)) Case Is = 95 TrueUdr = True Case Else TrueUdr = False Exit For End Select Next For pos = 6 To 6 Select Case Asc(Mid(strValue, pos , 1)) Case 65 To 90 TrueShelf = True Case Else TrueShelf = False Exit For End Select Next For pos = 7 To 8 Select Case Asc(Mid(strValue, pos , 1)) Case 48 To 56 TrueBin = True Case Else TrueBin = False Exit For End Select Next End If bincheck = TrueRack And TrueAisle And TrueUdr And TrueShelf And TrueBin End Function