Fréquence de comptage des balises délimitées par des virgules dans Excel

2

J'ai une feuille de calcul Excel avec une liste de séminaires et de cours que les étudiants ont suivis et qui (abrégés) ressemblent à ceci:

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

J'aimerais pouvoir en extraire des étiquettes individuelles et obtenir un compte associé pour chaque étiquette d'une autre feuille, de sorte que pour ce qui précède:

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

J'essayais de faire cela uniquement en utilisant des fonctions, et je peux obtenir une liste unique de chaînes de balises (par exemple, "astro, bio, sci") en utilisant

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

mais je n'ai pas réussi à extraire les balises elles-mêmes. J'aimerais conserver le fichier "avertissement de macro", si possible, mais je suis nouveau pour exceller, alors si je m'y prends mal, faites-le-moi savoir!

Est-ce possible?

rcrdcsnv
la source

Réponses:

0

Je ne suis pas tout à fait sûr que ce soit ce que vous demandez, mais je vais l'essayer. Faites différentes colonnes près de la colonne B avec chaque colonne nommée "astro" "bio" .... Et utilisez cette formule sous chaque colonne = FIND ($ C $ 1; astro) ex si le mot "astro" est dans le texte, affichera un nombre sinon une erreur et à la fin de chaque colonne, utilisez = COUNT (), il vous indiquera les heures où astro est scié à la colonne B.

J'espère que cela a aidé !!

Rexxar
la source
Cela fonctionnerait, mais il me faudrait une colonne pour chaque balise unique, non? Jusqu'à présent, il y a 47 tags uniques, et ce nombre augmentera à mesure que les utilisateurs ajoutent plus d'entrées. Le processus d'ajout de colonne peut-il être automatisé?
Rcrdcsnv
Je ne suis pas sûr que vous puissiez le faire sans macros et je viens juste de commencer à les utiliser, donc je ne peux pas vous fournir de solution
Rexxar
0

Copiez la colonne de vos balises sur une nouvelle feuille, puis:

  1. Accueil> Édition -Find & Select, Remplacer [espace] ('un' caractère '), Remplacer tout, OK, Fermer.
  2. Données> Outils de données - Texte en colonnes, sélectionnez Délimité, Suivant, cochez Virgule, Fin.
  3. Insérez deux nouvelles colonnes, dites A et B.
  4. Créez votre liste de 47 uniques (à partir d’en haut ou manuellement), par exemple dans ColumnA insérée, à partir de Row1.
  5. = COUNTIF ( plage , A1) dans B1 et recopier selon les besoins, où plage est le tableau contenant toutes les entrées de balises individuelles (commençant probablement par C1), et est défini avec des références fixes tout au long (signes '$').
  6. Sélectionnez la feuille entière, Copier / Coller Spécial / Valeurs et supprimez les colonnes C et à droite, si nécessaire.
  7. Sauver.

La première étape peut ne pas être nécessaire mais est destinée à supprimer les espaces qui gêneraient autrement le comptage.

nuts
la source
0

Je me suis donc intrigué par cette question et je voulais trouver un moyen de la résoudre avec une macro. Je sais que vous avez dit que vous voudriez éviter une macro, mais je ne crois pas que cela puisse être fait avec une fonction seule.

Le code ci-dessous passe en boucle sur la cellule B2: B25 (cela peut être modifié ou modifié en un paramètre ou les cellules sélectionnées, mais cela semblait plus facile pour le moment). Il utilise une classe personnalisée nommée KeyValue pour agréger le nom de la balise et le nombre d'occurrences. Cela pourrait être amélioré avec l'utilisation d'un objet Dictionnaire, mais cela nécessite d'autres compléments. Il sépare les étiquettes délimitées par des virgules de chaque cellule et compte la fréquence. Ensuite, il affiche cette liste dans les deux premières colonnes de la deuxième feuille de calcul.

Pour ajouter le code, vous devez procéder comme suit. Tout d’abord sur le classeur, vous devez activer la barre d’outils Développeur puis, à partir de là, cliquez sur le Visual Basicbouton. Ajoutez ensuite un nouveau module de classe et nommez-le KeyValue. Collez dans le code suivant:

Public Key As String
Public Value As Integer

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

Ensuite, sur la feuille Sheet1, ajoutez le code suivant:

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

Cliquez sur le bouton Exécuter pour qu'il compte les tags.

Brad Patton
la source