jueves, 22 de marzo de 2018

Construir un ordinal secuencial

Días atrás un usuario planteaba una cuestión interesante a través de un comentario.
Preguntaba por la forma de generar un ordinal secuencial tipo índice (apartados, subapartados, etc).
[...]Se trata de rellenar una serie en celdas vacias de la siguiente forma:
en celda A1 tengo 1.1 y en A2 rellene hacia abajo las celdas vacias con 1.1.1, 1.1.2, 1.1.3, etc; asi hasta que encuentre la proxima celda con 1.2 y rellene con 1.2.1, 1.2.2, 1.2.3, etc.
Es un archivo como con 4000 lineas que hay que rellenar de esa forma[...]


La idea que se me ocurrió fue hacerlo sin programación, buscando una fórmula que lograse este objetivo.. y aquí la muestro.

Sobre la siguiente distribución de datos en la columna A:

Construir un ordinal secuencial



Para agilizar el trabajo tras seleccionar el rango completo A1:A26 nos hemos ido a la opción Ir a Especial y luego seleccionar celdas en blanco.
En la celda activa A2 escribimos la fórmula buscada:
=IZQUIERDA(A1;SI(LARGO(A1)-LARGO(SUSTITUIR(A1;".";""))>1;ENCONTRAR(".";A1;ENCONTRAR(".";A1)+1)-1;LARGO(A1)))&"."&CONTAR.SI($A$1:A1;IZQUIERDA(A1;SI(LARGO(A1)-LARGO(SUSTITUIR(A1;".";""))>1;ENCONTRAR(".";A1;ENCONTRAR(".";A1)+1)-1;LARGO(A1)))&"*")


Donde obtenemos:

Construir un ordinal secuencial



La fórmula está dividida en dos partes.
Primera:
IZQUIERDA(A1;SI(LARGO(A1)-LARGO(SUSTITUIR(A1;".";""))>1;ENCONTRAR(".";A1;ENCONTRAR(".";A1)+1)-1;LARGO(A1)))

que nos devuelve, tras contar el número de puntos en el valor de celda anterior (en A1), los caracteres por la izquierda hasta ese punto.. de tal forma que mantenemos el cuerpo básico de cada elemento (1.100, 13.2, 1.13 ó 9876.345)

La segunda parte, bastante similar:
CONTAR.SI($A$1:A1;IZQUIERDA(A1;SI(LARGO(A1)-LARGO(SUSTITUIR(A1;".";""))>1;ENCONTRAR(".";A1;ENCONTRAR(".";A1)+1)-1;LARGO(A1)))&"*")

contabiliza las coincidencias previas con ese patrón básico (1.100, 13.2, 1.13 ó 9876.345), lo que nos retornará el creciente 1,2,3,4, etc. para cada elemento principal.


Tras ejecutar nuestra fórmula podemos comprobar el éxito de la operación.

2 comentarios: