2

私は、Excel の列にある個別の文字列の数を数えることを任されていました。後でGoogleで簡単に検索すると、次の式がここに見つかりました。

=SUM(IF(FREQUENCY(MATCH(B2:B10,B2:B10,0),MATCH(B2:B10,B2:B10,0))>0,1))

次のデータを検討してください。

A B C D A B E C

これで、match 関数は配列を返します (最初の引数が配列であるため)。

1 2 3 4 1 2 7 3

ここまでは順調ですね。私が理解していないのは、ここで FREQUENCY 関数がどのように機能するか、特に複製されたビンをどのように扱うかです (たとえば、ビン 1 は上記のデータで複製されます)。周波数関数の結果は次のとおりです。

2 2 2 1 0 0 1 0 0

ありがとう

タラス

4

2 に答える 2

2

編集:あなたのソリューションがどのように機能しているかに気づきました-これを反映するように修正されました。

FREQUENCY は、検索配列内のビンからエントリを検索しています。仕組みは次のとおりです。

検索配列: 1 2 3 4 1 2 7 3

ビン: 1 2 3 4 1 2 7 3

ビン 1 => 2 つの 1 がある => 2

ビン 2 => 2 が 2 つある => 2

ビン 3 => 3 が 2 つある => 2

ビン 4 => 1 つある 4 => 1

ビン 1 の繰り返し => 1 がすでにカウントされている => 0

ビン 2 の繰り返し => 2 がすでにカウントされている => 0

ビン 7 => 7 が 1 つある => 1

ビン 3 が繰り返された => 3 がすでにカウントされている => 0

つまり、値 1 の 2 番目のビンもゼロ以外であると予想されるため、同じビンを 2 回カウントすることはありません。しかし、それがどのように機能するかです-最初のビンの出現回数のみをカウントし、重複ビンはカウントしないため、ゼロより大きい値を持つ行の数は、個別のエントリの数を示します.

これは、役に立つと思われる別のアプローチです。個別の値の数を計算するために使用できます。

文字列範囲が B2:B10 であるとします。別の列に記入する

=(MATCH(B2,B$2:B2,1)-(ROW(B2)-ROW(B$2)))>0

下にコピーすると行が変わるため、2 行目は次のようになります。

=(MATCH(B3,B$2:B3,1)-(ROW(B3)-ROW(B$2)))>0

これは、現在の行に文字列の最初のインスタンスが含まれている場合に TRUE を示しています (数分待てば、何をしているかを理解できるはずです)。したがって、COUNTIF() で TRUE の数を数えると、個別の文字列の数を取得する必要があります。

于 2009-09-15T06:19:59.797 に答える
0

vbaルーチンを使用できます。

Sub Uniques()

    Dim rng As Range
    Dim c As Range
    Dim clnUnique As New Collection

    Set rng = Range("A1:A8")

    On Error Resume Next
    For Each c In rng
        clnUnique.Add c.Value, CStr(c.Value)
    Next c
    On Error GoTo 0

    MsgBox "Number of unique values = " & clnUnique.Count

End Sub

一意の結果を表示する必要がある場合は、コレクションをループしてワークシートに値を書き込むことができます。

于 2009-09-15T08:28:51.813 に答える