2017-09-06 5 views
2

セルがこれらの値と等しいかどうかをチェックするために、いくつかの可能なエントリに対してセル値をチェックするUDFを開発する必要があります。ご覧のとおり、私はこのチェックを行う方法について考えています。しかし、私のために明確でない複数のオプションの項目を受け入れることができるように関数をコーディングする。例えば、私はEXCEL {CONCATENATE(text1、[text2、... text_n])}でCONCATENATEのような動的なものを探しています。 5オプションの引数を有するこのような機能のための私のコードは次の通りである:VBA/Excelのユーザー定義関数に複数のオプション引数を持たせる方法

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 

私は(CONCATENATEように述べたように)ユーザが所望する任意のエントリの数が相対したいです。可能であれば、ループを介して自動的にエントリのチェックを行います。テキストを配列として追加しようとしましたが、動作しませんでした!

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

私はそれもできませんでした。

おかげに関して、 M

答えて

4

使用ParamArrayParamArrayは常に最後に宣言する必要があり、タイプはVariantである必要があります。これは、それぞれの変数を定義することなく、好きなだけ多くの変数を入力できるようにします。

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 

この方法です。あなたの関数内のあなたの辞書は、重複した値も扱いません。ディクショナリでは、同じ値の複数のキーを持つことはできません。重複したテキスト値を持つとすぐに、関数は処理されないので機能が停止します。

+0

ありがとう、良い点。私は配列関数のための同様のルーチンを持っていたので、ここでそれを再適用していました。あなたのコードはより良く効率的です。高く評価。 –

+0

次のiのdimとiは必須ではなく、次に私はエラーを引き起こすことに注意してください。コードを編集しましたが、適用前にピアレビューが必要です。 –

+0

あなたは間違いなしです。私は 'For i = LBound(Text)to UBound(Text)'を使い、 'For Each Loop'に変更したときにそれらのビットを変更するのを忘れてしまいました。良い点 – Tom

関連する問題