根据现有的VBAfunction将数据validation应用到许多单元格

我不知道如何使用公式在循环中运行一个string。

这是我想转换成公式的vba代码。 我想用这个公式来进行各种单元格的数据validation。

式:

Function Test(pValue) As Boolean If Len(pValue) < 2 Or Len(pValue) > 99 Then AlphaNumeric = False Exit Function End If LPos = 1 LValid_Values = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789" While LPos <= Len(pValue) LChar = Mid(pValue, LPos, 1) If InStr(LValid_Values, LChar) = 0 Then Test = False Exit Function End If LPos = LPos + 1 Wend Test = True End Function 

我写的公式的简单部分:

 =IF(AND(LEN(E4)>1,LEN(E4)<100,____Formula_Here____),TRUE,FALSE) 

我假设如果我selectE4:E50000并点击DataValidation ,从下拉列表中selectCustom ,然后input上面的公式,那么它将自动应用于E4,E5,E6 .. E50000。 如果我错了,请纠正我。

另外,我希望这个在Excel 2003及更高版本上运行。

用空白填写

 NOT(ISERROR(SUM(SEARCH(MID(E4,ROW($1:$99),1)," ABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789")))) 

这是一个数组公式,所以如果在工作表中使用,可以用ctrl-shift-enter来input。 但是,数据validation的自定义公式(至less在2003年)自动将其视为数组公式,因此只需正常input。

让我们从里面分解。 数组公式中的ROW($1:$99)提供了循环机制。 这将导致周围的数组公式依次在i = 1, 2, ..., 99进行评估, MID将依次取E4i个字符。 SEARCH不区分大小写,所以我们可以省略a..z因为我们有A..Z 。 它返回A..Z.0..9中第i个字符的位置, A..Z.0..9返回错误。 SUM汇总这些位置并传播任何错误。 所以,如果没有find任何字符,整个SUM将是一个错误。

请注意,据我所知,您可以在自定义validation公式中使用UDF,所以我不确定遵循您的反对意见。

使用可以在公式中使用你的函数: http : //office.microsoft.com/en-us/excel-help/creating-custom-functions-HA001111701.aspx

我的想法是使用一堆嵌套的替代函数来减less一个有效的条目“”并做数据validation,以确保这是“”。

这里是嵌套替代。

 =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B1," ",""),"a",""),"b",""),"c",""),"d",""),"e",""),"f",""),"g",""),"h",""),"i",""),"j",""),"k",""),"l",""),"m",""),"n",""),"o",""),"p",""),"q",""),"r",""),"s",""),"t",""),"u",""),"v",""),"w",""),"x",""),"y",""),"z",""),"A",""),"B",""),"C",""),"D",""),"E",""),"F",""),"G",""),"H",""),"I",""),"J",""),"K",""),"L",""),"M",""),"N",""),"O",""),"P",""),"Q",""),"R",""),"S",""),"T",""),"U",""),"V",""),"W",""),"X",""),"Y",""),"Z",""),".",""),"0",""),"1",""),"2",""),"3",""),"4",""),"5",""),"6",""),"7",""),"8",""),"9","") 

事实certificate,对你没有多大的好处,因为我不能复制粘贴到数据validation中,但所有的都不会丢失。我在VBA中写了这个。

 Sub jf() Dim lValid_values As String Dim rowcount As Long lValid_values = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789" Dim form As String Dim desired_column As String Dim desired_rowMin As Long Dim desired_rowMax As Long Dim InitialCell As String Dim temp As String desired_column = "E" desired_rowMin = 4 desired_rowMax = 50000 InitialCell = desired_column & desired_rowMin form = "substitute(||cell||," & """" & " " & """" & "," & """" & """" & ")" Do While lValid_values <> "" form = "substitute(" & form & "," & """" & Left(lValid_values, 1) & """" & "," & """" & """" & ")" lValid_values = Right(lValid_values, Len(lValid_values) - 1) Loop form = "=AND(LEN(||cell||)>1,LEN(||cell||)<100," & form & "=" & """" & """" & ")" For rowcount = desired_rowMin To desired_rowMax temp = Replace(form, "||cell||", desired_column & rowcount) With Range(desired_column & rowcount).Validation .Delete .Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:=temp .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .ShowInput = True .ShowError = True End With Next rowcount End Sub 

我开始运行这个高达50000,但它很慢,所以我停在4000左右。它的工作,所以希望它不是你必须做不止一次。 您必须更改desired_column,desired_rowmin和desired_rowmaxvariables以满足您的需求。

我发现这样做的方式是使用助手列。

假设你在E4:E50000有你的数据

F4将=Test(E4)
复制这个值到最后,所以你现在有你的帮助栏(如果你想检查,最后一个会是=Test(E50000)

数据validation自定义公式将会是=F4 (当您在您select的范围E4:E50000中input时,它会将其复制下来,并将参考值调整为指向旁边相应的单元格)。

你的代码中也有一个错误 – 你有AlphaNumeric = False ,应该是Test = False 。 设置Option Explicit将有助于查找这些错误。


我在testing电子表格中使用的例程的稍微修改版本:

 Option Explicit Function Test(pValue) As Boolean Dim lPos As Long Dim lValid_Values As String Dim LChar As String If Len(pValue) < 2 Or Len(pValue) > 99 Then Test = False Exit Function End If lPos = 1 lValid_Values = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.0123456789" While lPos <= Len(pValue) LChar = Mid(pValue, lPos, 1) If InStr(lValid_Values, LChar) = 0 Then Test = False Exit Function End If lPos = lPos + 1 Wend Test = True End Function