Leer archivos xml desde una macro de Excel

Recientemente me ha tocado hacer una que otras labores sobre Windows y toda la gama de herramientas que provee. Una de las tareas fue crear una pequeña macro que leyera varios archivos xml dentro de un directorio específico y cargase todos los datos leídos al archivo Excel.

Nunca había trabajado con eso, pero me guié de algunas referencias, no funcionaron, entonces me monté a crear uno propio que quedó parecido al siguiente ejemplo:

Sub ReadXML()
    Call leerXML
End Sub

Function leerXML()
    Dim mainWorkBook As Workbook
    Set mainWorkBook = ActiveWorkbook
    mainWorkBook.Sheets("Sheet1").Range("A:Z").Clear

    ' Rellenar cabecera de celdas
    mainWorkBook.Sheets("Sheet1").Range("A" & 1).Value = "Nombre"
    mainWorkBook.Sheets("Sheet1").Range("B" & 1).Value = "Apellido"
    mainWorkBook.Sheets("Sheet1").Range("C" & 1).Value = "Edad"
    mainWorkBook.Sheets("Sheet1").Range("D" & 1).Value = "Papá"
    mainWorkBook.Sheets("Sheet1").Range("E" & 1).Value = "Mamá"
    mainWorkBook.Sheets("Sheet1").Range("F" & 1).Value = "Núm. Identificación"
    
    ' Tratamiento de archivos XML
    linea = 2
    Set oXMLFile = CreateObject("Microsoft.XMLDOM")
    XMLFileName = Dir("C:\Users\Félix\Documents\datos_xml\*.xml")

    Do While Len(XMLFileName) > 0
        oXMLFile.Load ("C:\Users\Félix\Documents\datos_xml\" & XMLFileName)        

        ' Arbol de archivo
        Set nodo_raiz = oXMLFile.SelectNodes("/datos_personales")
        Set nodo_datos = oXMLFile.SelectNodes("/datos_personales/edad")
        Set nodo_parentesco = oXMLFile.SelectNodes("/datos_personales/padres")
        Set nodo_numeros = oXMLFile.SelectNodes("/datos_personales/info/numeros")

        ' Cargar datos nodo raiz
        For i = 0 To (nodo_raiz.Length - 1)
            nombre= nodo_raiz(i).getAttribute("nombre")
            apellido = nodo_raiz(i).getAttribute("apellido")
            mainWorkBook.Sheets("Sheet1").Range("A" & i + linea).Value = nombre
            mainWorkBook.Sheets("Sheet1").Range("B" & i + linea).Value = apellido
        Next i

        ' Cargar datos nodo datos
        For e = 0 To (nodo_datos.Length - 1)
            edad = nodo_datos(e).getAttribute("valor")
            mainWorkBook.Sheets("Sheet1").Range("C" & e + linea).Value = edad
        Next e
        
        ' Cargar datos nodo parentesco
        For r = 0 To (nodo_parentesco.Length - 1)
            padre = nodo_parentesco(r).getAttribute("padre")
            madre = nodo_parentesco(r).getAttribute("madre")
            mainWorkBook.Sheets("Sheet1").Range("D" & r + linea).Value = padre
            mainWorkBook.Sheets("Sheet1").Range("E" & r + linea).Value = madre
        Next r

        ' Cargar datos nodo numeros
        For c = 0 To (nodo_complemento.Length - 1)
            cedula = nodo_complemento(c).getAttribute("cedula")
            mainWorkBook.Sheets("Sheet1").Range("F" & c + linea).Value = cedula
        Next c

        linea = linea + 1
        XMLFileName = Dir
    Loop

End Function

El macro recoge los datos que vienen de cada atributo de una etiqueta específica, no recoge datos reales de etiquetas. Ha tomado datos de un archivo xml parecido al siguiente:



    
    
    
        
    

El macro es un tanto estático, pero funcional para lo que necesitaba realizar en ese momento.

Advertisements

About felixurbina

Humano con todos los defectos y virtudes que vienen de fábrica.
This entry was posted in Excel, Ofimática, Windows, XML. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s