Frecuencia de recuento de etiquetas delimitadas por comas en Excel

2

Tengo una hoja de cálculo de Excel con una lista de seminarios y clases que los estudiantes han tomado que (cuando se resumen) se ve así:

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

Me gustaría poder extraer etiquetas individuales de esto y obtener un recuento asociado para cada etiqueta en otra hoja, de modo que para lo anterior:

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

He estado tratando de hacer esto solo usando funciones, y puedo obtener una lista única de cadenas de etiquetas (por ejemplo, "astro, bio, sci") usando

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

pero no he podido extraer las etiquetas con éxito. Me gustaría mantener el archivo "macro advertencia" sin errores, si es posible, pero soy nuevo en sobresalir, así que si estoy haciendo esto de la manera incorrecta, ¡hágamelo saber!

es posible?

rcrdcsnv
fuente

Respuestas:

0

No estoy completamente seguro de que eso es lo que estás preguntando, pero lo intentaré. Haga diferentes columnas cerca de la columna B con cada columna llamada "astro" "bio" .... Y use esta fórmula debajo de cada columna = ENCONTRAR ($ C $ 1; astro) ex si la palabra "astro" está en el texto mostrará un número si no es un error y al final de cada columna use el = COUNT () le mostrará las veces que se aserró el astro en la columna B.

Espero que esto haya ayudado !!

rexxar
fuente
Esto funcionaría, pero necesitaría una columna para cada etiqueta única, ¿verdad? Hasta ahora hay 47 etiquetas únicas, y ese número aumentará a medida que los usuarios agreguen más entradas. ¿Se puede automatizar el proceso de agregar columnas?
rcrdcsnv
No estoy seguro de que usted puede hacer esto sin macros y yo acabo de empezar a usarlos, así que no le puede proporcionar una solución
Rexxar
0

Copie su columna de etiquetas en una nueva hoja y luego:

  1. Inicio> Edición -Encontrar y Seleccionar, Reemplazar [espacio] ('un' carácter '), Reemplazar todo, Aceptar, Cerrar.
  2. Datos> Herramientas de datos - Texto a columnas, seleccione Delimitado, Siguiente, marque Coma, Finalizar.
  3. Inserte dos nuevas columnas, digamos A y B.
  4. Cree su lista de 47 exclusivos (ya sea desde arriba o 'manualmente'), digamos en la Columna A recién insertada, comenzando la Fila1.
  5. = COUNTIF ( rango , A1) en B1 y copie según sea necesario, donde rango es la matriz que contiene todas las entradas de etiquetas individuales (probablemente comenzando C1) y se define con referencias fijas en todo (es decir, signos '$').
  6. Seleccione la hoja completa, Copiar / Pegar Especial / Valores y elimine las columnas C y a la derecha, según sea necesario.
  7. Salvar.

Es posible que el primer paso no sea obligatorio, pero está destinado a eliminar espacios que de otro modo interferirían con el conteo.

nueces
fuente
0

Así que esta pregunta me intrigó y quise descubrir cómo resolverlo con una macro. Sé que dijiste que te gustaría evitar una macro, pero no creo que esto se pueda hacer solo con una función.

El siguiente código recorre la celda B2: B25 (esto se puede editar o cambiar a un parámetro o a las celdas seleccionadas, pero esto parece más fácil por ahora). Utiliza una clase personalizada llamada KeyValue para agregar el nombre de la etiqueta y el número de ocurrencias. Esto podría mejorarse con el uso de un objeto Diccionario pero eso requiere otros complementos. Separa las etiquetas delimitadas por comas de cada celda y cuenta la frecuencia. Luego genera esta lista en las dos primeras columnas de la segunda hoja de trabajo.

Para agregar el código debe hacer lo siguiente. Primero en el Libro de trabajo, debe habilitar la barra de herramientas del Desarrollador y desde allí hacer clic en el Visual Basicbotón. Luego agregue un nuevo Módulo de clase y asígnele un nombre KeyValue. Pega el siguiente código:

Public Key As String
Public Value As Integer

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

Luego, en la Hoja 1, agregue el siguiente código:

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

Haga clic en el botón Ejecutar para que cuente las etiquetas.

Brad Patton
fuente