Consulta SUNAT Excel VBA FULL

Un saludo a todos mis seguidores, hoy veremos veremos el tema Consulta SUNAT Excel, haremos consultas individuales y masivas

Muy bien, en publicaciones anteriores CONSULTA A LA PÁGINA DE SUNAT, mencioné los tipos de consulta que realizan muchos programadores a la web de SUNAT.

En aquel POST mencioné que la mejor forma de realizar consultas a la web de SUNAT es a través de un fallo en su código.

En la aplicación que desarrollaremos hoy, utilizaremos ese fallo, todo lo desarrollaremos desde VBA

Si bien lo ideal sería usar un lenguaje backend como PHP para aligerar el código, en este desarrollo utilizamos sólo VBA

Podría venderles este aplicativo, pero por el gran crecimiento que ha tenido la página, se los traigo completamente gratis.

Realizaremos el desarrollo en 4 sencillos pasos, los cuales son los siguientes:

Paso #1: Diseño de la interfaz con la interactuará el usuario

Realizaremos un diseño simple y amigable para que el usuario pueda tener una buena experiencia de uso

Trabajaremos con tres hojas ‘Individual‘,’Masiva‘ y ‘Config‘, en la hoja Config colocaré los campos a buscar, de ese modo el usuario sólo buscará lo que necesita, esto lo hago con el fin de reducir tiempos de procesamiento

En la búsqueda mostraré los siguientes campos

  • RAZON SOCIAL
  • CONDICION
  • NOMBRE COMERCIAL
  • TIPO
  • FECHA INSCRIPCION
  • ESTADO
  • DIRECCION
  • SISTEMA EMISION
  • ACTIVIDAD EXTERIOR
  • SISTEMA CONTABILIDAD
  • EMISION ELECTRONICA
  • COMPROBANTE ELECTRONICO
  • PLE
  • INICIO ACTIVIDADES
  • ACTIVIDAD ECONOMICA
  • ESTABLECIMIENTOS
  • REPRESENTANTES LEGALES
  • CANTIDAD TRABAJADORES

Paso #2: Programar función de consulta individual RUC SUNAT

Muy bien, lo que vamos a realizar primero es crear una función de tipo Boolean, que devolverá falso si en caso el número de RUC o DNI es incorrecto

Como mencioné líneas arriba, sólo usaré VBA, por lo que si vas a realizar miles de consultas, te sugiero que tengas un buen ordenador

Muy bien empecemos con el desarrollo, por favor muy atento

2.1 ¿Cómo leer el captcha SUNAT?

Si bien en publicaciones anteriores he enseñado a leer el captcha desde VBA (Leer publicación) en este caso no usaremos una extensión, sino utilizaremos una vulnerabilidad de SUNAT

Para tener más claro este concepto, explicaré cómo saltar el captcha de manera manual

Primero, si ingresamos al link https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/captcha?accion=image podemos visualizar el captcha a saltar

Si hacemos una leve modificación e igualamos a un random, quedaría así https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/captcha?accion=random

Captcha SUNAT RUC
Captcha SUNAT random

Este número el cual puede ser positivo o negativo, equivale al valor del captcha, si copiamos el número e ingresamos al siguiente link https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias?accion=consPorRuc&nroRuc=20419387658&numRnd=NÚMEROCOPIADO

Podremos visualizar la consulta RUC SUNAT

Saltar consulta SUNAT
Saltar consulta SUNAT

Después de lo explicado, ya sería sencillo saltar el captcha de SUNAT, pero antes debemos validar o generar el número de RUC, para ello usaremos un código anterior (Leer publicación)

Function ValidarRUC(RUC As String) As String
    Dim Respuesta As String, Temporal As Integer
    On Error GoTo sale
    
    If Len(RUC) <> 11 Then
        Respuesta = "Incorrecto"
    End If
    
    Temporal = Val(Left(RUC, 2))
    If Temporal <> 10 And Temporal <> 20 And Temporal <> 15 And Temporal <> 16 And Temporal <> 17 Then
        Respuesta = "Incorrecto"
    End If
    
    Dim suma As Integer, resto As Integer, complemento As Byte
    suma = Val(Mid(RUC, 1, 1)) * 5 + Val(Mid(RUC, 2, 1)) * 4 + Val(Mid(RUC, 3, 1)) * 3 + Val(Mid(RUC, 4, 1)) * 2 + Val(Mid(RUC, 5, 1)) * 7 + Val(Mid(RUC, 6, 1)) * 6 + Val(Mid(RUC, 7, 1)) * 5 + Val(Mid(RUC, 8, 1)) * 4 + Val(Mid(RUC, 9, 1)) * 3 + Val(Mid(RUC, 10, 1)) * 2
    resto = suma Mod 11
    complemento = IIf(resto = 1, 0, Val(Left(11 - resto, 1)))
    
    If Val(Mid(RUC, 11, 1)) = complemento Then
        ValidarRUC = "Correcto"
        Exit Function
    End If
sale:
    Respuesta = "Incorrecto"
    ValidarRUC = Respuesta
End Function

