2011-11-14 13 views
0

ワークシート関数の組み合わせをUDFとして保存しようとしていました。私はリストを比較するためにこの組み合わせを使用します:Excel UDFはTrueを返しますが、Falseを返しません。

=IF(ISNA(MATCH([value], [range], [match_type])),False,True) 

しかし、単純な2行のマクロを正しくしようとして、少し問題に遭遇しました。ワークシートのコンボを模倣するために書いたVBAコードは本当にうまく戻ってきますが、falseではないようです。指定された範囲内にない値の代わりに、#value!エラー。これはデータ型の不一致に対する操作であるが、私はなぜそれがわかりません。

上記のワークシートのコンボのIFを使用して、ISNA関数の出力を反転します。あなたの検索が肯定的な結果のためにfalseを返すならば、少し混乱します。

私に知らせていただきありがとうございましたらお手伝いいただきありがとうございます。ここに私のコードです。それは何もすることができ、入力を求めるあなたのそれらのために

Public Function CompareLists(variable As Variant, list As Range, match_type As String) As Boolean 

    If Application.WorksheetFunction.IsNA(Application.WorksheetFunction.Match(variable,  list, match_type)) = False Then 

    CompareLists = True 

    Else 
     CompareLists = False 
    End If 

End Function 

* *。私は通常、何百というもののID番号を比較するためにこれを使用します。彼らはいつか文字と数字を含んでいます。

例では、1,2,3,4,5,6,7,8というリストの中の3を見つけようとしています.3は1つのシートにあり、リストは別のシートにあります。

+0

例を挙げることはできますか? – JimmyPena

+0

データ入力の例は?variable = ????、list example、match_type example? – Jon49

+0

例として、サンプル入力、関数に使用するサンプルパラメータ、およびそれらの入力の期待出力と実際の出力を提供するテストケースまたはウォークスルーを意味します。 – JimmyPena

答えて

2

このバージョン試してみてください:

Public Function CompareLists(variable As Variant, list As Range, match_type As Long) As Boolean 
    CompareLists = WorksheetFunction.IsNA(Application.Match(variable, list, match_type)) 
End Function 

名 "CompareListsは、" 私には混乱を招くようです。より正確な名前は次のようになります。

Public Function NotInList(variable As Variant, list As Range, match_type As Long) As Boolean 
    NotInList = WorksheetFunction.IsNA(Application.Match(variable, list, match_type)) 
End Function 

これは、より読みインラインます:あなたはループを使用して主張する場合

If NotInList(3, Range("A1:A8"), 0) Then 
' rest of code 
+0

愚かなワークシート関数を使用する代わりに、ちょうどそれについて考えていたはずです。これはループの正確な状況です....うーん。内部のif文を含むforループを使用しました。ケミストリーディグリーを使用してプログラミングしようとするとどうなるかを確認してください:P –

+1

これが問題を解決した場合は、答えの左上にある矢印をクリックしてください。 :) – aevanko

+0

私の機能は私のために働いたが、もしあなたがむしろループするなら、私のゲストになろう! – JimmyPena

1

(あなたのコメントに見られるように)、私は非常にあなたが範囲をダンプ示唆します最初にバリアント配列に追加します。

ここにループを持つサンプル関数があります。ユーザーが何かを主張しているときには自然であると感じるので、私はIsMissingと呼ぶことに注意してください。

Function IsMissing(ByVal search_value As Variant, _ 
        ByVal search_range As range) As Boolean 

Dim varray As Variant 
Dim i As Long, j As Long 
Dim found As Boolean 

varray = search_range.value 

For i = 1 To UBound(varray, 1) 
    For j = 1 To UBound(varray, 2) 
     If Len(varray(i, j)) <> 0 Then 
      If varray(i, j) = search_value Then 
       found = True 
      End If 
     End If 
    Next 
Next 

IsMissing = found 

End Function 

P.S.これは依然として最適化することができますが、私はそれを単純にしておきたいと思いました。私は空のセルで時間を無駄にしないように、セルの長さのチェックを追加しました。

+0

関数名は+1していますが、最後のIf文では、 "IsMissing = Not Found"は同じものではありませんか? – JimmyPena

+0

良い点JP(いつものように)。私は変数名を変更します! – aevanko

+0

私が言ったのは、あなたの関数の最後に、** IsMissing **の価値は常に**見つかった**の反対です。そのため、If-Else-End Ifステートメントの代わりに、 "IsMissing = Not found"を入れることができます – JimmyPena

関連する問題