[VBA] macro selection plage/ assemblage texte+données / export xml

ornicus

XLDnaute Nouveau
Bonjour,

Afin de communiquer avec un logiciel, je peux lui importer une liste d'éléments à traiter via un fichier xml.
Donc le logiciel lit du xml et j'obtiens mes données d'entrées ailleurs, depuis un fichier excel.
Actuellement, j'ai crée une feuille excel qui me permet d'extraire les données dont j'ai besoin, de les mettre au format lisible par le logiciel et d'exporter le tout en xml mais ça c'est de la programmation "bricolage", j'aimerai créer une macro VBA plus "propre". Mais vu que je débute en VBA, j'ai besoin de votre aide.

Donc en gros, le rôle de la macro est de récupérer des données depuis un fichier excel et les insérer dans un fichier xml. Je détaillerai la liste des opérations plus loin.

Voici la structure du fichier xml que je veux obtenir:

<?xml version="1.0" encoding="UTF-8"?>
<savedSearch name="Trouble_excel_list" objectTypeClassName="ext.airbus.dmutr.dmutrouble.DMUTroubleLight"><savedCriteria sortIndex="0" attribute="objectUid" relationalComparator="=" value="T000000000" /><savedCriteria sortIndex="1" booleanOperator="|" attribute="objectUid" relationalComparator="=" value="T000011524 "/><savedCriteria sortIndex="2" booleanOperator="|" attribute="objectUid" relationalComparator="=" value="T000053144 "/><savedCriteria sortIndex="3" booleanOperator="|" attribute="objectUid" relationalComparator="=" value="T000022876 "/>

Ceci est un exemple avec une liste de 3 éléments à traiter. Pour des raisons de lisibilité, je vais insérer des retours à la ligne:

<?xml version="1.0" encoding="UTF-8"?>
<savedSearch name="Trouble_excel_list" objectTypeClassName="ext.airbus.dmutr.dmutrouble.DMUTroubleLight">
<savedCriteria sortIndex="0" attribute="objectUid" relationalComparator="=" value="T000000000" />

<savedCriteria sortIndex="1" booleanOperator="|" attribute="objectUid" relationalComparator="=" value="T000011524 "/>
<savedCriteria sortIndex="2" booleanOperator="|" attribute="objectUid" relationalComparator="=" value="T000053144 "/>
<savedCriteria sortIndex="3" booleanOperator="|" attribute="objectUid" relationalComparator="=" value="T000022876 "/>

En bleu, c'est la partie du code xml qui sera toujours identique.
Si vous regardez les 3 dernières lignes, vous remarquez que mes variables sont un chiffre et une valeur d'élément. (En rouge. J'obtiens la valeur d'élément via un fichier excel.

Donc ce que j'aimerai c'est une macro qui une fois lancée par l'utilisateur depuis le fichier excel contenant les données d'entrées au aussi pleins d'autres données mais inutiles pour le fichier xml:

>demande à l'utilisateur de sélectionner une plage de donnée (avec la souris, comme quand excel demande une plage de donnée pour un graphe)

>pour chaque cellule de la sélection, crée la ligne de code correspondante
ex: le 1er élément de la sélection est T000011524, donc la ligne a créer est:
<savedCriteria sortIndex="1" booleanOperator="|" attribute="objectUid" relationalComparator="=" value="T000011524 "/>

>assembler toutes les lignes précédentes, les unes aux autres (sur la même ligne)

>rajouter ce qu'on pourrai appeler l'entête du fichier xml:
<?xml version="1.0" encoding="UTF-8"?>
<savedSearch name="Trouble_excel_list" objectTypeClassName="ext.airbus.dmutr.dmutrouble.DMUTroubleLight"><savedCriteria sortIndex="0" attribute="objectUid" relationalComparator="=" value="T000000000" />

(il y a bien un retour à la ligne après <?xml version="1.0" encoding="UTF-8"?>)

>écrit le tout dans un fichier xml et l'enregistrer (le must serait avec la pop up que l'on à lors d'un "enregistrer sous", comme ça l'utilisateur peut choisir le nom du fichier et l'emplacement; problème excel ne me propose pas le format xml, ce que je faisait c'est:
Dim Fichier As String
Fichier = "C:\mon_chemin\mon_nom_de_fichier.xml"
Open Fichier For Output As #1
Print #1, Range("C1").Value //cellule où était <?xml version="1.0" encoding="UTF-8"?>
Print #1, Range("C2").Value //cellule où était l'assemblage de toutes mes lignes
Close

Voila, si vous m'aidiez cela serai super, car je n'arrive pas à trouver toutes les "briques" VBA pour faire ceci (genre le pop up enregistrer sous ou la sélection de plage de données)

Merci d'avance
 

mromain

XLDnaute Barbatruc
Re : [VBA] macro selection plage/ assemblage texte+données / export xml

Bonjour ornicus, et bienvenue sur le forum.


