Reformatear un código alfanumérico al teclear: de NN1234567 a NN-12345-67
Esta semana surgió en la comunidad una duda muy práctica: cómo conseguir que al escribir un código tipo NN1234567 (dos letras seguidas de siete dígitos) la celda lo muestre como NN-12345-67. La primera tentación es el formato personalizado de celda, pero se descartó rápido: el formato de número solo trabaja sobre dígitos, no sobre las letras iniciales. A partir de ahí salieron varios enfoques, y la comparativa es interesante porque cubre desde la fórmula moderna hasta la macro automática.
Con REGEXREEMPLAZAR (versiones recientes de Excel)
La opción más compacta usa grupos de captura para trocear el texto y volver a unirlo con guiones:
``
=REGEXREEMPLAZAR(A1;"([A-Z]{2})(\d{5})(\d{2})";"\1-\2-\3")
`
Cada paréntesis del patrón es un grupo: \1 son las dos letras, \2 los cinco primeros dígitos y \3 los dos últimos. Funciona igual con mayúsculas o minúsculas.
Con funciones de texto clásicas (cualquier versión)
Para quien no tenga REGEXREEMPLAZAR, el mismo resultado sale combinando funciones de texto de toda la vida:
`
=EXTRAE(B3;1;2)&"-"&EXTRAE(B3;3;5)&"-"&EXTRAE(B3;8;2)
`
O mezclando IZQUIERDA y DERECHA en los extremos:
`
=IZQUIERDA(B3;2)&"-"&EXTRAE(B3;3;5)&"-"&DERECHA(B3;2)
`
Con VBA, para que se reformatee solo al teclear
Si lo que se busca es que la celda se transforme automáticamente sin fórmula auxiliar, se puede combinar una función personalizada (UDF) con una macro de evento. La UDF valida y formatea el código:
`
Function FormatoCodigo(ByVal valor As String) As String
Dim letras As String
Dim numeros As String
If Len(valor) <> 9 Then
FormatoCodigo = "ERROR"
Exit Function
End If
letras = Left(valor, 2)
numeros = Mid(valor, 3)
If Not (letras Like "[A-Za-z][A-Za-z]") Then
FormatoCodigo = "ERROR"
Exit Function
End If
If Not (numeros Like "#######") Then
FormatoCodigo = "ERROR"
Exit Function
End If
FormatoCodigo = UCase(letras) & "-" & Mid(numeros, 1, 5) & "-" & Mid(numeros, 6, 2)
End Function
`
Y la macro de evento, que va en el código de la hoja, reformatea la columna al escribir en ella:
`
Private Sub Worksheet_Change(ByVal Target As Range)
Dim celda As Range
Dim valor As String
Dim letras As String
Dim numeros As String
If Intersect(Target, Me.Range("A:A")) Is Nothing Then Exit Sub
Application.EnableEvents = False
On Error GoTo Salir
For Each celda In Intersect(Target, Me.Range("A:A"))
valor = Trim(celda.Value)
If valor = "" Or InStr(valor, "-") > 0 Then GoTo SiguienteCelda
If Len(valor) = 9 Then
letras = Left(valor, 2)
numeros = Mid(valor, 3)
If letras Like "[A-Za-z][A-Za-z]" And numeros Like "#######" Then
celda.Value = UCase(letras) & "-" & Mid(numeros, 1, 5) & "-" & Mid(numeros, 6, 2)
End If
End If
SiguienteCelda:
Next celda
Salir:
Application.EnableEvents = True
End Sub
``
La macro salta las celdas vacías o las que ya tienen guion (para no reprocesarlas) y desactiva los eventos mientras escribe, evitando bucles.
Tres caminos para el mismo objetivo: la fórmula REGEX para quien quiera algo de una línea, las funciones de texto para máxima compatibilidad, y el VBA para que el formateo sea automático al teclear.
El objetivo: dar formato a un código al vuelo
Surgió en la comunidad una duda muy práctica: al escribir un código del tipo NN1234567 —dos letras seguidas de siete dígitos— se quería que la celda lo mostrara como NN-12345-67. La primera tentación es el formato personalizado de celda, pero se descarta enseguida: el formato de número solo actúa sobre dígitos, no sobre las letras iniciales. Hacen falta otras herramientas, y aparecieron tres enfoques que cubren desde la fórmula moderna hasta la automatización.
Enfoque 1: funciones de texto de toda la vida
La opción más compatible —funciona en cualquier versión de Excel— trocea el código y lo vuelve a unir con guiones usando EXTRAE:
=EXTRAE(B3;1;2)&"-"&EXTRAE(B3;3;5)&"-"&EXTRAE(B3;8;2)Cada EXTRAE recorta un tramo: los caracteres 1 a 2 (las letras), del 3 al 7 (los cinco primeros dígitos) y del 8 al 9 (los dos últimos). El operador & los concatena intercalando los guiones. La misma idea sale combinando IZQUIERDA y DERECHA para los extremos:
=IZQUIERDA(B3;2)&"-"&EXTRAE(B3;3;5)&"-"&DERECHA(B3;2)Es legible, robusto y no depende de tener las funciones más recientes.
Enfoque 2: expresiones regulares
En las versiones modernas de Excel, REGEXREEMPLAZAR resuelve esto en una sola pasada. La idea es definir un patrón con tres grupos de captura —dos letras, un bloque de cinco cifras y un bloque de dos cifras— y reconstruir el texto colocando un guion entre cada grupo. Es la vía más compacta cuando el formato de entrada es siempre el mismo y quieres una fórmula de una línea. La contrapartida es que exige una versión reciente y que el patrón resulta menos legible para quien no domina las expresiones regulares.
Enfoque 3: que se reformatee solo al teclear (VBA)
Si lo que se busca es que la celda se transforme automáticamente, sin columna auxiliar, se combina una función personalizada con una macro de evento Worksheet_Change. La lógica es la siguiente:
- La función valida que el código tenga la longitud correcta y que las dos primeras posiciones sean letras y las siete siguientes, dígitos. Si algo no encaja, devuelve un aviso de error.
- La macro de evento vigila la columna de entrada. En cuanto escribes un código válido, lo sustituye por su versión con guiones.
- Dos precauciones hacen la macro fiable: saltar las celdas vacías o las que ya llevan guion (para no reprocesarlas) y desactivar los eventos mientras la macro escribe, evitando que se dispare a sí misma en bucle.
Este camino es el más cómodo para el usuario final —teclea y ya está— a cambio de tener que habilitar macros en el libro.
Funciones clave
EXTRAE: recorta un número de caracteres desde una posición dada.IZQUIERDA/DERECHA: recortan desde los extremos del texto.&: concatena los tramos con los guiones.REGEXREEMPLAZAR: reformatea con un patrón en una sola fórmula (versiones recientes).- VBA (
Worksheet_Change): automatiza el formateo en el momento de teclear.
Conclusión
Tres caminos para el mismo objetivo: las funciones de texto para máxima compatibilidad, las expresiones regulares para quien quiera una sola línea, y el VBA para que el formateo sea automático al escribir. Elegir depende de tu versión de Excel y de si prefieres una fórmula visible o una transformación silenciosa. Comparativas así, con varias soluciones sobre la misma mesa, son lo que la comunidad de Influexcel resuelve cada semana.
Más casos con estas funciones
Más contenido de Excel en InflueXcel
- Convertir archivos .xls a .xlsx en lote: VBA, Python y Power Automate CasoUn miembro de la comunidad tiene un sistema que genera archivos en formato .xls (Excel 97-2003) en una carpeta, y necesita convertirlos a .x
- Obtener la última tarifa (valor más a la derecha) con 5 fórmulas distintas CasoInteresante problema planteado por un miembro de la comunidad que trabaja con una tabla de artículos textiles (manteles, delantales, etc.) c
- Extraer datos de archivos XML complejos: Power Query, VBA y Power Automate CasoSergio plantea un problema real con datos abiertos del gobierno español: archivos XML de licitaciones públicas con más de 30 niveles de anid
- Descomposición de Cholesky con matrices dinámicas: de VBA a LAMBDA+REDUCE CasoJuan Pablo lanza un reto al grupo: tiene una descomposición de Cholesky resuelta con VBA y quiere saber si se puede hacer con matrices dinám
- Validar datos en Excel con máscaras de formato (sin VBA) TutorialValidar que un código, una matrícula o un NIF siguen el formato correcto suele acabar en una macro. No hace falta: con una función personali
- Del VBA a una sola fórmula: calcular el RFC mexicano con LET, MAP y expresiones regulares CasoHéctor 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
- Crear el árbol de carpetas del año desde Excel con una macro parametrizable CasoEsta vez no hay una pregunta que resolver: Héctor pasó por el grupo y dejó directamente la herramienta, una macro que crea en Windows la car
- Automatizar Excel con VBA y ChatGPT: de pedirle el código a integrar la API TutorialTres niveles de automatización con VBA, ordenados de menos a más, y los dos primeros no exigen saber programar. 1. Pedirle el código a ChatG
- IMPORTTEXT e IMPORTCSV: análisis exhaustivo de comportamientos ocultos CasoAndrés Rojas Moncada se lanzó a probar a fondo las nuevas funciones IMPORTTEXT e IMPORTCSV (aún en beta) y compartió con la comunidad un aná
- Conexiones en PowerQuery: El {M}ago Rafa y Nacho Cardenal TutorialSesión magistral con Rafael González y su dominio extremo del código M y powerquery