簡體   English   中英

Excel VBA:創建動態數據驗證公式

[英]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”

有人可以指導

您可以創建一個返回BooleanPublic 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM