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
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 SubIl 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:
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
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 SubTu 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
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 finAvec 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 :
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 FunctionLa 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.
Whouaou ! Au Top !! Ca foncitonne au poil ...
Mille mercis pour votre aide précieuse.
Et comme promis ...