Function ConvertirDNIaRUC(DNI As String) As String
    If Len(DNI) <> 8 Then
        ConvertirDNIaRUC = "Error en DNI"
        Exit Function
    End If
    
    Dim RUC As String
    
    Dim suma As Integer, resto As Integer, complemento As Byte
    RUC = 10 & DNI
    suma = Val(Mid(RUC, 1, 1)) * 5 + Val(Mid(RUC, 2, 1)) * 4 + Val(Mid(RUC, 3, 1)) * 3 + Val(Mid(RUC, 4, 1)) * 2 + Val(Mid(RUC, 5, 1)) * 7 + Val(Mid(RUC, 6, 1)) * 6 + Val(Mid(RUC, 7, 1)) * 5 + Val(Mid(RUC, 8, 1)) * 4 + Val(Mid(RUC, 9, 1)) * 3 + Val(Mid(RUC, 10, 1)) * 2
    resto = suma Mod 11
    complemento = IIf(resto = 1, 0, Val(Left(11 - resto, 1)))
    
    ConvertirDNIaRUC = "10" & DNI & complemento

End Function

Muy bien, para realizar la búsqueda, consultaremos dos web constantemente, así que crearemos dos constantes

Const webSunat As String = "https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias"
Const CaptchaSunat As String = "https://e-consultaruc.sunat.gob.pe/cl-ti-itmrconsruc/captcha?accion=random"

Muy bien, con todo lo mencionado, ya podemos programar una función

2.1 Programando función para leer consulta RUC SUNAT

Muy bien. al código generado hasta el momento, le agregaremos lo siguiente:

Function ConsultaRUCSunat(nEnviado As String) As Boolean
    Dim caracteres As Byte, Validador As Boolean, nRUC$
    
    Dim Respuesta$, RespuestaTexto$, RespuestaHTML$, Captcha$, enviado$, Solicitud As Object
    
    Dim HTML As Object
    
    Dim i As Byte, n As Byte
    
    'Validación del número de RUC
        caracteres = Len(nEnviado)
        
        Select Case caracteres
            Case 8
                Validador = True
                nRUC = ConvertirDNIaRUC(nEnviado)
            Case 11
                If ValidarRUC(nEnviado) = "Correcto" Then
                    Validador = True
                    nRUC = nEnviado
                Else
                    Validador = False
                End If
                
            Case Else
                Validador = False
        End Select
        
        If Validador = False Then
            ConsultaRUCSunat = False
            Exit Function
        End If
    '--------------------------------
    
    'Obtener el captcha
        Set Solicitud = CreateObject("winhttp.winhttprequest.5.1")
        
        enviado = ""
        Solicitud.Open "POST", CaptchaSunat, False
        Solicitud.setrequestheader "Content-type", "application/x-www-form-urlencoded"
        Solicitud.send (enviado)
        Captcha = Solicitud.responseText
    '--------------------------------
    
    'Consulta Datos a web Consulta RUC
        'No creamos un nuevo objeto, porque debemos mantener la sesión
        
        enviado = "accion=consPorRuc&nroRuc=" & nRUC & "&numRnd=" & Captcha
        Solicitud.Open "POST", webSunat, False
        Solicitud.setrequestheader "Content-type", "application/x-www-form-urlencoded"
        Solicitud.send (enviado)
        Respuesta = Solicitud.responseText
    '--------------------------------
End Function

Solo abrimos una vez la solicitud para mantener la sesión, de abrirla nuevamente generaría un nuevo captcha

La variable Respuesta será igual al HTML devuelto de la consulta

Paso #3: Guardando la información consultada en un Array

Muy bien, ya tenemos la información que necesitamos en una variable tipo String, ahora sugiero que la información de los campos que necesitamos se guarden en un array

Public ConsultaSunat(19) As String

El array llamado ConsultaSunat(19) almacenará toda la información que necesitamos

Debido a que trabajaremos con etiquetas HTML, he creado cuatro funciones que nos ayudarán a realizar la limpieza

3.1 Funciones VBA para la limpieza HTML – Web scraping

Función para limpiar los option del HTML

