Reconstruction fichier XML via Macro

Bonjour,

Je me tourne vers vous pour obtenir un peu d'aide concernant un boulot pro.

Je dois alimenter une base de données via un fichier XML auquel je souhaite contribuer de nouveaux éléments.

En gros, mon besoin est de créer du code XML à la volé. Je m'explique, voir le fichier en pièce jointe.

Dans l'onglet "Code", mon code. En gras/bleu, les éléments que je souhaite mettre à jour dynamiquement.

Dans l'onglet "Données", les données qui doivent alimenter les parties en gras/bleu de l'onglet "Code".

Ce que je souhaite faire est, sur le papier, assez simple :

Je souhaite, pour chaque produit de l'onglet "Données" (Produit 1, Produit 2, Produit 3,..), créer le code complet présent dans l'onglet "Code", mais dont les éléments en gras/bleu ont été mis à jour selon les données liées au produit présentes dans l'onglet "Données". Une autre particularité est que le premier élément en gras/bleu, " SKU=SKU0001 (+1)" doit s'incrémenter à chaque code produit (SKU001,SKU002,SKU003).

Dans l'idéal, l'export se fait via un fichier .txt contenant l'ensemble des codes produits.

Voilà, j'espère avoir présenté mon besoin de façon suffisamment claire. Si vous avez besoin d'avantage d'informations, n'hésitez pas.

Je remercie par avance les personnes qui voudront bien prendre un peu de temps pour m'aider !

Amicalement,

Moonyz

347excel-xml.xlsx (9.47 Ko)

Petit up .. personne n'a une idée ?

Bonjour,

Voici un exemple qui fait appel à deux zones de texte dans la feuille "Ccde", l'une nommée "Produit" qui contient le code inial de chaque fiche avant remplacement des données variables, l'autre nommée "FichierXml" qui contient l'ensemble des fiches produits xml.

Il ne te reste plus qu'a récupérer le contenu de cette dernière zone de texte et de créer ton fichier texte.

Le code est :

Option Explicit

Sub CreationFichierXml()
   Dim rPlage As Range, l As Long, c As Long, sTexte As String, CptSKU As Long, sTexteSKU

   Set rPlage = Worksheets("Données").UsedRange ' définition de la plage active

   Worksheets("Code").Shapes("FichierXml").DrawingObject.Text = Empty

   For l = 1 To rPlage.Rows.Count ' Boucle sur les lignes de la plage
      If rPlage.Cells(l, 1).Text <> Empty Then
         ' Chargement de la zone SKU
         CptSKU = CptSKU + 1: sTexteSKU = "SKU" & Format(CptSKU, "0000")
         ' Remplacement des données variables
         sTexte = Worksheets("Code").Shapes("Produit").DrawingObject.Text ' [SKU]
         sTexte = Replace(sTexte, "[SKU]", sTexteSKU)
         For c = 2 To rPlage.Columns.Count ' Boucle sur les colonnes de la plage
            sTexte = Replace(sTexte, "[DONNEE" & c - 1 & "]", rPlage.Cells(l, 1).Offset(0, c - 1).Text) ' [DONNEEn]
         Next c

         ' Copie du code xml dans la zone de texte "FichierXml"
         Worksheets("Code").Shapes("FichierXml").DrawingObject.Text = Worksheets("Code").Shapes("FichierXml").DrawingObject.Text & sTexte & vbCr & vbCr
      End If
   Next l

   ' Suppression des 2 cbCr de fin
   With Worksheets("Code").Shapes("FichierXml").DrawingObject
      .Text = Mid(.Text, 1, Len(.Text) - 2)
   End With
End Sub

Il est possible que j'ai fait des erreurs dans la copie de ton texte xml vers la zone "Produit", c'est juste pour l'exemple.

Voici mon fichier test:

429excel-xml.xlsm (20.59 Ko)

A+

Benoît Marchand

[Benead]

Pfiou .. que te dires, à part que c'est parfait ?!

Tu m'as fait gagné un temps énorme, je t'en suis infiniment reconnaissant !

Vraiment un très bon forum, merci pour ton aide !

Cordialement,

Moonyz

82excel-xml.xlsm (84.42 Ko)

Bonjour Benead,

Je reviens vers toi car j'ai une petite question.

J'ai adapté le code à mes besoins .. il semble fonctionner sans erreur, mais pourtant, dans ma fenêtre de rendu du code, j'ai le code reconstruit de 4 lignes de données, pas plus, alors que j'en ai 50. Sais tu comment faire pour qu'il me génère l'intégralité de mes lignes ?

Tu trouveras mon fichier en PJ, c'est un peu le bordel mais rien de méchant !

Merci par avance pour ton aide !

Moonyz

Bonjour,

J'avais chargé une zone de texte pour que tu vois le résultat. Apparement cette zone de texte ne peut pas contenir plus de 32767 caractères d'après mes tests (avec Excel 2007) alors qu'il faut une variable pouvant contenir + de 400 000 caractères dans ton exemple.

Il faut donc remplacer la zone de texte par une variable texte et en fin de procédure écrire ton fichier xml.

Voici le code en remplaçant la zone de texte par la variable "sTexteXml" :

Option Explicit

Sub CreationFichierXml()
   Dim rPlage As Range, l As Long, c As Long, sTexte As String, CptSKU As Long, sTexteSKU As String, sTexteXml As String

   Set rPlage = Worksheets("Données").UsedRange ' définition de la plage

   Worksheets("Code").Shapes("FichierXml").DrawingObject.Text = Empty

   For l = 1 To rPlage.Rows.Count ' Boucle sur les lignes de la plage
      If rPlage.Cells(l, 1).Text <> Empty Then
         ' Chargement de la zone SKU
         CptSKU = CptSKU + 1: sTexteSKU = "SKU" & Format(CptSKU, "0000")
         ' Remplacement des données variables
         sTexte = Worksheets("Code").Shapes("Produit").DrawingObject.Text ' [SKU]
         sTexte = Replace(sTexte, "[SKU]", sTexteSKU)
         For c = 2 To rPlage.Columns.Count ' Boucle sur les colonnes de la plage
            sTexte = Replace(sTexte, "[DONNEE" & c - 1 & "]", rPlage.Cells(l, 1).Offset(0, c - 1).Text) ' [DONNEEn]
         Next c

         ' Copie du code xml dans la variable "sTexteXml"
         sTexteXml = sTexteXml & sTexte & vbCr & vbCr
      End If
   Next l

   ' Suppression des 2 vbCr de fin
      sTexteXml = Mid(sTexteXml, 1, Len(sTexteXml) - 2)

   ' Création de ton fichier xml ici
End Sub

Tu n'as plus qu'a écrire les quelques lignes de code pour écrire ton fichier texte avec le contenu de sTexteXml

A+

Benoît Marchand

[Benead]

Bonjour,

J'aurais 2-3 questions concernant votre méthode pour construire un XML:

- imaginons que j'ai 1 tableau de 2 lignes et 6 colonnes, donc 12 valeurs différentes. Je voudrais , avec un seul "schéma dynamique" (comprenant la déclaration de 6 variables) afficher les résultats des deux lignes du tableau dans une seule "shape résultat".

