![](/img/trans.png)
[英]how do I write a formula where the number portion of a cell reference comes from another cell?
[英]How do I validate a portion of a cell?
我需要確保一個單元格以一個字符串(此時為兩個中的一個)開頭,然后是冒號,然后是其他任何內容(非空白)。
即:
IP Address:1.2.3.4
FQDN:a.b.c.d
所以,我需要確保這些字符串中的任何一個加上':'來啟動單元格。 ':'周圍可能有間距。
我不確定你的意思是“確保”......
這將檢查單元格以查看它是否具有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*")
如果您的單元格是A4,請在數據/驗證中嘗試此操作。自定義公式:
=((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!"))
使用此公式,您必須在冒號之前有一個字符串。 但是如果你只需要檢查兩個字符串,最好明確地檢查它們。
這是另一個解決方案(假設字符串在A1
):
=IFERROR(IF(AND(SEARCH(":",A1)>1,SEARCH(":",A1)<LEN(TRIM(A1))),"GOOD","BAD"),"BAD")
這將處理:
示例文件是共享的(使用不同的選項): https : //www.dropbox.com/s/5rxzyzgkg8biffg/StringWithColon.xlsx
如果您確實希望確保沒有人可以在您正在討論的單元格中輸入任何其他內容,則可以使用自定義數據驗證公式。 這是一步一步:
在“公式”框中,復制此公式:
=IF(NOT(ISERR(FIND(":",A1))), AND(FIND(":",A1)<>LEN(A1),FIND(":",A1) <> 1), FALSE)
將A1替換為您需要的任何細胞。 這與我的另一個答案中的公式相同; 它僅檢查是否有文本,然后是冒號,它們是更多文本(按此順序),而不是特定字符串。 要顯式檢查字符串“IP Address”和“FQDN”,請在數據驗證對話框中替換其他人的公式。
如果您希望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
因此,作為答案之一給出的正則表達式方法構成了我的解決方案的基礎。 我從提供的鏈接復制代碼並粘貼到另一個模塊。 然后我為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
現在,我不能直接在自定義驗證中使用它,因此,考慮到我的工作表是從元數據中動態生成的(事先沒有創建),我最后遵循這里給出的第二個建議。
我是如何做到的,是擁有以下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。 value是我插入的第一行的編號,所以我最終得到一個看起來像“= EV10 = TRUE”的驗證公式。我在驗證公式中使用INDIRECT(..)語法來生成一個單元格引用對於該特定行,因為固定(即:EV10)單元格ref不會針對每一行自動調整(所有都將參考EV10)。相反,驗證公式是固定的(即:= EV10 = TRUE)但是已調整插入時每行。我不明白為什么這些行為不同。
在將來,將我需要驗證的值(FQDN和IP地址)粘貼到我們擁有的存儲各種數據位的隱藏工作表(枚舉等)中是有意義的。 這樣,它可以從列表中以編程方式構建,而不是硬編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.