Function LimpiarOptionHTML(Valor As String) As String
    Dim posi&, posf&, HTML$, Tborrado$
    On Error Resume Next
    HTML = Valor
    'Extraer contenido del Select
        posi = InStr(HTML, "")
        HTML = Mid(HTML, posi, posf - posi)
    '--------------------------------
    
    'Establecer el delimitador
        HTML = Replace(HTML, " 

Función para eliminar etiquetas HTML

Function eliminarEtiquetasHTML(HTMLenviado As String) As String
    Dim posi&, posf&, HTML$, Tborrado$
    
    HTML = HTMLenviado
    posi = InStr(HTML, "<")
    While posi > 0
        posf = InStr(HTML, ">")
        Tborrado = Mid(HTML, posi, posf - posi + 1)
        HTML = Replace(HTML, Tborrado, "")
        posi = InStr(HTML, "<")
    Wend
    eliminarEtiquetasHTML = HTML
End Function

Función para eliminar comentarios en HTML

Function eliminarComentariosHTML(Valor As String) As String
    Dim posi As Long, posf As Long, HTML As String, Tborrado As String
    HTML = Valor
    posi = InStr(HTML, "")
        Tborrado = Mid(HTML, posi, posf - posi + 3)
        HTML = Replace(HTML, Tborrado, "")
        posi = InStr(HTML, "


	




Esta entrada tiene 29 comentarios

  1. Joel

    Estimado Luis, agradezco la información compartida. Abusando de tu confianza quería saber si se puede agregar los padrones del proveedor. Muchas gracias!

  2. C.P.C. Luis Eduardo Otoya Zurcher

    GRACIAS AMIGO.. DE VERDAD QUE TE PASASTEIS , TE CUENTO QUE HE ESTADO EN ESTO DESDE QUE EMPESO LA PANDEMIA Y NADA Y AHORA GRACIAS A TI PUEDO CONTINUAR CON MI PROYECTO, DE VERDAD QUE TE FELICITO POR TU DESPRENDIMIENTO

    1. Hola Milton, no se puede realizar con esa página, a menos que se tenga el key del recaptcha
      El recaptcha protege las web de consultas masivas de aplicaciones

  3. Manuel Huaman

    Buen día Luis, excelente aporte el que nos estas brindando, y con el deseo de mejorar este proyecto te comento que agregue una linea al codigo y modifique otra:
    1.- En «Sub ConsultaMasiva()» al recorrer el listado de RUC modifique la variable a esto «ndocumento = Format(wMasiva.Range(«A» & i), «00000000»)», para que al consultar un DNI que empiece con cero «0» no se detenga la macro.
    2.- En «Sub AsignarValorCSunat» agregue «On Error Resume Next» para que la macro no se detenga al encontrar un DNI que no tenga RUC y pueda continuar con la siguiente consulta.
    Lo que no puedo hacer y seria interesante integrar es que imprima el texto «No tiene RUC» en la columna de Razón Social antes de continuar con la siguiente consulta.

    PD. mi nivel de macros es muy básico, y gracias a tus aportes voy mejorando.
    Saludos.

  4. Antonny

    Hola ya vi el error
    este ruc 10084763590, segun sunat no existe.
    Pero cuando colocas ese mismo ruc en la hoja de masivos y le das buscar, no muestra el mensaje de ruc no existe, si no que lo ejecuta, lo trata de buscar y no lo encuentra, y al final muestra DEPURAR.
    en este caso como se haria, la macros deberia de continuar ejecutandose y no mostrar nada y continunar buscando los demas rucs.

  5. DIEGO

    Hola Luis, a fecha de hoy 21/06/2020 esta Macro Excel de Consulta RUC no está funcionando, ya que «No Encuentran» los Números de RUC cuando se genera la búsqueda, podrías actualizar esta útil Macro Excel por favor.
    De antemano, muchas gracias.

    1. ROSY

      Tienes toda la razón. No está funcionando.

  6. fernando

    me sale error 10001 en tiempo de ejecucion
    Error Parsing JSON

  7. Alvaro Antonio

    El programa esta desactualizado, o sunat cambio algo, no sale el reporte, como lo indica Abraham Monasterio, no da resultados, baje el que indicas y nada, igual sale en datos la direccion de la pagina Web, Saludos

  8. DIEGO

    Hola Luis, gracias por la macro que pones a nuestra disposición muy amablemente. He observado que cuando se pone un Número de RUC equivocado en la Pestaña «Búsqueda masiva» se cuelga la Macro por ejemplo pones este RUC: 20423555482 que es un RUC que no existe y pienso que debería aparecer un Mensaje por Ejm: «N° RUC Incorrecto» y detenerse la macro, sin embargo la macro sigue procesando por mucho tiempo y finalmente se cuelga y me obliga a cerrarlo. Podrías ser tan amable de corregir ese error. De antemano, muchas gracias.

  9. Abraham Monasterio

    Hola, descargué tu archivo, y me al hacer la búsqueda, me devuelve tu pagina web.

  10. Joel

    Hola, como podríamos poner todas las actividades del comercia así mismo las emisiones de comprobante en un ComBox tal como se muestra en la pagina de la SUNAT.
    Gracias

    1. Programador

      Hola Joel, tendría que analizar la página en donde se muestra ésta información, me puedes enviar el link de consulta por éste medio?

  11. JORGE

    Muchas gracias por el gran aporte, en serio que me ayuda a poder seguir con mi proyecto. Se puede tomar códigos para poder adicionarle a mi herramienta de trabajo, mejor dicho si puedo agregarle más cosas.

    1. Programador

      De nada Jorge :), si puedes compartir mi publicación me ayudarías mucho

  12. Carlos Diaz

    EXCELente tu Programa muchas gracias, me ayuda mucho. Un abrazo.

  13. Mediano

    Me gusta el aplicativo, pero me gustaría contactarlo porque deseo saber si le puede agregar otros datos

  14. Andrés García

    Luis muuuuchas gracias! Justo necesitaba un aplicativo de consultas SUNAT
    Muchas muchas gracias

    1. Luis Rojas

      De nada Andrés, pronto haré un nuevo aplicativo SUNAT que muestre mayor detalle 🙂

Deja una respuesta