2016-11-11 10 views
0

マクロを設定しようとしています。複数のリストを比較し、一意の値を持つクロステーブルを作成し、各リストに値が何回存在するかを表示します。TEXTをNUMBERに変換しないCountif

私はOKをしていますが、1つ例外があります。 Countif(s)の式=COUNTIFS(Source!$A$2:$A$5;[@Values])を使用する場合、「テキスト番号」(例えば001,00000002)を数字(1,2など)に変換します。私はこの動作を避け、変換せずに同じ値を正確に検索したいと思います。

例データ:

List1  List2 
1   0001 
0001 
2 
00000002 

私は今(WRONG)を取得しています何:

CompareListsWrong

私は(が期待される)を取得したいこと:
CompareListsExpected

私の質問:
「テキスト番号」を数値に変換することなく、リスト内の値を正確に数える方法を教えてください。

答えて

0

私は単純なUDFでこの問題を解決しました。

Function countifsExact(criteria_range As Range, criteria As String) As Long 
    Dim cell As Range 
    For Each cell In criteria_range 
     If cell = criteria Then 
      countifsExact = countifsExact + 1 
     End If 
    Next cell 
End Function 

EDIT1
私はWriting efficient VBA UDFs (Part 1) by Charles Williamsにし、Writing efficient VBA UDFs (Part 2) by Charles Williamsで与えられたアドバイスのいくつかを使用してUDFの別のバージョンを作りました。主
:代わり範囲のRange.Value2プロパティを使用してVBA変数

    • たびにVBAプログラム転送大きなオーバーヘッドを回避バリアント変数に一度Excelのセルからデータを条件範囲を格納します。値
    • excel MATCH関数を使用して、ソートされた範囲の開始点を取得し、値の終了を変更します。

    EDIT2
    しかし、より良い解決策のようなSUMPRODUCT式を使用することです:

    =SUMPRODUCT(--(EXACT(Source!$A$2:$A$5;[@Values]))) 
    
  • 1

    この配列数式はあなたのために適していることができます

    =MIN(SUMPRODUCT(IF(LEN($A$2:$A$5)=LEN(Table1[@Values]),1,0)),SUMPRODUCT(IF($A$2:$A$5=Table1[@Values],1,0))) 
    

    入れてCTRL +SHIFTが + を押します。 Table1[@Values]には、Table1があなたのテーブル名です。

    +0

    はあなたの式をいただき、ありがとうございます。私はVBAソリューションと一緒に行きました。 –

    関連する問題