Excelでのコンマ区切りタグの頻度のカウント


2

学生が受講したセミナーとクラスのリストを含むExcelスプレッドシートがあります(要約すると)。

(A)___ClassName________|(B)_________Tags____________|
Astrobiology           | astro, bio, sci            |
Extremophiles          | chem, bio, sci             |
Human Space Habitation | astro, bio, med, engi, sci |  etc.

これから個々のタグを抽出し、上記のように、別のシート上の各タグに関連するカウントを取得できるようにしたいと思います。

__Tag__|_Frequency_|
astro  |     2     |
bio    |     3     |
sci    |     3     |
chem   |     1     |  etc.

私は関数のみを使用してこれを実行しようとしており、タグ文字列の一意のリストを取得できます(たとえば、「astro、bio、sci」)

{=INDEX(User1!Tags,MATCH(0,COUNTIF($A$1:A1,User1!Tags),0))}

しかし、タグ自体を正常に抽出することはできませんでした。可能な場合は「マクロ警告」なしでファイルを保持したいと思いますが、私は優れているのが初めてなので、これについて間違った方法で行っている場合はお知らせください!

これは可能ですか?

回答:


0

私はそれがあなたが求めていることを完全には確信していませんが、試してみます。「astro」「bio」という名前の各列を使用して、列Bの近くに別の列を作成します。そして、各列の下にこの式を使用します= FIND($ C $ 1; astro)exエラーでない場合は数値を表示し、各列の最後に= COUNT()を使用して、列Bでアストロが切断された時間を表示します。

これが役に立てば幸いです!!


これは機能しますが、一意のタグごとに列が必要ですよね?これまでに47の一意のタグがあり、ユーザーがエントリを追加するにつれてその数は増えていきます。列の追加プロセスを自動化できますか?
rcrdcsnv

マクロを使用せずにこれを実行できるかどうかは
わかり

0

タグ列を新しいシートにコピーしてから:

  1. ホーム>編集-検索と選択、[スペース](「1つの「文字」)の置換、すべて置換、OK、閉じる。
  2. [データ]> [データツール]-[テキストから列へ]、[区切り]、[次へ]の順に選択し、[カンマ]、[完了]をオンにします。
  3. AとBという2つの新しい列を挿入します。
  4. 47個の一意のリスト(上または「手動」のいずれか)を作成します。たとえば、新しく挿入されたColumnAで、Row1を開始します。
  5. B1の= COUNTIF(range、A1)および必要に応じてコピーします。ここで、rangeはすべての個々のタグエントリ(おそらくで始まるC1)を含む配列で、全体が固定参照(つまり「$」記号)で定義されます。
  6. 必要に応じて、シート全体、特殊/値のコピー/貼り付けを選択し、列Cおよび右側を削除します。
  7. セーブ。

最初のステップは必要ではないかもしれませんが、そうでなければカウントを妨げるスペースを削除することを意図しています。


0

だから私はこの質問に興味を持ち、マクロでそれを解決する方法を見つけ出したいと思いました。マクロを避けたいと言っていたのは知っていますが、これは関数だけでできるとは思いません。

以下のコードは、セルB2:B25をループします(これはパラメーターまたは選択したセルに編集または変更できますが、現時点ではこれが最も簡単に思えます)。KeyValueという名前のカスタムクラスを使用して、タグ名と出現回数を集約します。これは、Dictionaryオブジェクトを使用することで改善できますが、他のアドインが必要です。各セルからコンマ区切りタグを分離し、頻度をカウントします。次に、このリストを2番目のワークシートの最初の2列に出力します。

コードを追加するには、次の手順を実行する必要があります。まずワークブックで、開発者ツールバーを有効にし、そこからVisual Basicボタンをクリックする必要があります。次に、新しいクラスモジュールを追加して名前を付けKeyValueます。次のコードを貼り付けます。

Public Key As String
Public Value As Integer

Public Sub Init(k As String, v As Integer)
    Key = k
    Value = v
End Sub

次に、Sheet1に次のコードを追加します。

Public Sub CountTags()

    Dim kv As KeyValue
    Dim count As Integer
    Dim tag As String
    Dim tags As New Collection
    Dim splitTags As Variant

    For Each Cell In Sheet1.Range("B2:B25")
        ' Split the comma separated list and process each tag
        splitTags = Split(Cell.Value, ", ")
        For tagIndex = LBound(splitTags) To UBound(splitTags)
            tag = splitTags(tagIndex)

            ' If tag is in collection get new count otherwise start at 1.
            If Contains(tags, tag) Then
                Set kv = tags(tag)
                count = kv.Value + 1
                tags.Remove tag
            Else
                count = 1
            End If

            ' Add tag to the collection with its count.
            Set kv = New KeyValue
            kv.Init tag, count
            tags.Add kv, tag
        Next
    Next Cell

    Dim rowIndex As Integer
    rowIndex = 1

    For Each pair In tags
        Set kv = pair
        Sheet2.Cells(rowIndex, 1) = kv.Key
        Sheet2.Cells(rowIndex, 2) = kv.Value
        rowIndex = rowIndex + 1
    Next pair

End Sub

Private Function Contains(col As Collection, Key As Variant) As Boolean
    Dim obj As Variant
    On Error GoTo err
    Contains = True
    Set obj = col(Key)
    Exit Function
err:
    Contains = False
End Function

[実行]ボタンをクリックして、タグをカウントします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.