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
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
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