El Registro Federal de Contribuyentes (RFC) es una clave que requiere toda persona en México para realizar una actividad comercial y con la cual se podrá identificar al realizar el pago de impuestos. Para generar el RFC en Excel implementaremos el algoritmo de solución publicado por el Instituto Federal de Acceso a la Información.
¿Fórmula para generar RFC en Excel?
Es inevitable que los usuarios de Excel traten de encontrar una fórmula para generar el RFC sin embargo, dadas las características de generación de dicha clave, es totalmente impráctico el buscar una solución utilizando solamente las funciones de Excel especialmente para la generación de la homoclave.
Para implementar el algoritmo de solución publicado por el IFAI es necesario hacer uso de un lenguaje de programación así que crearemos una nueva función definida por el usuario (UDF) con código VBA que es el lenguaje de programación de Excel.
Pero no te preocupes si no eres un programador de Excel, al final del artículo encontrarás el vínculo para descargar el libro de trabajo que contiene la función que podrás utilizar para generar el RFC en Excel sin la necesidad de escribir una sola línea de código VBA.
Cómo generar el RFC de una persona
Todas las claves de RFC para personas físicas constan de 13 posiciones que son asignadas de la siguiente manera:
- Posición 1: Primera letra del apellido paterno.
- Posición 2: Siguiente vocal del apellido paterno.
- Posición 3: Primera letra del apellido materno.
- Posición 4: Primera letra del nombre.
- Posición 5 y 6: Últimos dos dígitos del año de nacimiento.
- Posición 7 y 8: Dos dígitos del mes de nacimiento.
- Posición 9 y 10: Dos dígitos del día de nacimiento.
- Posición 11 y 12: Dos posiciones para la clave diferenciadora de homonimia.
- Posición 13: Un dígito verificador.
Como puedes notar, los únicos datos que necesitamos para generar el RFC de una persona son el apellido paterno, apellido materno, nombre y fecha de nacimiento. Para nuestro ejemplo utilizaremos los siguientes datos de prueba:
Reglas para generar el RFC
En más de una ocasión nos encontraremos con algunas ambigüedades al momento de extraer las letras de los apellidos o nombres. Es por eso que debemos tener en cuenta las siguientes reglas al momento de generar el RFC:
- Si el nombre es compuesto, se considerará el primer nombre excepto cuando sea María o José, en cuyo caso se utilizará el segundo nombre.
- Si alguno de los apellidos es compuesto, se considerará la primera palabra para formar el RFC.
- Cuando en el nombre o apellidos figuren artículos, preposiciones, conjunciones o contracciones no se tomarán en cuenta para la generación del RFC.
- Cuando el apellido paterno se componga de una o dos letras entonces las letras del RFC se formarán de la siguiente manera: la primera letra del apellido paterno seguida de la primera letra del apellido materno y la primera y segunda letra del nombre.
- En caso de tener un solo apellido, las letras del RFC serán la primera y segunda letra del apellido más la primera y segunda letra del nombre.
- Cuando las cuatro letras del RFC formen una palabra inconveniente, la última letra será sustituida por una “X”.
El detalle de cada una de estas reglas podrás consultarlo en el documento publicado por el IFAI que mencioné al principio del artículo. Una vez establecidas las reglas podemos comenzar con la construcción del código que nos ayudará a determinar el RFC en Excel.
Dar formato al nombre y apellidos
La primera función que crearemos será para dar formato al nombre y apellidos de la persona de la cual obtendremos el RFC. Esta función será útil para convertir cualquier texto en letras mayúsculas y posteriormente reemplazar cualquier vocal acentuada, lo cual es de suma importancia porque el RFC no admite acentos. El código de la función que nos ayudará en ambos objetivos es el siguiente:
Private Function FormatoTextoRFC(ByVal texto As String) As String texto = UCase(texto) texto = Replace(texto, "Á", "A") texto = Replace(texto, "É", "E") texto = Replace(texto, "Í", "I") texto = Replace(texto, "Ó", "O") texto = Replace(texto, "Ú", "U") FormatoTextoRFC = texto End Function
Remover artículos y preposiciones
Otra función que necesitaremos implementar será la que nos ayude a suprimir los artículos, preposiciones, conjunciones y contracciones contenidas en el nombre o apellidos ya que, como lo establece la regla, dichas palabras no serán utilizadas en la generación del RFC. La solución será muy sencilla ya que colocaré todas las palabras a validar dentro de un arreglo y posteriormente reemplazaremos cualquier aparición dentro del texto proporcionado.
Private Function RemoverPalabras(ByVal texto As String) As String Dim palabras As Variant Dim i As Integer palabras = Array(" PARA ", " AND ", " CON ", " DEL ", " LAS ", " LOS ", _ " MAC ", " POR ", " SUS ", " THE ", " VAN ", " VON ", " AL ", " DE ", _ " EL ", " EN ", " LA ", " MC ", " MI ", " OF ", " A ", " E ", " Y ") texto = " " & texto For i = LBound(palabras) To UBound(palabras) texto = Replace(texto, palabras(i), " ") Next i RemoverPalabras = Trim(texto) End Function
Remover nombres frecuentes
En México, los nombres María y José son ampliamente utilizados, por lo que una de las reglas para calcular el RFC es omitir dichos nombres siempre y cuando la persona tenga un segundo nombre. Para realizar esta validación y reemplazo crearemos una función con el siguiente código:
Private Function RemoverNombres(ByVal texto As String) As String Dim nombres As Variant Dim i As Integer nombres = Array(" MARIA ", " JOSE ", " MA. ", " MA ", " J. ", " J ") If InStr(texto, " ") > 0 Then texto = " " & texto For i = LBound(nombres) To UBound(nombres) texto = Replace(texto, nombres(i), " ") Next i End If RemoverNombres = Trim(texto) End Function
Determinar las primeras letras del RFC
Las primeras cuatro posiciones del RFC son letras que obtenemos del nombre y apellidos, así que una vez que se hayan utilizado las funciones anteriores, podremos extraer las letras correspondientes para cada posición. Sin embargo, es necesario considerar que existen reglas adicionales que nos indican un trato especial en caso de tener un solo apellido o si el apellido paterno tiene una longitud de una o dos 3 letras. El código que realizará todas estas validaciones y obtendrá las letras de las primeras cuatro posiciones para el RFC será el siguiente:
Private Function LetrasRFC(ByVal nombre As String, _ ByVal paterno As String, _ ByVal materno As String) As String Dim vocales, vocal, letras As String Dim i As Integer vocales = "AEIOU" If Len(materno) = 0 Then letras = Left(paterno, 2) & Left(nombre, 2) ElseIf Len(paterno) < 3 Then letras = Left(paterno, 1) & Left(materno, 1) & Left(nombre, 2) Else For i = 2 To Len(paterno) If InStr(vocales, Mid(paterno, i, 1)) > 0 Then vocal = Mid(paterno, i, 1) Exit For End If Next i letras = Left(paterno, 1) & vocal & Left(materno, 1) & Left(nombre, 1) End If LetrasRFC = letras End Function
Sustituir palabras inconvenientes
Una vez que hayamos obtenido las cuatro primeras letras del RFC, será necesario validar si dichas letras forman alguna palabra inconveniente de nuestro idioma. Si encontramos alguna coincidencia, entonces la última letra será reemplazada por una “X”. El código para esta función (SustituirProhibidas) lo encontrarás en el archivo que descargarás al final del artículo.
RFC con homoclave en Excel
Por mucho tiempo la homoclave del RFC ha sido vista como aquellos caracteres que solamente el SAT podía asignar al momento de solicitar el RFC. Sin embargo, el documento publicado por el IFAI nos da los pasos a seguir para obtener las letras que dan origen a dicha homonimia.
A grandes rasgos, el proceso el siguiente. A cada letra del nombre y apellidos de la persona se les da una equivalencia numérica y entonces se multiplica digito por dígito para sumar el resultado a los anteriores. La suma acumulada final será truncada para obtener los últimos 3 dígitos y ser divididos por 34 y obtener tanto el cociente como el residuo que tendrán una equivalencia en letras que formarán las posiciones 11 y 12 del RFC. A continuación encontrarás el código que nos ayudará a obtener dichas posiciones del RFC:
Private Function Homoclave(ByVal nombre As String, _ ByVal paterno As String, _ ByVal materno As String) As String Dim nombreCompleto, cadenaNums, equivalencia, caracter As String Dim i, numero1, numero2, suma, cociente, residuo As Integer equivalencia = "123456789ABCDEFGHIJKLMNPQRSTUVWXYZ" nombreCompleto = nombre & " " & paterno & " " & materno For i = 1 To Len(nombreCompleto) caracter = Mid(nombreCompleto, i, 1) Select Case caracter Case " " cadenaNums = cadenaNums & "00" Case "&" cadenaNums = cadenaNums & "10" Case "Ñ" cadenaNums = cadenaNums & "40" Case "A" To "I" cadenaNums = cadenaNums & CStr(Asc(caracter) - 54) Case "J" To "R" cadenaNums = cadenaNums & CStr(Asc(caracter) - 53) Case "S" To "Z" cadenaNums = cadenaNums & CStr(Asc(caracter) - 51) End Select Next i cadenaNums = "0" & cadenaNums For i = 1 To Len(cadenaNums) - 1 numero1 = Val(Mid(cadenaNums, i, 2)) numero2 = Val(Mid(cadenaNums, i + 1, 1)) suma = suma + numero1 * numero2 Next i cociente = Int(Val(Right(CStr(suma), 3)) / 34) residuo = Val(Right(CStr(suma), 3)) Mod 34 Homoclave = Mid(equivalencia, cociente + 1, 1) & _ Mid(equivalencia, residuo + 1, 1) End Function
El dígito verificador del RFC
Para obtener la última posición del RFC se utilizará un método similar a la función anterior solo que en lugar de tomar como base el nombre y apellidos, se tomará en cuenta la cadena de texto de las 12 posiciones del RFC generadas hasta el momento. Se sustituirá cada una de las posiciones por un número equivalente y se realizará una multiplicación y suma de cada uno de ellos para obtener una suma total de la cual obtendremos el residuo de la división entre 11. El resultado se evaluará para conocer el dígito verificador a devolver.
Private Function DigitoVerificador(ByVal texto As String) As String Dim cadenaNums, caracter, digito As String Dim i, j, cont, numero, suma, residuo As Integer For i = 1 To Len(texto) caracter = Mid(texto, i, 1) Select Case caracter Case " " cadenaNums = cadenaNums & "37" Case "&" cadenaNums = cadenaNums & "24" Case "Ñ" cadenaNums = cadenaNums & "38" Case "A" To "N" cadenaNums = cadenaNums & CStr(Asc(caracter) - 55) Case "O" To "Z" cadenaNums = cadenaNums & CStr(Asc(caracter) - 54) Case "0" To "9" cadenaNums = cadenaNums & Format(caracter, "00") End Select Next i cont = 0 For j = 1 To 23 Step 2 numero = Val(Mid(cadenaNums, j, 2)) suma = suma + (numero * (13 - cont)) cont = cont + 1 Next j residuo = suma Mod 11 Select Case residuo Case 0: digito = "0" Case 10: digito = "A" Case Else digito = 11 - residuo End Select DigitoVerificador = digito End Function
Obtener el RFC en Excel
Una vez que hemos desarrollado todas las funciones para generar el RFC en Excel solo nos resta integrar dicha funcionalidad para obtener finalmente la clave. En las siguientes líneas de código se crea la función RFC la cual será la que utilizaremos desde nuestras hojas de Excel.
Public Function RFC(nombre As String, _ paterno As String, _ materno As String, _ nacimiento As Date) As String Dim nombreRFC, paternoRFC, maternoRFC, claveRFC As String 'Aplicar formato y remover palabras y nombres de textos nombreRFC = RemoverNombres(RemoverPalabras(FormatoTextoRFC(nombre))) paternoRFC = RemoverPalabras(FormatoTextoRFC(paterno)) maternoRFC = RemoverPalabras(FormatoTextoRFC(materno)) 'Generar las 4 primeras letras y sustituir palabras prohibidas claveRFC = SustituirProhibidas(LetrasRFC(nombreRFC, paternoRFC, maternoRFC)) 'Concatenar dígitos de fecha de nacimiento claveRFC = claveRFC & Format(nacimiento, "yymmdd") 'Generar homonimia y concatenar al RFC claveRFC = claveRFC & Homoclave(FormatoTextoRFC(nombre), _ FormatoTextoRFC(paterno), FormatoTextoRFC(materno)) 'Generar dígito verificador y concatenar al RFC claveRFC = claveRFC & DigitoVerificador(claveRFC) 'Devolver RFC final RFC = claveRFC End Function
Probar la creación del RFC en Excel
Ya que los datos de nuestro ejemplo son parte de una tabla de Excel, podemos probar la función recién creada insertando la siguiente fórmula:
=RFC([@Nombre], [@[Apellido Paterno]], [@[Apellido Materno]], [@Nacimiento])
Observa el resultado al copiar esta fórmula en la última columna de la tabla:
Descargar libro de trabajo
En el siguiente vínculo podrás descargar el libro de trabajo que he utilizado en la creación de la función RFC.
ADVERTENCIA: La creación de la función para generar el RFC en Excel se ha hecho en estricto apego a la información publicada por el IFAI, sin embargo hay ciertas reglas que no están suficientemente documentadas y por lo tanto puede existir alguna diferencia con el RFC otorgado por el Sistema de Administración Tributaria (SAT).