Générer un xml global à partir d'un template
Bonjour à tous,
Je dois générer un xml assez gros pour un logiciel spécifique, composé du même bloc qui se répète avec juste 1 paramètre qui varient.
J'ai dans un excel une colonne de paramètre, et mon "template" xml. Je cherche un moyen de faire une macro qui créerai un fichier xml avec un bloc par paramètre.
J'ai essayé de crée un mappage correct puis d'importer mes paramètres mais je n'y arrive pas. Voyez vous une solution ?
Ci joint le excel contenant les paramètres (pas très utile) et le "template" xml.
Merci d'avoir lu ce message !
bonjour
je ne trouve pas le template XML
pourrais-tu nous mettre ton fichier XML pour 1 paramètre ?
Il n'était pas accepté en .xml, j'ai donc fait un Word.
Désolé je n'avais pas vu qu'il était manquant. Le paramètre est : Property="X".
bonjour,
pourrais-tu nous mettre ton fichier XML pour 1 paramètre ?
Voilà le code xml appliqué au paramètre ETAGE, j'ai de plus ajouter des commentaires pour signaler le bloc à repéter pour chaque paramètre de la feuille excel.
Désolé pour ma maladresse je n'ai pas l'habitude de ce genre de forum !
Bonjour,
je ne trouve pas tes commentaires. Peux-tu m'indiquer où je peux les trouver ?
Bonjour,
Le fichier word xml était effectivement illisible, j'ai modifié mon message plus haut, c'est maintenant un word normal qui contient mon xml !
bonjour,
une proposition,
pour que cela fonctionne. convertir ton fichier test_param_ETAGE.docx
en fichier texte et le renommer modèle.xml
Option Explicit
Sub aargh()
Dim fso As Object, ts As Object
Dim i&, s&, s1&, dl& 'long
Dim r$, tv$, xml$, lmf$, f$, hdr$, ftr$ 'string
With Sheets("feuil1") '<- à adapter
dl = .Cells(Rows.Count, 1).End(xlUp).Row
lmf = "d:\downloads\modèle.xml" '<- à adapter
Set fso = CreateObject("scripting.filesystemobject")
Set ts = fso.OpenTextfile(lmf)
r = ts.readall
ts.Close
s = InStr(r, "<!--Bloc")
If s > 0 Then
hdr = Left(r, s - 1) 'partie fixe au début du fichier xml
s1 = InStr(s, r, "<!--Fin")
If s1 > 0 Then
tv = Mid(r, s, s1 - s - 1) 'bloc à répéter et à modifier
ftr = Mid(r, s1) 'partie fixe à la fin du fichier xml
xml = hdr
'on adapte la partie variable pour chaque paramètre
For i = 2 To dl
xml = xml & Replace(tv, "ETAGE", .Cells(i, 1))
Next i
xml = xml & ftr
f = "d:\downloads\fichierxml.xml" '<- à adapter
Set ts = fso.createTextfile(f, True)
ts.write xml
ts.Close
Else
MsgBox "<-- fin bloc: non trouvé dans modèle"
End If
Else
MsgBox "<--Bloc : non trouvé dans modèle"
End If
End With
End Sub
Merci pour ton travail ça marche super bien !
Le truc c'est que j'ai simplifié mon problème, dans le but de faire la généralisation moi-même.
Dans mon problème réel, il y a 3 paramètres : le premier qui s'appelle Paramètre justement, le deuxième Famille et le troisième est un code d'identification qui dépend de la famille (OST). De plus, il n'y a pas un seul bloc de code a répéter mais 3,. Le premier est comme dans mon exemple simplifié et ne dépend que d'un seul paramètre, mais les 2 autres dépendent respectivement de 2 et puis des 3 paramètres. Il y a une certaine structure générale à respectée donc mon code est maintenant devenu un peu compliqué, j'ai quand même essayé de le commenter un maximum, ainsi que le XML. Je me suis aussi permis de supprimer temporairement les IF de vérification du VBA pour que le code soit plus clair lors du dev.
Je suis coincé depuis maintenant plusieurs heures sur un beug que je n'arrive pas a résoudre et qui provient d'une application de la fonction Replace, qui donne une erreur 1004.
Je vois joint le fichier XML de base qui s'appelle generic-test, stocké dans un word, ainsi que le Excel qui n'a pas changer de nom, avec son code VBA inclu.
Merci encore pour le travail déjà accompli !
bonjour,
je ne pourrai pas m'occuper de ce cas avant 10 jours, tu peux me recontacter à ce moment-là si tu n'as pas de solution entretemps.
bonjour
tu as mis :
For j = 0 To dF 'on double boucle sur les familles, donc les ELEMENT sont a remplacer
temp2 = Replace(t2, "ELEMENT", .Cells(j, 2))
temp2 = Replace(temp2, "OST", .Cells(j, 3))
temp3 = Replace(t3, "ELEMENT", .Cells(j, 2))
xml2 = xml2 & temp2
xml3 = xml3 & temp3
Next j
remplace par ceci:
For j = 1 To dF 'on double boucle sur les familles, donc les ELEMENT sont a remplacer
temp2 = Replace(t2, "ELEMENT", .Cells(j, 2))
temp2 = Replace(temp2, "OST", .Cells(j, 3))
temp3 = Replace(t3, "ELEMENT", .Cells(j, 2))
xml2 = xml2 & temp2
xml3 = xml3 & temp3
Next j
le numero de row =0 n'existe pas
cordialement
Bonjour,
Je suis finalement arrivé à m'inspirer de ton code pour développer le mien, je vous joins un dossier qui contient le Excel et le template xml, le tout avec des chemins relatifs ! Il suffit donc d'ouvrir le dossier, puis le Excel, de remplir la feuille et de cliquer sur le bouton : le code xml est alors généré dans le dossier ! J'ai essayé d'annoter un maximum mon code.
Merci encore de vôtre aide !
Lucien
Bonjour
j'ai testé ton code mais il y a dans l'XML généré un souci:
--test1--> au lieu de <--test1-->
donc test1 n'est pas lu comme un commentaire
--test1-->
<Check ID="8f27859d-aa93-4596-990d-fd4dbc622ba4" CheckName="Controle que le parametre Etage existe" Description="" FailureMessage="Le paramètre Etage n'existe pas" ResultCondition="FailNoElements" CheckType="Custom" IsRequired="False" IsChecked="True">
<Filter ID="3baf0913-6637-4006-b92c-6c433b54a71b" Operator="And" Category="Parameter" Property="Etage" Condition="Defined" Value="True" CaseInsensitive="False" Unit="None" UnitClass="None" FieldTitle="" UserDefined="False" Validation="None" />
<Filter ID="2d94ba62-1582-489d-ac1b-05f5fe3e602d" Operator="And" Category="TypeOrInstance" Property="Is Element Type" Condition="Equal" Value="False" CaseInsensitive="False" Unit="None" UnitClass="None" FieldTitle="" UserDefined="False" Validation="None" />
</Check>
--test1-->
<Check ID="8f27859d-aa93-4596-990d-fd4dbc622ba4" CheckName="Controle que le parametre Lot existe" Description="" FailureMessage="Le paramètre Lot n'existe pas" ResultCondition="FailNoElements" CheckType="Custom" IsRequired="False" IsChecked="True">
<Filter ID="3baf0913-6637-4006-b92c-6c433b54a71b" Operator="And" Category="Parameter" Property="Lot" Condition="Defined" Value="True" CaseInsensitive="False" Unit="None" UnitClass="None" FieldTitle="" UserDefined="False" Validation="None" />
<Filter ID="2d94ba62-1582-489d-ac1b-05f5fe3e602d" Operator="And" Category="TypeOrInstance" Property="Is Element Type" Condition="Equal" Value="False" CaseInsensitive="False" Unit="None" UnitClass="None" FieldTitle="" UserDefined="False" Validation="None" />
</Check>
--test1-->
<Check ID="8f27859d-aa93-4596-990d-fd4dbc622ba4" CheckName="Controle que le parametre Zone existe" Description="" FailureMessage="Le paramètre Zone n'existe pas" ResultCondition="FailNoElements" CheckType="Custom" IsRequired="False" IsChecked="True">
<Filter ID="3baf0913-6637-4006-b92c-6c433b54a71b" Operator="And" Category="Parameter" Property="Zone" Condition="Defined" Value="True" CaseInsensitive="False" Unit="None" UnitClass="None" FieldTitle="" UserDefined="False" Validation="None" />
<Filter ID="2d94ba62-1582-489d-ac1b-05f5fe3e602d" Operator="And" Category="TypeOrInstance" Property="Is Element Type" Condition="Equal" Value="False" CaseInsensitive="False" Unit="None" UnitClass="None" FieldTitle="" UserDefined="False" Validation="None" />
</Check>
--test1-->
<Check ID="8f27859d-aa93-4596-990d-fd4dbc622ba4" CheckName="Controle que le parametre Wesh existe" Description="" FailureMessage="Le paramètre Wesh n'existe pas" ResultCondition="FailNoElements" CheckType="Custom" IsRequired="False" IsChecked="True">
<Filter ID="3baf0913-6637-4006-b92c-6c433b54a71b" Operator="And" Category="Parameter" Property="Wesh" Condition="Defined" Value="True" CaseInsensitive="False" Unit="None" UnitClass="None" FieldTitle="" UserDefined="False" Validation="None" />
<Filter ID="2d94ba62-1582-489d-ac1b-05f5fe3e602d" Operator="And" Category="TypeOrInstance" Property="Is Element Type" Condition="Equal" Value="False" CaseInsensitive="False" Unit="None" UnitClass="None" FieldTitle="" UserDefined="False" Validation="None" />
</Check>
<!--fintest1-->
cordialement
Effectivement il subsiste un problème de balise , le bloc de xml t1 démarre deux caractères trop tôt.
Il faut donc remplacer
t1 = Mid(r, s1, ss1 - s1 - 1)
Par
t1 = Mid(r, s1 - 2, ss1 - s1 - 1)
Effectivement il subsiste un problème de balise , le bloc de xml t1 démarre deux caractères trop tôt.
Il faut donc remplacer
t1 = Mid(r, s1, ss1 - s1 - 1)
Par
t1 = Mid(r, s1 - 2, ss1 - s1 - 1)