如何验证细胞的一部分?

时间:2013-01-29 16:17:03

标签: excel excel-vba excel-formula vba

我需要确保一个单元格以字符串开头(目前为两个中的一个),然后是冒号,然后是其他任何内容(非空白)。

即:

IP Address:1.2.3.4
FQDN:a.b.c.d

因此,我需要确保其中任何一个字符串加':'启动单元格。 ':'周围可能有间距。

7 个答案:

答案 0 :(得分:1)

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

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

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

虽然没有考虑到结肠周围的间距。为此,它是正则表达式,我不是很好。

- 从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*")

答案 1 :(得分:1)

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

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

注意,这不区分大小写。

答案 2 :(得分: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!"))

使用此公式,您必须在冒号前面有一个字符串。但是如果你只需要检查两个字符串,那么最好明确地检查它们。

答案 3 :(得分:0)

这是另一个解决方案(假设字符串在A1中):

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

这将处理:

  1. 后跟冒号,然后是其他任何内容(非空白)。
  2. ':'周围可能有间距
  3. 共享示例文件(使用不同的选项):https://www.dropbox.com/s/5rxzyzgkg8biffg/StringWithColon.xlsx

答案 4 :(得分:0)

如果确实想要确保没有人可以在您正在讨论的单元格中输入任何其他内容,则可以使用自定义数据验证公式。这是一步一步:

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

    =IF(NOT(ISERR(FIND(":",A1))), AND(FIND(":",A1)<>LEN(A1),FIND(":",A1) <> 1), FALSE)
    
  6. 将A1替换为您需要的任何细胞。这与我的另一个答案中的公式相同;它仅检查是否有文本,然后是冒号,它们是更多文本(按此顺序),而不是特定字符串。要显式检查字符串“IP Address”和“FQDN”,请在数据验证对话框中替换其他人的公式。

答案 5 :(得分:0)

如果你想在这里使用VBA解决方案是一个函数,你既可以用作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

答案 6 :(得分:0)

因此,作为答案之一给出的正则表达式方法构成了我的解决方案的基础。我从提供的链接复制代码并粘贴到另一个模块。然后我为RegExpFind创建了一个小包装器,它基本上运行了匹配,如果模式成功与否则返回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

现在,我无法直接在自定义验证中使用它,因此,假设我的工作表是从元数据中动态生成的(事先没有创建任何内容),我最后会按照here给出第二个建议。

我是如何做到的,是拥有以下VBA代码(摘自我必须创建数据验证规则的方法):

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],沿着该行,然后设置数据单元的自定义验证以检查forumula单元格的值是否为True firstIndex值是我插入的第一行的数量,所以我最终得到一个看起来像“= EV10 = TRUE”的验证公式。我在验证公式中使用INDIRECT(..)语法来生成该特定行的单元格引用,因为不会为每一行自动调整固定(即:EV10)单元格引用(所有引用EV10)。相反,验证公式是固定的(即:= EV10 = TRUE)但插入时每行调整 。我不明白为什么这些行为会有所不同。

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