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.

27test.xlsx (8.47 Ko)
45template.docx (12.34 Ko)

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.

7generic-test.docx (13.74 Ko)

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) 
Rechercher des sujets similaires à "generer xml global partir template"