sábado, 15 de enero de 2011

Asignar una numeración ordinal a una lista de valores.

Recientemente me llegó a través del mail la consulta de un lector que necesitaba dar una numeración ordinal a los diferentes valores de una lista con elementos repetidos:

...No sé cómo hacer para contar las cantidades conforme aparece en la columna "Rdo esperado", un sólo número o grupo de números de la columna "Número del documento", sólo representa aritméticamente una unidad. Es fácil cuando los datos a contar fueran como el del ejemplo (pequeño) pero; cuando es una columna de cientos de datos, ahí es mi problema, tengo que hacerlo manulamente y me demoro una eternidad...


Veamos el planteamiento de nuestro problema y cuál deberá ser el resultado esperado.


Antes de comenzar la explicación habrá que mencionar la exigencia para el correcto funcionamiento de la formulación, y es que se requiere que el listado de valores se encuentre previamente ordenado de menor a mayor.

Para facilitar la resolución de este problema añadiremos dos columnas auxiliares, con diferentes cálculos, antes de llegar al resultado final. Principalmente emplearé una función ya conocida por todos como es CONTAR.SI:
=CONTAR.SI(rango; criterio).
Será especialmente importante observar el uso que haremos de las referencias absolutas o relativas (i.e., el símbolo dolar $) sobre nuestros rangos de trabajo.

Nuestro primer cálculo, es decir, nuestra primera columna auxiliar, lo realizaremos con la siguiente fórmula:
=SI(CONTAR.SI($A$2:A2;A2)=1;1;0)


Con esto conseguimos determinar los elementos únicos de nuestra lista de valores. Observemos cómo el rango es movible según copiamos o arrastramos la fórmula hacia el final del rango de trabajo (A2:A20).

La segunda columna auxiliar nos devolverá un conteo acumulado de elementos únicos. Mediante la función
=SUMAPRODUCTO($B$2:B2;$B$2:B2)
que al igual que la anterior trabaja sobre un rango adaptado a cada fila de nuestro rango de trabajo.


De esta forma hemos obtenido la ordenación ordinal buscada, aunque repetida para cada elemento; por lo que nos falta un último paso.

El final de nuestro cálculo viene definido por la fórmula:
=SI(CONTAR.SI($A$2:A2;A2)=CONTAR.SI($A$2:$A$20;A2);C2;"")
que al igual que en las funciones anteriores empleamos una referencia fija y otra movible según arrastramos la función hasta el final del rango.
Con ésta conseguimos lo que nuestro lector quería, y en la posición solicitada. Tenemos la ordenación ordinal de cada elemento en la fila correspondiente.

5 comentarios:

  1. muy util es justo lo que necesitaba.
    Gracias

    ResponderEliminar
  2. tengo exactamente elmismo problema solo que en la columna A tengo nombres apellidos y no se que hacer por que enumerar uno por uno es aterrador

    ResponderEliminar
    Respuestas
    1. Hola,
      bueno, trabajar con textos es siempre algo más complejo, pero si tienes los Nombres ordenados, podrías aplicar en una columna auxiliar una fórmula asociando cada nombre a un valor, por ejemplo al de la fila en que se encuentra, teniendo cuidado de aplicarle un condicional para que cuando sea un nombre igual al anterior devuelva el valor de fila anterior.
      Asi conseguirías un listado de valores igual al del ejemplo, para poder aplicar el resto de la formulación.
      Slds

      Eliminar
  3. MI RPOBLEMA ES IGUAL PERO YO TENGO NUMEROS PREVIAMENTE ASIGNADOS Y NO SE PUEDEN ACOMODAR DE MENOR A MAYOR DEBEN QUEDAR EXACTAMENTE COMO ESTAN

    ResponderEliminar
    Respuestas
    1. Hola,
      en ese caso, te recomiendo alguien haga el trabajo por tí... me refiero a que sea una Tabla dinámica la que reordene internamente en su memoria esa basse de datos.
      Si a los valores desordenados le aplicas la columna Aux1 del ejemplo, y sobre ambas columnas generas una tabla dinámica con los valores en al área de fila y Aux1 al área de datos, Mostrado como Total en....
      Así veras numerados los elementos que componen tu rango de datos.
      Slds

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.