如何在VBA / Excel中的用户定义函数中拥有多个可选参数

我需要开发一个UDF来检查一个单元格值是否与几个可能的条目相同,以检查这个单元格是否等于这些值中的任何一个。 正如你所看到的,我有一个关于如何做这个检查的想法。 但编码function的方式,可以接受多个可选的条目不清楚给我。 例如我正在看EXCEL {CONCATENATE(text1,[text2,… text_n])}中的CONCATENATEdynamic。 我用这个函数的5个可选参数的代码如下:

Function IfAmong(TextToCheck As String, Text1 As String, Optional Text2 As String, _ Optional Text3 As String, Optional Text4 As String, Optional Text5 As String,_ Optional text6 As String) As Boolean Dim dd As New Scripting.Dictionary dd.CompareMode = TextCompare dd.Add Text1, dd.Count If Text2 <> "" Then dd.Add Text2, dd.Count If Text3 <> "" Then dd.Add Text3, dd.Count If Text4 <> "" Then dd.Add Text4, dd.Count If Text5 <> "" Then dd.Add Text5, dd.Count If text6 <> "" Then dd.Add text6, dd.Count IfAmong = dd.Exists(TextToCheck) dd.RemoveAll End Function 

我想使它相对于用户所期望的可选条目的数量(如所说的连接)。 并且如果可能的话,通过循环自动检查条目。 我尝试添加文本作为数组,但不工作!

 for i =2 to Ubound(text(i)) if text(i) <>"" then.......... next 

我也无法做到这一点。

感谢和问候,M

使用ParamArrayParamArray必须始终是最后声明的,并且必须是Varianttypes。 它将允许你input尽可能多的variables,而不必定义它们中的每一个。

 Function IfAmong(TextToCheck, ParamArray Text() As Variant) As Boolean Dim txt As Variant Dim dd As New Scripting.Dictionary dd.CompareMode = TextCompare For Each txt In Text() If Not txt = vbNullString Then dd.Add Key:=txt, Item:=dd.Count Next txt IfAmong = dd.Exists(TextToCheck) dd.RemoveAll End Function 

不过,我会这样做:

 Function IfAmong(TextToCheck, ParamArray Text() As Variant) As Boolean Dim txt As Variant ' Default value if not found IfAmong = False For Each txt In Text() ' Make sure input is text If TypeName(txt) = "String" Then ' Test if they're equal ignoring case If LCase(txt) = LCase(TextToCheck) Then ' Set to true as found IfAmong = True ' There's no point to keep searching as we've already got our answer so lets exit Exit For End If End If Next txt End Function 

这样可以避免使用可能导致引用错误的字典。 您的函数中的字典也不处理重复的值。 一个词典不允许你有多个相同的值的键,所以一旦你有一个重复的文本值,你的function将翻倒,因为这些不处理。