我需要确保一个单元格以字符串开头(目前为两个中的一个),然后是冒号,然后是其他任何内容(非空白)。
即:
IP Address:1.2.3.4
FQDN:a.b.c.d
因此,我需要确保其中任何一个字符串加':'启动单元格。 ':'周围可能有间距。
答案 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")
这将处理:
共享示例文件(使用不同的选项):https://www.dropbox.com/s/5rxzyzgkg8biffg/StringWithColon.xlsx
答案 4 :(得分:0)
如果确实想要确保没有人可以在您正在讨论的单元格中输入任何其他内容,则可以使用自定义数据验证公式。这是一步一步:
在“公式”框中,复制此公式:
=IF(NOT(ISERR(FIND(":",A1))), AND(FIND(":",A1)<>LEN(A1),FIND(":",A1) <> 1), FALSE)
将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地址)粘贴到我们拥有的存储各种数据位的隐藏工作表(枚举等)中是有意义的。这样,它可以从列表中编程而不是硬编码。