我如何validation单元格的一部分?

我需要确保一个单元格以一个string开头(两个之一),然后是冒号,然后是其他任何(不是空白)。

即:

IP Address:1.2.3.4 FQDN:abcd 

所以,我需要确保这些string加':'开始单元格。 “:”可能会有间隔。

我不确定你的意思是“确保”…

这将检查单元格以查看它是否具有Excel函数中的两个起始值之一:

 =IF(OR(LEFT(A1,5)="FQDN:",LEFT(A1,11)="IP Address:"),TRUE,FALSE) 

这并没有考虑到结肠周围的空间。 为此,它是正则expression式,我不是很好。

– 从Tushar Mehta网站的代码: http ://www.tmehta.com/regexp/add_code.htm

然后,使用这样的Excel函数:

 =regexpfind(A1,"^FQDN\s*:\s*") =regexpfind(A1,"^IP Address\s*:\s*") 

或者你可以把它们合并成一个单一的公式:

 =regexpfind(A1,"^(FQDN|IP Address)\s*:\s*") 

如果您的单元格是A4,则在数据/validation中尝试此操作。自定义公式:

 =((COUNTIF(A4,"fqdn*")+COUNTIF(A4,"ip address*"))*COUNTIF(A4,"*:*")>0) 

注意这不区分大小写。

这可能是最简单的方法。 假设您正在检查单元格A1中的值:

 =IF(ISERR(FIND(":",A1)),"Bad!",IF(FIND(":",A1)<>LEN(A1), "OK", "Bad!")) 

首先,这个公式检查单元格A1是否有冒号。 如果没有,这是一个坏的细胞。 如果是,则检查冒号不是最后一个字符。 如果它是最后一个字符,冒号后面没有文字,所以它是一个不好的单元格。 如果冒号后面有文字,这是一个好的单元格。 希望这可以帮助!

– 编辑 –

要检查冒号是不是第一个字符,这是公式:

 =IF(ISERR(FIND(":",A1)),"Bad!",IF(OR(FIND(":",A1)=LEN(A1), FIND(":",A1) = 1), "Bad!", "OK"))"Bad!")) 

用这个公式,你必须在冒号前面有一个string。 但是如果你只需要检查两个string,最好明确地检查它们。

这里还有一个解决scheme(假设string在A1 ):

 =IFERROR(IF(AND(SEARCH(":",A1)>1,SEARCH(":",A1)<LEN(TRIM(A1))),"GOOD","BAD"),"BAD") 

这将处理:

  1. 然后是冒号,然后是其他的( 不是空白 )。
  2. “:”可能会有间隔

示例文件共享(使用不同的选项): https : //www.dropbox.com/s/5rxzyzgkg8biffg/StringWithColon.xlsx

如果您确实希望确保没有人能够input您正在讨论的单元格中的其他任何内容,则可以使用自定义数据validation公式。 这里是一步一步的:

  1. 突出显示要validation的列的第一个单元格
  2. 在function区上,单击“数据”,然后在“数据工具”标题下单击“数据validation”。
  3. 数据validation窗口应该是打开的。 点击设置标签(实际上它应该被默认选中)
  4. 在“允许”下拉菜单中,点击自定义。
  5. 在“公式”框中,复制此公式:

     =IF(NOT(ISERR(FIND(":",A1))), AND(FIND(":",A1)<>LEN(A1),FIND(":",A1) <> 1), FALSE) 

用A1代替你需要的任何细胞。 这与我的其他答案是一样的。 它只检查是否有文本,然后是冒号,更多的文本(按顺序),而不是特定的string。 要显式检查string“IP地址”和“FQDN”,请在数据validation对话框中replace其他人的公式。

如果你想要一个VBA解决scheme,你可以使用这个函数作为UDF或VBA

 Option Explicit Option Base 1 Function CorrectColonPlace(StringtoCheck As String, StartStrings As Variant) As Variant Dim iPos As Long Dim j As Long Dim StrStart As String ' ' return 0 if stringtocheck fails, else the position of the colon CorrectColonPlace = 0 On Error GoTo FuncFail iPos = InStr(StringtoCheck, ":") If iPos > 1 Then If iPos < Len(Trim(StringtoCheck)) Then '' assume that StartStrings is either a Range or a 2-dimension single-column array '' containing the strings to be found at the start of stringtocheck If IsObject(StartStrings) Then StartStrings = StartStrings.Value2 StrStart = Trim(Left(StringtoCheck, iPos - 1)) For j = 1 To UBound(StartStrings) If StrStart = Trim(StartStrings(j, 1)) Then CorrectColonPlace = iPos Exit For End If Next j End If End If FuncFail: End Function 

所以,作为答案之一的正则expression式方法构成了我的解决scheme的基础。 我从提供的链接复制代码并粘贴到另一个模块。 然后,我为RegExpFind创build了一个小包装,基本上运行了匹配,如果模式成功或者不成功,则返回true或false。

 Function RegExpTest(FindIn, FindWhat As String, _ Optional IgnoreCase As Boolean = False) Dim n As Long Dim resultsArray As Variant ' Defined as single variant for the benefit of excel 97 Dim result As Boolean ' Don't break on errors. Easier to check if Err<>0 On Error Resume Next Err.Clear result = False resultsArray = RegExpFind(FindIn, FindWhat, IgnoreCase) ' Check if the returned data is an array before proceeding. If IsArray(resultsArray) = True Then n = UBound(resultsArray) If Err.Number = 0 Then If LBound(resultsArray) <= UBound(resultsArray) Then result = True End If End If End If RegExpTest = result End Function 

现在,我不能直接在自定义validation中使用它,所以,由于我的工作表是从元数据(没有事先创build的)中生成的,所以我结束了这里给出的第二个build议。

我如何做到这一点,是有以下的VBA代码(摘自我必须创build我的数据validation规则的方法):

 Range(Cells(firstIndex, validationFormulaCellRef), Cells(lastIndex, validationFormulaCellRef)).Formula = _ "=RegExpTest(INDIRECT(""D""&ROW()), ""^(FQDN|IP Address)\s*:\s*([\w\d\.]+)$"", TRUE)" Dim validationFormula As String validationFormula = "=" & validationFormulaCellName & firstIndex & "=TRUE" ' Now, setup custom validation to check that the referenced cell's value is True With fieldRange.Validation .Delete .add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _ Formula1:=validationFormula .IgnoreBlank = False .InCellDropdown = False .InputTitle = "" .ErrorTitle = "Input Error" .InputMessage = "This field must start with either 'FQDN' or 'IP Address', plus a colon ':'." .ErrorMessage = "This field must start with either 'FQDN' or 'IP Address', plus a colon ':'." .ShowInput = True .ShowError = True End With 

我把这个公式(实际上做的工作)粘贴到一个未使用的单元格(EV [validationFormulaCellName] = 152 [validationFormulaCellRef]),然后设置数据单元的自定义validation来检查论坛单元格的值是否为true。firstIndex值是我插入的第一行的数字,所以我最终得到了一个validation公式,看起来像“= EV10 = TRUE”。我在validation公式中使用了INDIRECT(..)语法来生成单元格引用对于那一行,由于固定的(即:EV10)单元格ref不会自动地针对每一行进行调整(全部都会参考EV10),相反,validation公式是固定的(即:= EV10 = TRUE)插入的每一行,我不明白为什么这些行为不同。

将来,将我需要validation的值(FQDN和IP地址)粘贴到隐藏的工作表中是有意义的,我们可以存储各种数据位 – 枚举等。 这样,它可以从编程的方式build立起来,而不是硬编码。