[英]Excel VBA: Create Dynamic data validation formula
我有一個下面的公式可以驗證 Excel 單元格中的 IP 地址並且工作正常。
Dim cellAddress as Variant
cellAddress =Target.value 'Target is a Range
=AND(COUNT(FILTERXML("<t><s>"&SUBSTITUTE(A1,".","</s><s>")&"</s></t>","//s[.*1>-1][.*1<256]"))=4,LEN(A1)-LEN(SUBSTITUTE(A1,".",""))=3)
我的問題是我想將 cellAddress 作為動態值傳遞給我的公式,而不是“A1”
有人可以指導
您可以創建一個返回Boolean
的Public Function
,並將單元格引用作為Range
傳遞給函數。
下面是代碼示例:
Option Explicit
' =AND(COUNT(FILTERXML("<t><s>"&SUBSTITUTE(A1,".","</s><s>")&"</s></t>","//s[.*1>-1][.*1<256]"))=4,LEN(A1)-LEN(SUBSTITUTE(A1,".",""))=3)
Public Function ValidateIPAddress(source As Range) As Boolean
' Get the first condition's value...
Dim xmltxt As String
xmltxt = "<t><s>" & Application.WorksheetFunction.Substitute(source.Value, ".", "</s><s>") & "</s></t>"
Dim sections As Variant
sections = Application.WorksheetFunction.FilterXML(xmltxt, "//s[.*1>-1][.*1<256]")
' Get the second condition's value...
Dim separators As Integer
separators = Len(Application.WorksheetFunction.Substitute(source.Value, ".", ""))
' Compare both conditions and return the result
ValidateIPAddress = Application.WorksheetFunction.Count(sections) = 4 And Len(source.Value) - separators = 3
End Function
這是用法的片段:
我試圖打破您提供的公式,使其清晰易讀,而無需花費太多時間。 它絕對可以改進,或者如果您願意,您甚至可以將所有內容嵌套到一行中,但我不建議這樣做,因為它很難調試。
編輯:
如果您只想替換"A1"
字符串,您可以將cellAddress
變量與公式的一部分連接起來。
這是一個代碼片段示例:
Dim validationFormula As String
validationFormula = "=AND(COUNT(FILTERXML(""<t><s>""&SUBSTITUTE(" & _
Target.Value & ",""."",""</s><s>"")&""</s></t>"",""//s[.*1>-1][.*1<256]""))=4,LEN(" & _
Target.Value & ")-LEN(SUBSTITUTE(" & _
Target.Value & ",""."",""""))=3)"
Debug.Print validationFormula
將單元格的值更改為"A5"
時的公式輸出:
注意:處理字符串中的引號時,必須將所有雙引號替換為 2 個雙引號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.