Siguiente consecutivo alfanumérico: calcular matrículas con reglas de prioridad
Un miembro de la comunidad, J. Gil, planteó un problema clásico con un giro interesante: calcular el siguiente consecutivo de una matrícula alfanumérica tipo BAC99Y, donde cada posición tiene su propio rango y reglas de reinicio.
El esquema es el de las matrículas de coche antiguas: cuando una posición llega a su límite, se reinicia a su valor mínimo y la siguiente (de mayor prioridad) avanza. La dificultad está en manejar correctamente los extremos, donde varias posiciones cambian a la vez:
- BAC99Y → BAC00Z (el 99 reinicia a 00 y la Y pasa a Z)
- CZZ99Z → DAA00A (todas las posiciones encadenan el reinicio)
La comunidad propuso dos enfoques muy distintos.
Oscar: detectar la posición a incrementar con BUSCARX
``
=MAP(A2:A7;LAMBDA(a;LET(
w; EXTRAE(a;{4;6;3;2;1};{2;1;1;1;1});
x; BUSCARX(0;N(w={"99";"Z";"Z";"Z";"Y"});w);
SI.ND(SUSTITUIR(a;x;SI.ERROR(TEXTO(x+1;"00");CARACTER(CODIGO(x)+1)));"ERROR")
)))
`
Oscar descompone la cadena en sus 5 posiciones con EXTRAE y usa BUSCARX para encontrar la primera que no está en su valor máximo. A esa posición le suma 1 (numérica o alfabéticamente con CARACTER/CODIGO). Solución elegante y legible, pero no cubre el caso extremo donde varias posiciones cambian a la vez.
John: tratar la cadena como número en base 36
`
=MAP(A2:A7;LAMBDA(a;LET(
E; EXTRAE;
p; {4;6;3;2;1};
q; 1+(p=4);
w; E(a;p;q);
@FILTRAR(
REEMPLAZAR(a;p;q;SI(q=2;BASE(w+1;10;2);UNICAR(CODIGO(w)+1)));
w<>E("YZZ99Z";p;q);
"ERROR"
)
)))
`
John aborda el problema desde otra óptica: si se trata toda la cadena como un único número en base 36, el problema se reduce a sumar 1 respetando el orden de prioridad. Usa BASE para el tramo numérico y UNICAR/CODIGO para las posiciones alfabéticas, con FILTRAR como control del valor máximo (YZZ99Z).
Conclusión
El mismo problema admite enfoques radicalmente distintos según se piense en "posiciones independientes" (Oscar) o en "un único número con base mixta" (John). El archivo adjunto contiene el planteamiento original de J. Gil y la propuesta final de John con los ejemplos extremos ya resueltos.
Un recordatorio útil de que MAP + LAMBDA + LET son la combinación natural cuando hay que aplicar una lógica condicional a cada fila de un rango, y de que BASE/UNICAR/CODIGO` permiten trabajar con representaciones numéricas arbitrarias sin salir de la hoja.
El reto: el "siguiente" de un código alfanumérico
J. Gil planteó en la comunidad un problema clásico con un giro: calcular el siguiente consecutivo de una matrícula alfanumérica tipo BAC99Y, donde cada posición tiene su propio rango y sus reglas de reinicio. Es el esquema de las matrículas de coche antiguas: cuando una posición llega a su tope, vuelve a su valor mínimo y la posición de mayor prioridad avanza una unidad.
La dificultad está en los extremos, donde varias posiciones cambian a la vez:
BAC99Ypasa aBAC00Z: el99reinicia a00y laYavanza aZ.CZZ99Zpasa aDAA00A: el reinicio se encadena por todas las posiciones.
La comunidad propuso dos enfoques muy distintos, y la comparación es lo interesante.
Enfoque 1 (Oscar): localizar la posición a incrementar
La idea es descomponer la cadena en sus cinco posiciones con EXTRAE, detectar la primera que todavía puede crecer y sumarle uno —numérica o alfabéticamente—:
=MAP(A2:A7;LAMBDA(a;LET(
w; EXTRAE(a;{4;6;3;2;1};{2;1;1;1;1});
x; BUSCARX(0;N(w={"99";"Z";"Z";"Z";"Y"});w);
SI.ND(SUSTITUIR(a;x;SI.ERROR(TEXTO(x+1;"00");CARACTER(CODIGO(x)+1)));"ERROR")
)))BUSCARX busca la primera posición que aún no está en su valor máximo; a esa se le suma 1 con TEXTO si es numérica o con CARACTER/CODIGO si es una letra. Es una solución elegante y muy legible. Su límite: no cubre el caso extremo en el que varias posiciones se reinician a la vez.
Enfoque 2 (John): tratar la cadena como un número en base 36
John abordó el problema desde otra óptica. Si consideras toda la matrícula como un único número en base 36 (los dígitos 0 al 9 más las letras), calcular el siguiente consecutivo se reduce a "sumar uno" respetando el orden de prioridad, exactamente igual que al pasar de 99 a 100 en base 10. Para ello:
- Usa
BASEpara avanzar el tramo puramente numérico. - Usa
UNICARyCODIGOpara hacer avanzar las posiciones alfabéticas letra a letra. - Controla el valor máximo del sistema (
YZZ99Z) para devolver un aviso cuando ya no hay siguiente.
La ventaja de pensar en base mixta es que el encadenamiento de reinicios sale solo, sin tratar cada extremo como un caso especial.
Funciones clave
MAP+LAMBDA+LET: aplican una lógica condicional a cada fila de un rango, el patrón natural para este tipo de problema.EXTRAE: separa la cadena en sus posiciones.BUSCARX: localiza la primera posición que todavía puede incrementarse.BASE,UNICAR,CODIGO: permiten trabajar con representaciones numéricas y con letras dentro de la hoja.
Conclusión
El mismo problema admite enfoques radicalmente distintos según cómo lo pienses: como "posiciones independientes" que se incrementan una a una (Oscar) o como "un único número con base mixta" al que sumas uno (John). El segundo es más abstracto pero maneja los reinicios en cadena con naturalidad. Este contraste entre soluciones —cada una con sus ventajas— es justo lo que hace valiosa a la comunidad de Influexcel: no una respuesta, sino varias formas de mirar el mismo reto.
Más casos con estas funciones
Más contenido de Excel en InflueXcel
- Filtro multicriteria dinámico con LET, FILTRAR y LAMBDA CasoHector comparte con la comunidad una fórmula avanzada para filtrar una tabla de productos/servicios por múltiples criterios opcionales (clav
- Error #CALC con MAP y AGRUPARPOR: solución con REDUCE+APILARV CasoNuevo reto de Excel resuelto por la comunidad: un usuario necesita aplicar AGRUPARPOR de forma iterativa sobre un rango de códigos de cuenta
- Combinaciones de N elementos tomados de K en K: fórmulas con REDUCE y LAMBDA CasoSebas comparte un archivo con un listado de 11 elementos y necesita generar todas las combinaciones posibles tomados de 2 en 2 (sin repetici
- Del VBA a una sola fórmula: calcular el RFC mexicano con LET, MAP y expresiones regulares CasoHector llega al grupo con un problema que no se ve todos los días: tiene resuelto el cálculo del RFC mexicano, pero lo tiene en VBA, y quier
- Categorizar automáticamente conceptos con BUSCARX REGEX y MAP CasoUn miembro de la comunidad tiene una lista de compra (conceptos como "leche entera", "pan integral", etc.) y una tabla de categorías donde c
- Optimización de REDUCE+APILARV con LAMBDA recursiva en bisección CasoAlejandro plantea un reto de rendimiento interesante: tiene una fórmula LET enorme que calcula la permanencia de carga en puerto por matrícu
- Filtrar una tabla por una lista de valores: una LAMBDA propia y su inversa TutorialTe pasan una lista de 30 números de albarán y hay que sacar esas filas de una tabla de miles. Con el autofiltro es marcar casillas una a una
- Funciones personalizadas en Excel: LET, LAMBDA y recursividad TutorialCómo pasar de una fórmula escrita a mano a una función propia que puedes llamar por su nombre en cualquier libro. Los tres vídeos de esta pá
- Waffle chart y etiquetas dinámicas: gráficas de Excel que dicen más TutorialDos técnicas para que un gráfico deje de mostrar un número y pase a contar una historia. Ninguna necesita complementos. 1. Cuadro de mando c
- Consolidar e integrar ficheros con Power Query TutorialTodo lo que necesitas para dejar de copiar y pegar hojas y ficheros a mano. Siete tutoriales sobre cómo Power Query consolida, integra y com