web-dev-qa-db-fra.com

Charger XML dans Excel via VBA

J'ai un peu de VBA qui charge un fichier XML via VBA. Cependant, quand il est importé, il se trouve dans une colonne et non dans une table. 

Lorsque je l'utilise manuellement via l'onglet Données, un avertissement s'affiche: il n'y a pas de schéma mais me demande si je souhaite qu'Excel en crée un basé sur les données source. Cela place ensuite toutes les données dans une table de Nice.

J'aimerais que cela se produise automatiquement dans mon code VBA actuel:

VBA ressemble à

      Sub refresh()

'--------------------------------1. Profile IDs-----------------------------------'


'date variables

Dim start_period As String
start_period = Sheets("Automated").Cells(1, 6).Value
Dim end_period As String
end_period = Sheets("Automated").Cells(1, 7).Value

'report id variable names
Dim BusinessplanningReportID As String

'--------------------------------REST queries--------------------------------'
Dim Businessplanning As String



'REST query values
Businessplanning = "URL;http://api.trucast.net/2/saved_searches/00000/pivot/content_volume_trend/?apikey=0000000&start=" + start_period + "&end=" + end_period + "&format=xml"




'--------------------------------------------Data connections-----------------------------------'
'key metrics
With Worksheets("Sheet1").QueryTables.Add(Connection:=Businessplanning, Destination:=Worksheets("Sheet1").Range("A1"))

  .RefreshStyle = xlOverwriteCells
  .SaveData = True

End With

Actuellement, les données se présentent alors comme ceci, non structurées. Comment puis-je transformer automatiquement cela en une table?

<result>
<entry>
<published_date>20130201</published_date>
<post_count>18</post_count>
</entry>

Merci,

::Solution finale::

 Sub XMLfromPPTExample2()
Dim XDoc As MSXML2.DOMDocument
Dim xresult As MSXML2.IXMLDOMNode
Dim xentry As MSXML2.IXMLDOMNode
Dim xChild As MSXML2.IXMLDOMNode
Dim start_period As String
    start_period = Sheets("Automated").Cells(1, 6).Value
    Dim end_period As String
    end_period = Sheets("Automated").Cells(1, 7).Value
Dim wb As Workbook
Dim Col As Integer
Dim Row As Integer


Set XDoc = New MSXML2.DOMDocument
XDoc.async = False
XDoc.validateOnParse = False
XDoc.Load ("http://api.trucast.net/2/saved_searches/0000/pivot/content_volume_trend/?apikey=00000&start=" + start_period + "&end=" + end_period + "&format=xml")
LoadOption = xlXmlLoadImportToList

Set xresult = XDoc.DocumentElement
Set xentry = xresult.FirstChild


Col = 1
Row = 1

For Each xentry In xresult.ChildNodes
 Row = 1


    For Each xChild In xentry.ChildNodes
      Worksheets("Sheet2").Cells(Col, Row).Value = xChild.Text
             'MsgBox xChild.BaseName & " " & xChild.Text
      Row = Row + 1
      'Col = Col + 1

          Next xChild
'Row = Row + 1
Col = Col + 1
Next xentry

End Sub
9
Fox87

LA MANIÈRE "HARD CODED" IS CECI:

À partir de cela 

<result>
   <entry>
      <published_date>20130201</published_date>
      <post_count>18</post_count>    
   </entry>
  <entry>
      <published_date>20120201</published_date>
      <post_count>15</post_count>    
   </entry>

et vous voulez obtenir un Excel avec deux colonnes:

**published_date** |  **post_count**
20130201       |           18
20120201       |           15

afin que nous puissions supposer que dans votre XML, vous aurez toujours 

<result><entry><Element>VALUE</Element><Element...n>VALUE</Element...n></entry>

IMPORTANT: Ouvrez l’éditeur VBA dans PowerPoint, Excel .. Word et ajoutez des références à "Microsoft XML, v3.0" (cette référence concerne Office 2000, vous pouvez en avoir d’autres). 

Source: http://vba2vsto.blogspot.it/2008/12/reading-xml-from-vba.html