Les explications sont bien fournies et claires, mais peux-tu rajouter un fichier Excel exemple (avec juste les données utiles). A partir de ce fichier, re-explique tes opérations :

  • l'utilisateur sélectionne telle zone (de ton fichier exemple) ;
  • et ça doit générer ce fichier .xml (que tu peux fournir en exemple en le zippant - sinon, je pense que l'extension ne sera pas acceptée).
A+
 

ornicus

XLDnaute Nouveau
Re : [VBA] macro selection plage/ assemblage texte+données / export xml

Ok, voici les fichiers exemples:

excel_input_exemple.xls est le fichier où je vais récupérer les données à mettre en forme dans le fichier xml.
xml_input_exemple.xml (zippé, car en effet, le format n'est pas accepté) est le résultat qui sera lu par le logiciel avec lequel je veux communiquer.

Donc les opérations:

Dans excel_input_exemple.xls, le but est de sélectionner A1:A5 (c'est l'utilisateur qui doit sélectionner la plage, car le fichier d'entrée peut contenir un comme 150 éléments).

Ensuite, grâce au xml, je sais la "syntaxe de phrase" que veut le logiciel avec qui je veux communiquer.

Il faut donc pour chaque ligne de la sélection (A1:A5), insérer la valeur de la cellule ainsi que son numéro dans la "phrase type".

exemple:

Récupérer la valeur de A1 (T000084684) ainsi que son numéro (sa position dans la liste)(ici, c'est le 1er élément sélectionner, donc numéro=1. Attention, ce numéro n'est pas lié à la ligne du tableur, car si à l'étape première je sélectionne A2:A5, la valeur A2 aura aussi le numéro 1: c'est la première valeur de la sélection).
Coller ces deux informations dans la chaine suivante:

<savedCriteria sortIndex=" numéro de valeur A1 " booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="valeur de A1" />

résultat:

<savedCriteria sortIndex="1" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000084684" />

répéter pour A2, A3,...jusque la dernière cellule sélectionnée (A5 ici).

nous avons donc crée les lignes suivantes:

<savedCriteria sortIndex="1" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000084684" />
<savedCriteria sortIndex="2" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000085681" />
<savedCriteria sortIndex="3" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000085841" />
<savedCriteria sortIndex="4" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000085881" />
<savedCriteria sortIndex="5" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000085950" />

Il faut maintenant les "assembler", en effet, dans l'xml, toutes ces lignes sont sur une seule ligne, il n'y à pas de retour à la ligne (sinon le logiciel n'arrive pas à lire le fichier, j'ai testé).

résultat:

<savedCriteria sortIndex="1" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000084684" /><savedCriteria sortIndex="2" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000085681" /><savedCriteria sortIndex="3" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000085841" /><savedCriteria sortIndex="4" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000085881" /><savedCriteria sortIndex="5" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000085950" />

ensuite il reste à insérer les instructions de début et fin de fichier:

<?xml version="1.0" encoding="UTF-8"?>
<savedSearch name="Trouble_excel_list" objectTypeClassName="ext.airbus.dmutr.dmutrouble.DMUTroubleLight"><savedCriteria sortIndex="0" attribute="objectUid" relationalComparator="=" value="T000000000" />
insérer ici la chaine précédemment crée </savedSearch>

le code xml est prêt:

<?xml version="1.0" encoding="UTF-8"?>
<savedSearch name="Trouble_excel_list" objectTypeClassName="ext.airbus.dmutr.dmutrouble.DMUTroubleLight"><savedCriteria sortIndex="0" attribute="objectUid" relationalComparator="=" value="T000000000" />
<savedCriteria sortIndex="1" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000084684" /><savedCriteria sortIndex="2" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000085681" /><savedCriteria sortIndex="3" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000085841" /><savedCriteria sortIndex="4" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000085881" /><savedCriteria sortIndex="5" booleanOperator="&amp;" attribute="objectUid" relationalComparator="=" value="T000085950" /></savedSearch>

on peut maintenant l'enregistrer dans un fichier xml.
 

Pièces jointes

  • excel_input_exemple.xls
    21 KB · Affichages: 134
  • xml_input_exemple.zip
    395 bytes · Affichages: 83
Dernière édition:

mromain

XLDnaute Barbatruc
Re : [VBA] macro selection plage/ assemblage texte+données / export xml

Re bonjour,

Voici un essai :
VB:
Public Sub Test()
Dim fichierXml As Object, pathFichierXml As String, ligneXml As String, zoneSelection As Range, laCell As Range, cptCritere As Long

    'récupérer la plage de données
    Set zoneSelection = Application.InputBox("Sélectionnez la plage de données à exporter en XML :", "Sélection", , , , , , 8)
    
    'récupérer le path du fichier xml (fenêtre enregistrer sous)
    pathFichierXml = Application.GetSaveAsFilename("Export.xml", "Fichier XML (*.xml), *.xml", , "Exporter dans un fichier XML")
    
    'créer le fichier xml
    Set fichierXml = CreateObject("Scripting.FileSystemObject").CreateTextFile(pathFichierXml, True)
    
    'ajouter l'entête
    fichierXml.Write "<?xml version=""1.0"" encoding=""UTF-8""?>" & vbNewLine & _
        "<savedSearch name=""Trouble_excel_list"" objectTypeClassName=""ext.airbus.dmutr.dmutrouble.DMUTroubleLight"">" & _
        "<savedCriteria sortIndex=""0"" attribute=""objectUid"" relationalComparator=""="" value=""T000000000"" />"
    
    'boucler sur chaque cellule de la sélection
    For Each laCell In zoneSelection.Cells
        'générer la ligne xml
        cptCritere = cptCritere + 1
        ligneXml = "<savedCriteria sortIndex=""" & cptCritere
        ligneXml = ligneXml & """ booleanOperator=""&amp;"" attribute=""objectUid"" relationalComparator=""="" value="""
        ligneXml = ligneXml & laCell.Text & """ />"
        'écrire la ligne dans le fichier xml
        fichierXml.Write ligneXml
    Next laCell
    'fermer la balise SavedSearch
    fichierXml.Write "</savedSearch>"
    
    'fermer le fichier xml
    fichierXml.Close: Set fichierXml = Nothing

End Sub
A+
 

Discussions similaires

Réponses
1
Affichages
1 K
Compte Supprimé 979
C

Statistiques des forums

Discussions
312 203
Messages
2 086 196
Membres
103 153
dernier inscrit
SamirN