Pour mieux comprendre je vous invite à lancer la macro CreationFichierXML (je n'ai pas beaucoup changé les nom ).

Le résultat attendu est dans la "shape" noir écrit en vert pour la partie copiée (feuille Code)

Le squelette XML est dans la "shape" noire écrit en jaune pour les variables à remplacer.

Le résultat que j'obtiens est dans la "shape" grise (résultat normal vu que les variables ont des noms qui ne change pas dans la "shape" précédente)

Avez-vous des conseils ou autres pour m'aider dans la réalisation de cette tache?

Je fais cette demande car dans mon projet on ne pourra pas savoir d'avance combien de ligne le tableau contiendra. D'ailleurs j'aimerais également savoir si il est possible de manipuler les textes contenus dans les "shape" avec des macros (recherche de ligne, se placer à cette ligne,supression,copier/coller, etc.). Une idée?

Merci d'avance

Cdt

155excel-xml.xlsm (28.74 Ko)

Ou bien si il n'y a pas de solution avec la déclaration de seulement 6 données , comment pourrais-je créer ces données variables automatiquement en fonction du nombre de ligne du tableau (6 lignes = 6*6 données variables)..je ne sais même pas comment faire pour les créer manuellement !

Cdt

Bonjour,

Je ne suis pas un spécialiste du code xml, mais étant un habitué de programmes de répétition incluant diverses variables, tu dois réfléchir sur la façon dont le code peut se découper.

Sans rentrer dans le détail, et sans avoir analyser le code xml, il ne me semble pas insurmontable de séparer ton code en plusieurs parties, un peu comme un TGV ou tu as une motrice de tête, une de queue, 10 wagons dont un avec bar positionné au centre. C'est très schématique, mais cela peut t'aider pour reconstruite ton code avec une variable de taille : ou vais-je placer le bar si le nombre de wagons varie en fonction du nombre de passagers à transporter ? (mais je sais, ce n'est pas le cas)

Pour ton code c'est pareil, tu as un code d'entête, tu as un code de fin, et tu as tes wagons de codes dont peut être certains sont spéciaux et différents des autres. Autre Exemple "plus informatique", est l'exemple classique de la facture avec une entête reprenant le nom de la société à facturer, un nombre variable de lignes, pouvant inclure de sauts de page et une répétition partielle ou complête de l'entête et un pied de page incluant le montant HT, la TVA et le montant TTC.

En résumé, ce que je pense être possible, est :

1 textbox qui comprend ton code de début

1 textbox qui comprend ton code de fin

1 textbox pour générer les lignes de variables correspondant à tes lignes de données

1 ou plusieurs textbox correspondants à des codes spécifiques ou de liaisons entre les autres codes (si besoin)

Ensuite il te suffit d'assembler le tout dans un programme en appelant en boucle le sous-programme CreationFichierXml dans son milieu.

En visualisation macro, cela donne cela :

Insertion code du textbox de début
Boucle 
   code CreationFichierXml
Fin Boucle
Insertion code de fin

Avec insertion de code spécifique, si besoin, à tout moment du programme

Si cela peut t'aider, écris cela sur papier avant de concevoir ton programme, ça peut t'aider.

Concernant le fait de pouvoir se déplacer dans les shapes, ce n'est pas simple, je te déconseille cette méthode, il faudrait mieux, dans ce cas, travailler avec des fichiers textes.

Bonjour,

Ok je te remercie pour ton temps et je pense qu'effectivement utiliser les zones de texte est trop compliqué du moins pas pour créer le texte XML complet. Du coup je me suis lancé dans l'utilisation des cellules des feuilles excel. J'arrive à obtenir dans les bonnes cellules les bons textes avec les valeurs modifiées à l'intérieur.

Est-il possible de récupérer les textes des cellules et de les copier à un endroit particulier d'une feuille excel?

Par exemple:

  • copier "texte1" de la cellule A1
  • trouver la cellule contenant "texte2"
  • insérer (coller) le "texte1" a la suite de "texte2"

Précision : lorsque manuellement je double clic sur A1, je sélectionne le "texte1" et je le copie/colle en D1 la mise en forme du texte est conservée sur la feuille. En clair le texte se colle dans plusieurs cellules afin que la mise en forme soit conservée et c'est ce que je souhaite obtenir. J'ai codé plusieurs méthodes en macro afin d'obtenir ce résultat mais en vain: à chaque fois c'est dans une et une seule cellule que tout le texte se colle. Une solution?Y a t'il un paramètre à modifier quelque part?

cdt

J'ai trouvé les solutions pour la recherche de texte et pour me positionner dans la bonne cellule (point de départ pour coller mon texte).

Il manque donc la fonction "copier/coller" qui va bien.

Bonjours

j'ai besoin que vous aidez à progressé dans mon projets je dois faire automatisation de deux fichiers XML Via VBA .

merci de notre compréhension

Bonjour @ tous,

Je déterre le sujet mais je "découvre" actuellement la manipulation et l'intégration de fichier XML dans la plateforme Alfresco ...

J'ai un problème à vous exposer car j'ai beau chercher, je n'y arrive pas

J'ai un fichier de type CSV avec plusieurs lignes de données.

Je dois le décomposer et générer un fichier XML pour chaque ligne de mon CSV (Rien que ca ! )

Exemple :

Dans le CSV (2 lignes) :

"EFAEBB084301","20160627","999915754","RAISON ET SOC #1"
"EFAEBB084863","20160627","999991301","RAISON ET SOC #2"

Je dois générer 2 fichiers :

Fichier #1 nommé "EFAEBB084301.METADONNEES.XML:

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
  <properties>
    <entry key="cm:title">RAISON ET SOC #1</entry>
    <entry key="cm:description">999915754</entry>
    <entry key="cm:subject">EFAEBB084301</entry>
  </properties>

Fichier #2 nommé "EFAEBB084863.METADONNEES.XML" :

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
  <properties>
    <entry key="cm:title">RAISON ET SOC #2</entry>
    <entry key="cm:description">999991301</entry>
    <entry key="cm:subject">EFAEBB084863</entry>
  </properties>

*** Attention *** : Le nom du fichier doit être constitué de la valeur de "cm:subject"

Mille mercis pour vos lumières car je ne suis pas un AS de la programmation (plus de mon âge avancé )

Et promis :

28csv-exemple.csv (579.00 Octets)
30xml-exemple.xml (297.00 Octets)

Bonjour,

Voici une façon de faire :

Option Explicit

Const Chemin As String = "D:\Test\"
Const CheminXml As String = "D:\Test\XML\"
Const Fichier As String = "CSV_Exemple.csv"

Sub GenerateXML()
   Dim CodeXml As String, L As Long

   ' Suppression de l'ancienne connexion
   If ActiveSheet.QueryTables.Count > 0 Then
      Cells.QueryTable.Delete
   End If
   ' Suppression du contenu des cellules de la feuille active
   Cells.ClearContents

   ' Création de la connexion avec le fichier csv
   With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & Chemin & Fichier, Destination:=Range("$A$1"))
      .Name = Mid(Fichier, 1, InStrRev(Fichier, ".") - 1)
      .FieldNames = True
      .RowNumbers = False
      .FillAdjacentFormulas = False
      .PreserveFormatting = True
      .RefreshOnFileOpen = False
      .RefreshStyle = xlInsertDeleteCells
      .SavePassword = False
      .SaveData = True
      .AdjustColumnWidth = True
      .RefreshPeriod = 0
      .TextFilePromptOnRefresh = False
      .TextFilePlatform = 850
      .TextFileStartRow = 1
      .TextFileParseType = xlDelimited
      .TextFileTextQualifier = xlTextQualifierDoubleQuote
      .TextFileConsecutiveDelimiter = False
      .TextFileTabDelimiter = False
      .TextFileSemicolonDelimiter = False
      .TextFileCommaDelimiter = True
      .TextFileSpaceDelimiter = False
      .TextFileColumnDataTypes = Array(2, 5, 2, 2)   ' Type de données 2=Texte et 5=date AAMMJJ>JJ/MM/AA
      .TextFileTrailingMinusNumbers = True
      .Refresh BackgroundQuery:=False
   End With
   ' Boucle sur les lignes
   For L = 1 To ActiveSheet.UsedRange.Rows.Count
      ' Modification du texte de la zone de texte avec les cellules de la ligne
      CodeXml = CreateXML(L)
      ' Création/modification du fichier xml
      Open CheminXml & Cells(L, "A") & ".METADONNEES.xml" For Output Shared As #1
         Print #1, CodeXml
      Close #1
   Next L
End Sub

Private Function CreateXML(Ligne) As String
   Dim TextXml As String
   With ActiveSheet.Shapes("ZTexteXml").DrawingObject
      TextXml = .Caption
      TextXml = Replace(TextXml, "[COLONNE_A]", Cells(Ligne, "A"))
      TextXml = Replace(TextXml, "[COLONNE_C]", Cells(Ligne, "C"))
      TextXml = Replace(TextXml, "[COLONNE_D]", Cells(Ligne, "D"))
   End With
   CreateXML = Replace(TextXml, vbLf, vbCrLf)
End Function

La première chose à faire est de changer l'emplacement de tes données et du nom de ton fichier ;

Const Chemin As String = "D:\Test\"
Const CheminXml As String = "D:\Test\XML\"
Const Fichier As String = "CSV_Exemple.csv"

Attention : je ne sais pas si les caractères de fin de ligne, de retour de ligne, et autres caractères de contrôles sont les bons. A adapter en fonction de tes besoins.

67createxml.xlsm (24.30 Ko)

Whouaou ! Au Top !! Ca foncitonne au poil ...

Mille mercis pour votre aide précieuse.

Et comme promis ...

Rechercher des sujets similaires à "reconstruction fichier xml via macro"