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 contenido de Excel en InflueXcel