Employee.XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<EmpDetails>
<Employee>
<Name>ABC</Name>
<Dept>IT-Software</Dept>
<Location>New Delhi</Location>
</Employee>
<Employee>
<Name>XYZ</Name>
<Dept>IT-Software</Dept>
<Location>Chennai</Location>
</Employee>
<Employee>
<Name>IJK</Name>
<Dept>HR Operations</Dept>
<Location>Bangalore</Location>
</Employee>
</EmpDetails>

CODE À LIRE CI-DESSUS XML

Sub XMLfromPPTExample()
Dim XDoc As MSXML2.DOMDocument
Dim xEmpDetails As MSXML2.IXMLDOMNode
Dim xEmployee As MSXML2.IXMLDOMNode
Dim xChild As MSXML2.IXMLDOMNode

Set XDoc = New MSXML2.DOMDocument
XDoc.async = False
XDoc.validateOnParse = False
XDoc.Load ("C:\Emp.xml")
Set xEmpDetails = XDoc.documentElement
Set xEmployee = xEmpDetails.firstChild
For Each xEmployee In xEmpDetails.childNodes
For Each xChild In xEmployee.childNodes
MsgBox xChild.baseName & " " & xChild.Text
Next xChild
Next xEmployee
End Sub

Dans votre cas, bien sûr, vous devez adapter votre routine:

résultat -> EmpDetails dans le code fourni
entrée -> Employé dans le code fourni 

plus tout autre ajustement nécessaire.


De cette manière, vous pouvez avoir autant d'éléments "d'entrée" et "d'enfants d'entrée" que vous voulez.

En fait, en parcourant tous les éléments de votre "entrée", vous obtiendrez votre COLONNE. Chaque nouvelle entrée est une nouvelle rangée.

Malheureusement, je n'ai pas d'Excel sur le MAC, alors je viens de mettre la logique, vous devriez vérifier votre propre nom ... de cette façon, vous construisez un tableau Excel sur la feuille de calcul souhaitée.

Dim col = 1; Dim row=1;

For Each xEmployee In xEmpDetails.childNodes
    col = 1
    For Each xChild In xEmployee.childNodes
       Worksheets("NAMEOFTHESHEET").Cells(col, row).Value = xChild.Text
       MsgBox xChild.baseName & " " & xChild.Text
       col = col + 1;
    Next xChild
row = row+1;
Next xEmployee

LA VOIE CORRET DEVRAIT ÊTRE CELLE-CI:

LoadOption: = xlXmlLoadImportToList?

Vous obtenez le XML à partir d'un appel d'URL, mais je vous suggère fortement d'essayer de travailler avec un fichier XML sur le disque au début et de vérifier s'il est correctement valide. Vous devez donc obtenir un exemple de code XML auprès de ce "WebService", puis l’enregistrer sur le disque. Essayez de le charger de la manière suivante:

   Sub ImportXMLtoList()
    Dim strTargetFile As String
    Dim wb as Workbook

         Application.Screenupdating = False
         Application.DisplayAlerts = False
         strTargetFile = "C:\example.xml"
         Set wb = Workbooks.OpenXML(Filename:=strTargetFile,        LoadOption:=xlXmlLoadImportToList)
         Application.DisplayAlerts = True

         wb.Sheets(1).UsedRange.Copy ThisWorkbook.Sheets("Sheet2").Range("A1")
         wb.Close False
         Application.Screenupdating = True
    End Sub
9
Madthew

J'ai utilisé quelques sections d'autres sections de code que j'ai trouvées. Le code ci-dessous invite l'utilisateur à sélectionner le fichier XML souhaité et lui permet simplement d'ajouter/importer le fichier sélectionné dans son mappage existant sans ouvrir de nouveau fichier.

Sub Import_XML()
'
' Import_XML Macro
'
    'Select the file
    Fname = Application.GetOpenFilename(FileFilter:="xml files (*.xml), *.xml", MultiSelect:=False)

    'Check if file selected
    If Fname = False Then
        Exit Sub
        Else

    End If

    'Import selected XML file into existing, custom mapping

    Range("B5").Select
    ActiveWorkbook.XmlMaps("Result_file_Map").Import URL:=Fname
End Sub
0
Joe