Buscar dni por nombre desde Excel

Hola a toda mi linda gente de Perú! Hoy veremos cómo crear una aplicación en Excel para poder Buscar dni por nombre

Espero sea de su agrado esta publicación, y sin más preámbulos empecemos

Descarga el archivo ‘Buscar dni por nombre.xlsm’ al final de la publicación

Al igual que mis otras publicaciones, listaré los pasos a seguir para poder obtener el producto que necesitamos

Si tienes algún proyecto en logística o comercial, me interesaría participar. Puedes contactarme al correo Luisrojas@tutorialesexcel.com

M4ster VBA

Paso #1 – Diseñando la interfaz de búsqueda

Bueno vamos a realizar un pequeño diseño muy práctico, el cual nos ayudará a realizar la consulta

encontrar personas peru excel

Paso #2 – Conectarse a la web el eldni.com

Hace una semana publiqué diferentes páginas web desde donde podemos buscar información de personas (VER PUBLICACIÓN)

Usaremos una conexión a la página web eldni.com/buscar-por-nombres desde Excel, analizando rápidamente la web podemos ver que…

buscar dni de personas con nombre

…Tenemos un token, oculto en un input hidden, por lo que la comunicación con el servidor puede ser un poco difícil si lo vamos a hacer con el típico envío por POST

Para realizar una búsqueda debemos tener al menos un nombre y un apellido

buscar dni de personas nombres

Escribiremos el siguiente código entonces

With wLuisRojas
    If (IsEmpty(.Range("D4")) = True And IsEmpty(.Range("D6")) = True) Or (IsEmpty(.Range("D4")) = True And IsEmpty(.Range("D8")) = True) Then
         MsgBox "Error, debe ingresar un nombre y el apellido paterno", vbInformation, "TutorialesExcel.com"
         Exit Sub
    End If
    .Range("D13", "G" & Rows.Count) = Empty
End With

Después de validada la condición, debemos crear un objeto Internet Explorer (Ingresaremos la información por ID)

Dim ie As Object
With wLuisRojas
    If (IsEmpty(.Range("D4")) = True And IsEmpty(.Range("D6")) = True) Or (IsEmpty(.Range("D4")) = True And IsEmpty(.Range("D8")) = True) Then
        MsgBox "Error, debe ingresar un nombre y el apellido paterno", vbInformation, "TutorialesExcel.com"
        Exit Sub
    End If
    .Range("D13", "G" & Rows.Count) = Empty
    
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = 0: ie.navigate "https://eldni.com/buscar-por-nombres"
    
    Do
        DoEvents
    Loop Until ie.readyState = 4
    
    If Not IsEmpty(.Range("D4")) Then ie.document.getElementById("nombres").Value = .Range("D4")
    If Not IsEmpty(.Range("D6")) Then ie.document.getElementById("apellido_p").Value = .Range("D6")
    If Not IsEmpty(.Range("D8")) Then ie.document.getElementById("apellido_m").Value = .Range("D8")
    ie.document.getElementsByTagName("button")(0).Click
    ie.Quit
End With

Validamos si está vacío el rango D4, D6 y D8 antes de enviarlo al objeto internet explorer porque sino enviaríamos un valor indefinido

Paso #3 – Obtener el resultado de la consulta en HTML

Muy bien, el envío se hace mediante un POST, y la página recarga cada vez que realizamos una búsqueda (Demora varios segundos)

resultado búsqueda dni

Cada vez que realizamos una búsqueda, la página nos devuelve la palabra RESULTADO, esta palabra la usaremos en nuestro código

Dim ie As Object, pin As Boolean, Contenido$, i%, fila%
With wLuisRojas
    If (IsEmpty(.Range("D4")) = True And IsEmpty(.Range("D6")) = True) Or (IsEmpty(.Range("D4")) = True And IsEmpty(.Range("D8")) = True) Then
        MsgBox "Error, debe ingresar un nombre y el apellido paterno", vbInformation, "TutorialesExcel.com"
        Exit Sub
    End If
    .Range("D13", "G" & Rows.Count) = Empty
    
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = 0: ie.navigate "https://eldni.com/buscar-por-nombres"
    
    Do
        DoEvents
    Loop Until ie.readyState = 4
    
    If Not IsEmpty(.Range("D4")) Then ie.document.getElementById("nombres").Value = .Range("D4")
    If Not IsEmpty(.Range("D6")) Then ie.document.getElementById("apellido_p").Value = .Range("D6")
    If Not IsEmpty(.Range("D8")) Then ie.document.getElementById("apellido_m").Value = .Range("D8")
    ie.document.getElementsByTagName("button")(0).Click
End With


pin = False

Do
    DoEvents
    Application.Wait (Now + TimeValue("00:00:02"))
    Contenido = ie.document.getElementsByTagName("body")(0).innerHtml
    If InStr(UCase(Contenido), "RESULTADO") > 0 Then
        pin = True
    End If
Loop Until pin = True

Contenido = ie.document.getElementsByTagName("tbody")(0).innerHtml

ie.Quit

La variable Contenido inicialmente almacenará el código HTML del body, después de dar clic sobre el botón Buscar

He creado una variable Boolean llamada pin, que cambiará a True cuando el código encuentre la palabra RESULTADO en la variable Contenido, este proceso se hará cada dos segundos

Después de obtener el resultado de la web, la variable Contenido almacenará el valor del tbody de la tabla

Paso #4 – Limpiar la data recibida y listar en Excel

Continuando con el código anterior, necesitamos limpiar la data almacenada en la variable Contenido

Debemos tener en cuenta que también recibiremos publicidad por que es necesario eliminar esta parte

buscar personas son publicidad excel

Este código será de mucha utilidad

