Pregunta

¿Conoce usted a un Excel para calcular por la fórmula de una lista de valores únicos ?

E. g: un rango que contiene los valores de "red", "blue", "red", "green", "blue", "black"
y yo queremos tener como resultado "red, "blue", "green", "black" + finalmente, otras 2 celdas en blanco.

Ya he encontrado una manera de conseguir una calculada lista ordenada utilizando PEQUEÑAS o GRANDES, combinado con el ÍNDICE, pero me gustaría tener esta calculado tipo así, SIN el USO de VBA.

¿Fue útil?

Solución

Esta es una experiencia antigua, y existen algunas soluciones, pero se me ocurrió una fórmula más corta y simple que cualquier otra que encontré, y podría ser útil para cualquiera que pase por allí.

He nombrado la lista de colores Colors (A2: A7), y la fórmula de matriz puesta en la celda C2 es esto ( fijo ):

=IFERROR(INDEX(Colors,MATCH(SUM(COUNTIF(C$1:C1,Colors)),COUNTIF(Colors,"<"&Colors),0)),"")

Utilice Ctrl+Shift+Enter para ingresar la fórmula en C2 y copie C2 a C3: C7 .

Explicación con datos de muestra {" rojo " ;; " azul " ;; " rojo " ;; " verde " ;; " azul " ;; " negro "}:

  1. COUNTIF(Colors,"<"&Colors) devuelve una matriz (# 1) con el recuento de valores que son más pequeños que cada elemento en los datos {4; 1; 4; 3; 1; 0} (negro = 0 elementos más pequeños, azul = 1 ítem, rojo = 4 ítems). Esto se puede traducir a un valor de clasificación para cada elemento.
  2. COUNTIF(C$1:C...,Colors) devuelve una matriz (# 2) con 1 para cada elemento de datos que ya está en el resultado ordenado. En C2 devuelve {0; 0; 0; 0; 0; 0} y en C3 {0; 0; 0; 0; 0; 1} porque & Quot; black & Quot; es el primero en la clasificación y el último en los datos. En C4 {0; 1; 0; 0; 1; 1} indica & Quot; black & Quot; y todas las apariciones de " azul " ya están presentes.
  3. El SUM devuelve el valor de ordenación k-th , contando todas las ocurrencias de valores más pequeños que ya están presentes (suma de la matriz # 2).
  4. MATCH encuentra el primer índice del k-ésimo valor de clasificación (índice en la matriz # 1).
  5. El IFERROR es solo para ocultar el error #N/A en las celdas inferiores, cuando la lista única ordenada está completa.

Para saber cuántos elementos únicos tiene, puede usar esta fórmula regular :

=SUM(IF(FREQUENCY(COUNTIF(Colors,"<"&Colors),COUNTIF(Colors,"<"&Colors)),1))

Otros consejos

Ok, tengo dos ideas para ti. Esperemos que uno de ellos lo lleve a donde necesita ir. Tenga en cuenta que el primero ignora la solicitud de hacer esto como una fórmula, ya que esa solución no es bonita. Pensé que me aseguro de que la manera fácil realmente no funcione para ti; ^).

Usar el comando Filtro avanzado

  1. Seleccione la lista (o coloque su selección en cualquier lugar dentro de la lista y haga clic en Aceptar si aparece el cuadro de diálogo quejándose de que Excel no sabe si su lista contiene encabezados o no)
  2. Elegir datos / Filtro avanzado
  3. Elija " Filtre la lista, en el lugar " o " Copiar a otra ubicación "
  4. Haga clic en " Solo registros únicos "
  5. Haga clic en Aceptar
  6. Has terminado. Se crea una lista única en el lugar o en una nueva ubicación. Tenga en cuenta que puede grabar esta acción para crear una secuencia de comandos VBA de una línea para hacer esto que luego podría generalizarse para que funcione en otras situaciones para usted (por ejemplo, sin los pasos manuales enumerados anteriormente).

Uso de fórmulas (tenga en cuenta que estoy construyendo sobre la solución Locksfree para terminar con una lista sin agujeros)

Esta solución funcionará con las siguientes advertencias:

  • La lista debe estar ordenada (ascendente o descendente no importa). En realidad, eso es bastante preciso, ya que el requisito es que todos los elementos similares deben ser contiguos, pero la clasificación es la forma más fácil de alcanzar ese estado.
  • Se requieren tres columnas nuevas (dos columnas nuevas para los cálculos y una columna nueva para la nueva lista). Las columnas segunda y tercera podrían combinarse, pero lo dejaré como ejercicio para el lector.

    Aquí está el resumen de la solución:

    1. Para cada elemento de la lista, calcule el número de duplicados por encima de él.
    2. Para cada lugar en la lista única, calcule el índice del siguiente elemento único.
    3. Finalmente, use los índices para crear una nueva lista con solo elementos únicos.

    Y aquí hay un ejemplo paso a paso:

    1. Abrir una nueva hoja de cálculo
    2. En a1: a6 ingrese el ejemplo dado en la pregunta original (" rojo " ;, " azul " ;, " rojo " ;, " verde " ;, " azul " ;, " negro ")
    3. Ordenar la lista: coloque la selección en la lista y elija el comando ordenar.
    4. En la columna B, calcule los duplicados:
      1. En B1, ingrese " = IF (COUNTIF ($ A $ 1: A1, A1) = 1,0, COUNTIF (A1: $ A $ 6, A1)) " ;. Tenga en cuenta que & Quot; $ & Quot; en la celda, las referencias son muy importantes, ya que facilitará mucho el siguiente paso (completar el resto de la columna). El & Quot; $ & Quot; indica una referencia absoluta para que cuando el contenido de la celda se copie / pegue, la referencia no se actualizará (a diferencia de una referencia relativa que se actualizará).
      2. Utilice la copia inteligente para completar el resto de la columna B: seleccione B1. Mueva el mouse sobre el cuadrado negro en la esquina inferior derecha de la selección. Haga clic y arrastre hacia abajo hasta el final de la lista (B6). Cuando suelte, la fórmula se copiará en B2: B6 con las referencias relativas actualizadas.
      3. El valor de B1: B6 ahora debería ser " 0,0,1,0,0,1 " ;. Observe que el & Quot; 1 & Quot; las entradas indican duplicados.
    5. En la columna C, cree un índice de elementos únicos:
      1. En C1, ingrese " = Row () " ;. Realmente solo desea C1 = 1 pero usar Row () significa que esta solución funcionará incluso si la lista no comienza en la fila 1.
      2. En C2, ingrese " = IF (C1 + 1 < = ROW ($ B $ 6), C1 + 1 + INDEX ($ B $ 1: $ B $ 6, C1 +1), C1 + 1) & Quot ;. El & Quot; if & Quot; se utiliza para evitar que se produzca un #REF cuando el índice llega al final de la lista.
      3. Use una copia inteligente para completar C3: C6.
      4. El valor de C1: C6 debe ser " 1,2,4,5,7,8 "
    6. En la columna D, cree la nueva lista única:
      1. En D1, ingrese " = IF (C1 < = ROW ($ A $ 6), INDEX ($ A $ 1: $ A $6, C1), & Quot; & Quot;) & Quot ;. Y, el & "; Si &"; se está utilizando para detener el caso #REF cuando el índice va más allá del final de la lista.
      2. Use una copia inteligente para llenar D2: D6.
      3. Los valores de D1: D6 ahora deberían ser " black ", " blue ", " green " ;, " rojo ", " ", " " ;.

    Espero que esto ayude ...

        
  • Solución

    Creé una función en VBA para usted, por lo que puede hacerlo ahora de una manera fácil.
    Cree un módulo de código VBA (macro) como puede ver en este tutorial .

    1. Presione Alt+F11
    2. Haga clic para Module en Insert.
    3. Pegar código.
    4. Si Excel dice que su formato de archivo no es compatible con macros, guárdelo como Excel Macro-Enabled en Save As.

    Código fuente

    Function listUnique(rng As Range) As Variant
        Dim row As Range
        Dim elements() As String
        Dim elementSize As Integer
        Dim newElement As Boolean
        Dim i As Integer
        Dim distance As Integer
        Dim result As String
    
        elementSize = 0
        newElement = True
    
        For Each row In rng.Rows
            If row.Value <> "" Then
                newElement = True
                For i = 1 To elementSize Step 1
                    If elements(i - 1) = row.Value Then
                        newElement = False
                    End If
                Next i
                If newElement Then
                    elementSize = elementSize + 1
                    ReDim Preserve elements(elementSize - 1)
                    elements(elementSize - 1) = row.Value
                End If
            End If
        Next
    
        distance = Range(Application.Caller.Address).row - rng.row
    
        If distance < elementSize Then
            result = elements(distance)
            listUnique = result
        Else
            listUnique = ""
        End If
    End Function
    

    Uso

    Simplemente ingrese =listUnique(range) a una celda. El único parámetro es range que es un rango normal de Excel. Por ejemplo: A$1:A$28 o H$8:H$30.

    Condiciones

    • El <=> debe ser una columna.
    • La primera celda donde llame a la función debe estar en la misma fila donde comienza el <=>.

    Ejemplo

    Caso normal

    1. Ingrese datos y llame a la función.
      Ingrese datos y llame a la función
    2. Cultivarlo.
      Cultivarlo
    3. Voil & # 224 ;.
      Voilà

    Caja de celda vacía

    Funciona en columnas que tienen celdas vacías en ellas. Además, la función no genera nada (no errores) si sobrecarga las celdas (llamando a la función) en lugares donde no debería haber salida, como lo hice en el ejemplo anterior & Quot; 2. ¡Hazlo crecer! parte.

    Caja de celda vacía

    Una forma indirecta es cargar su hoja de cálculo de Excel en una hoja de cálculo de Google, usar la función ÚNICA (rango) de Google, que hace exactamente lo que desea, y luego guardar la hoja de cálculo de Google nuevamente en formato Excel.

    Admito que esta no es una solución viable para los usuarios de Excel, pero este enfoque es útil para cualquiera que quiera la funcionalidad y pueda usar una hoja de cálculo de Google.

    notó que es una pregunta muy antigua, pero la gente todavía parece tener problemas para usar una fórmula para extraer elementos únicos. Aquí hay una solución que les devuelve los valores.

    Digamos que tiene " rojo " ;, " azul " ;, " rojo " ;, " verde < !> quot ;, " azul " ;, " negro " en la columna A2: A7

    luego ponga esto en B2 como una fórmula de matriz y copie =IFERROR(INDEX(A$2:A$7;SMALL(IF(FREQUENCY(MATCH(A$2:A$7;A$2:A$7;0);ROW(INDIRECT("1:"&COUNTA(A$2:A$7))));ROW(INDIRECT("1:"&COUNTA(A$2:A$7)));"");ROW(A1)));"")

    entonces debería verse más o menos así; ingrese la descripción de la imagen aquí

    Incluso para obtener un valor único ordenado, se puede hacer usando la fórmula. Esta es una opción que puede usar:

    =INDEX($A$2:$A$18,MATCH(SUM(COUNTIF($A$2:$A$18,C$1:C1)),COUNTIF($A$2:$A$18,"<" &$A$2:$A$18),0))
    

    datos de rango: A2:A18

    fórmula en la celda C2

    Esta es una FORMULA DE ARRAY

    Pruebe esta fórmula en B2 celular

    =IFERROR(INDEX($A$2:$A$7,MATCH(0,COUNTIF(B$1:$B1,$A$2:$A$7),0),1),"")
    

    Después haga clic en F2 y la prensa Ctrl + Shift + Enter

    enter image description here

    Puede usar COUNTIF para obtener el número de ocurrencias del valor en el rango. Entonces, si el valor está en A3, el rango es A1: A6, entonces en la siguiente columna use IF (EXACT (COUNTIF (A3: $ A $ 6, A3), 1), A3, & Quot; "). Para el A4, sería IF (EXACT (COUNTIF (A4: $ A $ 6, A3), 1), A4, & Quot; & Quot;)

    Esto le daría una columna donde todos los valores únicos no tienen duplicados

    Suponiendo que la Columna A contiene los valores de los que desea encontrar una única instancia única, y tiene una fila de Encabezado, utilicé la siguiente fórmula. Si desea que se escale con un número impredecible de filas, puede reemplazar A772 (donde terminaron mis datos) con = DIRECCIÓN (COUNTA (A: A), 1) .

    = IF (COUNTIF (A5: $ A $ 772, A5) = 1, A5, " ")

    Esto mostrará el valor único en la ÚLTIMA instancia de cada valor en la columna y no asumirá ninguna clasificación. Se aprovecha la falta de absolutos para tener esencialmente una & Quot; ventana deslizante & Quot; de datos para contar. Cuando el conteo en la ventana reducida es igual a 1, esa fila es la última instancia de ese valor en la columna.

    La solución de Drew Sherman es muy buena, pero la lista debe ser contigua (sugiere una clasificación manual, y eso no es aceptable para mí). La solución de Guitarthrower es un poco lenta si el número de elementos es grande y no respeta el orden de la lista original: de todos modos, genera una lista ordenada.

    Quería el orden original de los elementos (que estaban ordenados por la fecha en otra columna), y además quería excluir un elemento de la lista final no solo si estaba duplicado, sino también por una variedad de otras razones. .

    Mi solución es una mejora en la solución de Drew Sherman. Del mismo modo, esta solución utiliza 2 columnas para cálculos intermedios:

    Columna A:

    La lista con duplicados y tal vez espacios en blanco que desea filtrar. Lo ubicaré en el intervalo A11: A1100 como ejemplo, porque tuve problemas para mover la solución de Drew Sherman a situaciones en las que no comenzó en la primera línea.

    Columna B:

    Esta fórmula generará 0 si el valor en esta línea es válido (contiene un valor no duplicado). Tenga en cuenta que puede agregar cualquier otra condición de exclusión que desee en el primer IF o como otro IF externo.

    =IF(ISBLANK(A11);1;IF(COUNTIF($A$11:A11;A11)=1;0;COUNTIF($A11:A$1100;A11)))
    

    Use una copia inteligente para llenar la columna.

    Columna C:

    En la primera línea encontraremos la primera línea válida:

    =MATCH(0;B11:B1100;0)
    

    Desde esa posición, buscamos el siguiente valor válido con la siguiente fórmula:

    =C11+MATCH(0;OFFSET($B$11:$B$1100;C11;0);0)
    

    Póngalo en la segunda línea y use una copia inteligente para llenar el resto de la columna. Esta fórmula generará un error N / D cuando no haya más iteraciones únicas que señalar. Aprovecharemos esto en la siguiente columna.

    Columna D:

    Ahora solo tenemos que obtener los valores apuntados por la columna C:

    =IFERROR(INDEX($A$11:$A$1100; C11); "")
    

    Use la copia inteligente para llenar la columna. Esta es la lista única de salida.

    También puedes hacerlo de esta manera.

    Cree los siguientes rangos con nombre:

    nList = the list of original values
    nRow = ROW(nList)-ROW(OFFSET(nList,0,0,1,1))+1
    nUnique = IF(COUNTIF(OFFSET(nList,nRow,0),nList)=0,COUNTIF(nList, "<"&nList),"")
    

    Con estos 3 rangos con nombre puede generar la lista ordenada de valores únicos con la fórmula a continuación. Se ordenará en orden ascendente.

    IFERROR(INDEX(nList,MATCH(SMALL(nUnique,ROW()-?),nUnique,0)),"")
    

    Deberá sustituir el número de fila de la celda justo encima del primer elemento de su lista ordenada única por el '?' personaje.

    ej. Si su lista ordenada única comienza en la celda B5, la fórmula será:

    IFERROR(INDEX(nList,MATCH(SMALL(nUnique,ROW()-4),nUnique,0)),"")
    

    Me sorprende que esta solución aún no haya aparecido. Creo que es uno de los más fáciles

    Asigne un encabezado a sus datos y colóquelos en un rango dinámico con nombre (es decir, si sus datos están en la columna A)

    =OFFSET($A$2,0,0,COUNTA($A:$A),1)
    

    Y luego cree una tabla dinámica, haciendo de la fuente su rango con nombre.

    Simplemente colocando el encabezado en la sección de filas y tendrás los valores únicos, ordena de la forma que quieras con la función incorporada.

    He pegado lo que yo uso en mi archivo de excel a continuación.Esta recoge los valores únicos de la gama L11:L300 y llenarlas de en la columna V, V11 adelante.En este caso tengo esta fórmula en la v11 y arrástrelo hacia abajo para obtener todos los valores únicos.

    =INDEX(L$11:L$300,MATCH(0,COUNTIF(V$10:V10,L$11:L$300),0))
    

    o

    =INDEX(L$11:L$300,MATCH(,COUNTIF(V$10:V10,L$11:L$300),))
    

    esta es una fórmula de matriz

    Recurrir a una tabla dinámica podría no contar como usando solo fórmulas pero parece más práctico que la mayoría de las otras sugerencias hasta ahora:

     SO1429899 ejemplo

    Recientemente me encontré con el mismo problema y finalmente lo descubrí.

    Usando su lista, aquí hay una pasta de mi Excel con la fórmula.

    Recomiendo escribir la fórmula en algún lugar en el medio de la lista, como, por ejemplo, en la celda C6 de mi ejemplo y luego copiarla y pegarla arriba y abajo en la columna, la fórmula debe ajustarse automáticamente sin necesidad para volver a escribirlo.

    La única celda que tiene una fórmula única diferente está en la primera fila.

    Usando su lista (" rojo " ;, " azul " ;, " rojo " ;, " verde < !> quot ;, " azul " ;, " negro "); Aquí está el resultado: ( No tengo un nivel lo suficientemente alto como para publicar una imagen, así que espero que esta versión txt tenga sentido )

    • [Columna A: Lista original]
    • [Columna B: Resultado de la lista única]
    • [Columna C: Fórmula de lista única]

      1. rojo, rojo, =A3
      2. azul, azul, =IF(ISERROR(MATCH(A4,A$3:A3,0)),A4,"")
      3. rojo, =IF(ISERROR(MATCH(A5,A$3:A4,0)),A5,"")
      4. verde, verde, =IF(ISERROR(MATCH(A6,A$3:A5,0)),A6,"")
      5. azul, =IF(ISERROR(MATCH(A7,A$3:A6,0)),A7,"")
      6. negro, negro, =IF(ISERROR(MATCH(A8,A$3:A7,0)),A8,"")

    Esto solo funciona si los valores están en orden, es decir, todos los " red " están juntos y todos los " azul " están juntos etc. suponga que sus datos están en la columna A que comienza en A2 - (No comience desde la fila 1) En el B2 escriba 1 En b3 escriba = if (A2 = A3, B2, B2 + 1) Arrastra hacia abajo la fórmula hasta el final de tus datos Todos & Quot; Rojo & Quot; será 1, todos " azul " será 2 todos " verde " serán 3 etc.

    En C2 escriba 1, 2, 3, etc., bajando la columna En D2 = OFFSET ($ A $ 1, MATCH (c2, $ B $ 2: $ B $ x, 0), 0) - donde x es la última celda Arrastre hacia abajo, solo aparecerán los valores únicos. - poner un poco de verificación de errores

    Para una solución que funciona para valores en múltiples filas y columnas, la siguiente fórmula me pareció muy útil, de http://www.get-digital-help.com/2009/03/16/unique-values-from-multiple -columns-using-array-formulas / Oscar en get-digital.help.com incluso lo revisa paso a paso y con un ejemplo visualizado.

    1) Dele al rango de valores la etiqueta tbl_text

    2) Aplique la siguiente fórmula de matriz con CTRL + MAYÚS + ENTRAR, a la celda B13 en este caso. Cambie $ B $ 12: B12 para referirse a la celda sobre la celda en la que ingresa esta fórmula.

        =INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0), 1)
    

    3) Copie / arrastre hacia abajo hasta obtener N / A.

    Si uno coloca todos los datos en las mismas columnas y usa la siguiente fórmula Fórmula de ejemplo: =IF(C105=C104,"Duplicate","Not a Duplicate")

    Pasos

    1. Ordenar los datos
    2. Añadir columna para la fórmula
    3. Comprueba si la celda es igual a la celda encima de ella
    4. Luego filtre Not a Duplicate
    5. Opcional: copie los datos calculados por la columna de fórmula y péguelos solo como valores (de esa forma, si comienza a eliminar datos, no comenzará a obtener errores
    6. NOTA / ADVERTENCIA: Esto solo funciona si clasifica los datos primero

    Fórmula de ejemplo: <=>

    Solución optimizada de VBScript

    Utilicé el código de totymedli pero lo encontré empantanado al usar rangos grandes (como lo señalaron otros), así que optimicé un poco su código. Si alguien está interesado en obtener valores únicos usando VBScript pero encuentra que el código de totymedli es lento al actualizar, intente esto:

        Function listUnique(rng As Range) As Variant
            Dim val As String
            Dim elements() As String
            Dim elementSize As Integer
            Dim newElement As Boolean
            Dim i As Integer
            Dim distance As Integer
            Dim allocationChunk As Integer
            Dim uniqueSize As Integer
            Dim r As Long
            Dim lLastRow  As Long
    
            lLastRow = rng.End(xlDown).row
    
            elementSize = 1
            unqueSize = 0
    
            distance = Range(Application.Caller.Address).row - rng.row
    
            If distance <> 0 Then
                If Cells(Range(Application.Caller.Address).row - 1, Range(Application.Caller.Address).Column).Value = "" Then
                    listUnique = ""
                    Exit Function
                End If
            End If
    
            For r = 1 To lLastRow
                val = rng.Cells(r)
                If val <> "" Then
                    newElement = True
                    For i = 1 To elementSize - 1 Step 1
                        If elements(i - 1) = val Then
                            newElement = False
                            Exit For
                        End If
                    Next i
                    If newElement Then
                        uniqueSize = uniqueSize + 1
                        If uniqueSize >= elementSize Then
                            elementSize = elementSize * 2
                            ReDim Preserve elements(elementSize - 1)
                        End If
                        elements(uniqueSize - 1) = val
                    End If
                End If
            Next
    
    
            If distance < uniqueSize Then
                listUnique = elements(distance)
            Else
                listUnique = ""
            End If
        End Function
    

    Seleccione la columna con valores duplicados, luego vaya a la pestaña Datos, luego Herramientas de datos seleccione eliminar duplicado seleccione 1) & Quot; Continuar con la selección actual & Quot; 2) Haga clic en el botón Eliminar duplicado .... 3) Haga clic en & Quot; Seleccionar todo & Quot; botón 4) Haga clic en Aceptar

    ahora obtienes la lista de valores únicos.

    Licenciado bajo: CC-BY-SA con atribución
    No afiliado a StackOverflow
    scroll top