Public AlmacenFila() As String, DetalleFila() As String
Sub MTCBusqueda()
    ...
    Contenido = ie.document.getElementsByTagName("tbody")(0).innerHtml
    
    ie.Quit
    Contenido = Replace(Contenido, Chr(34), "")
    Contenido = Replace(Contenido, " scope=row", "")
    Contenido = Replace(Contenido, " class=text-left", "")
    Contenido = Replace(Contenido, "th", "td")
    Contenido = Replace(Contenido, Chr(10), "")
    Contenido = Replace(Contenido, Chr(13), "")
    Contenido = Replace(Contenido, "", "")
    Contenido = Replace(Contenido, "", "")
    Contenido = Application.WorksheetFunction.Trim(Contenido)
    AlmacenFila = Split(Contenido, "")
    fila = 13
    For i = LBound(AlmacenFila) To UBound(AlmacenFila)
        If listarAlmacen(AlmacenFila(i)) = True Then
            wLuisRojas.Range("D" & fila) = Application.WorksheetFunction.Trim(DetalleFila(0))
            wLuisRojas.Range("E" & fila) = Application.WorksheetFunction.Trim(DetalleFila(1))
            wLuisRojas.Range("F" & fila) = Application.WorksheetFunction.Trim(DetalleFila(2))
            wLuisRojas.Range("G" & fila) = Application.WorksheetFunction.Trim(DetalleFila(3))
            fila = fila + 1
        End If
    Next
    'asignarAlmacen Contenido
  
End Sub

Function listarAlmacen(InfoFila As String) As Boolean
    On Error GoTo sale
    DetalleFila = Split(InfoFila, "")
    If Len(DetalleFila(0)) > 150 Or Len(DetalleFila(0)) = 0 Then
sale:
        listarAlmacen = False
    Else
        listarAlmacen = True
    End If
End Function

Para eliminar la publicidad la función ListarAlmacen nos ayudará. Y toda la data la almacenaremos en arrays públicos

Y esto es todo, con este código ya hemos terminado, el código completo será

Public AlmacenFila() As String, DetalleFila() As String
Sub MTCBusqueda()
    Dim ie As Object, pin As Boolean, Contenido$, i%, fila%
    With wLuisRojas
        If (IsEmpty(.Range("D4")) = True And IsEmpty(.Range("D6")) = True) Or (IsEmpty(.Range("D4")) = True And IsEmpty(.Range("D8")) = True) Then
            MsgBox "Error, debe ingresar un nombre y el apellido paterno", vbInformation, "TutorialesExcel.com"
            Exit Sub
        End If
        .Range("D13", "G" & Rows.Count) = Empty
        
        Set ie = CreateObject("InternetExplorer.Application")
        ie.Visible = 0: ie.navigate "https://eldni.com/buscar-por-nombres"
        
        Do
            DoEvents
        Loop Until ie.readyState = 4
        
        If Not IsEmpty(.Range("D4")) Then ie.document.getElementById("nombres").Value = .Range("D4")
        If Not IsEmpty(.Range("D6")) Then ie.document.getElementById("apellido_p").Value = .Range("D6")
        If Not IsEmpty(.Range("D8")) Then ie.document.getElementById("apellido_m").Value = .Range("D8")
        ie.document.getElementsByTagName("button")(0).Click
    End With
    
    
    pin = False
    
    Do
        DoEvents
        Application.Wait (Now + TimeValue("00:00:02"))
        Contenido = ie.document.getElementsByTagName("body")(0).innerHtml
        If InStr(UCase(Contenido), "RESULTADO") > 0 Then
            pin = True
        End If
    Loop Until pin = True
    
    Contenido = ie.document.getElementsByTagName("tbody")(0).innerHtml
    
    ie.Quit
    Contenido = Replace(Contenido, Chr(34), "")
    Contenido = Replace(Contenido, " scope=row", "")
    Contenido = Replace(Contenido, " class=text-left", "")
    Contenido = Replace(Contenido, "th", "td")
    Contenido = Replace(Contenido, Chr(10), "")
    Contenido = Replace(Contenido, Chr(13), "")
    Contenido = Replace(Contenido, "", "")
    Contenido = Replace(Contenido, "", "")
    Contenido = Application.WorksheetFunction.Trim(Contenido)
    AlmacenFila = Split(Contenido, "")
    fila = 13
    For i = LBound(AlmacenFila) To UBound(AlmacenFila)
        If listarAlmacen(AlmacenFila(i)) = True Then
            wLuisRojas.Range("D" & fila) = Application.WorksheetFunction.Trim(DetalleFila(0))
            wLuisRojas.Range("E" & fila) = Application.WorksheetFunction.Trim(DetalleFila(1))
            wLuisRojas.Range("F" & fila) = Application.WorksheetFunction.Trim(DetalleFila(2))
            wLuisRojas.Range("G" & fila) = Application.WorksheetFunction.Trim(DetalleFila(3))
            fila = fila + 1
        End If
    Next
    'asignarAlmacen Contenido
  
End Sub

Function listarAlmacen(InfoFila As String) As Boolean
    On Error GoTo sale
    DetalleFila = Split(InfoFila, "")
    If Len(DetalleFila(0)) > 150 Or Len(DetalleFila(0)) = 0 Then
sale:
        listarAlmacen = False
    Else
        listarAlmacen = True
    End If
End Function

Descargar ‘Buscar DNI por nombre.xlsm‘ (Contraseña: tutorialesexcel.com)

Y eso ha sido todo, espero haber podido contribuir a tus conocimientos, cualquier duda o consulta me la puedes dejar en los comentarios o enviar un mensaje al correo LuisRojas@tutorialesexcel.com

Esta entrada tiene un comentario

  1. henry

    excelente aporte amigo!

Deja una respuesta