XL 2010 Génération fichier xml

ydemarin

XLDnaute Nouveau
Bonsoir,

j'ai une macro pour pouvoir générer des fichiers xml en fonction d'une base de données et de variables.

Elle génère 1 fichier xml par ligne dans l'onglet Data.

Mes utilisateurs qui doivent intégrer les messages xml un à un, voudraient que je leur fournisse un outil capable de générer un seul message xml avec plusieurs lignes. En effet, on va passer sur des Data à 100 lignes.

j'ai mis en jaune dans le template la partie qui serait donc à répéter selon le nombre de ligne dans le fichier Data.

Qui pourrait m'aider?

merci
 

Pièces jointes

  • UPOP.xlsm
    22.8 KB · Affichages: 51

Hieu

XLDnaute Impliqué
Salut,

Quelques modifs ;
VB:
Sub Macro1()
Set temp = Sheets("Template")
Set d = Sheets("Data")

OutputDir = temp.Range("c1")
Filename = temp.Range("c2")
Nbtemplatelines = temp.Range("c3")
Nbdatalines = temp.Range("c4")
Nbdatacolumns = temp.Range("c5")



Open OutputDir & "\" & Filename & "_" & d.Cells(2, 1) & ".xml" For Append As #1
For t = 1 To Nbdatalines
For i = 1 To Nbtemplatelines
    LineToPrint = temp.Cells(i, 1)
    For j = 1 To Nbdatacolumns
        LineToPrint = Replace(LineToPrint, "%" & d.Cells(2, j) & "%", d.Cells(t + 3, j))
    Next j
    Print #1, LineToPrint
Next i
Next t
Close #1
End Sub

La plus importante étant la création du fichier AVANT la boucle
 
Dernière édition:

ydemarin

XLDnaute Nouveau
Bonjour,

merci pour ce retour, mais ce code génére toujours un fichier xml par ligne alors que ce que je recherche c'est un seul fichier xml qui contient plusieurs lignes dedans.

Du coup je ne comprends pas bien l'effet produit par le code communiqué

Merci
 

Hieu

XLDnaute Impliqué
Salut,

En ce qui me concerne, il ne génère qu'un seul fichier ?!
VB:
Sub Macro1()
Set temp = Sheets("Template")
Set d = Sheets("Data")

OutputDir = temp.Range("c1")
Filename = temp.Range("c2")
Nbtemplatelines = temp.Range("c3")
Nbdatalines = temp.Range("c4")
Nbdatacolumns = temp.Range("c5")



Open OutputDir & "\" & Filename & "_" & d.Cells(2, 1) & ".xml" For Append As #1
For t = 1 To Nbdatalines
For i = 1 To Nbtemplatelines
    LineToPrint = temp.Cells(i, 1)
    For j = 1 To Nbdatacolumns
        LineToPrint = Replace(LineToPrint, "%" & d.Cells(2, j) & "%", d.Cells(t + 3, j))
    Next j
    Print #1, LineToPrint
Next i
Next t
Close #1
End Sub
 

Pièces jointes

  • UPOP_v0.xlsm
    23.2 KB · Affichages: 38

ydemarin

XLDnaute Nouveau
Autant pour moi, je me suis trompé lors de la mise à jour.
En effet, un seul fichier xml est généré mais du coup, il génère la même commande plusieurs fois. Ce qui ne peut pas fonctionner.
commande = balise <DistributionOrderId>STA00002</DistributionOrderId>.

je souhaiterai 1 commande mais que le nombre de lignes (balise <LineItem>)soit variables selon le nombre de lignes dans Data

De plus, les données ne sont pas mise à jour (remplacement des valeurs entre les %)

merci
 

ydemarin

XLDnaute Nouveau
Bonjour,

je précise mon besoin.

Je souhaite intégrer une commande dans un système d'information par un fichier xml.

Une commande est composé d'un en-tête, de lignes et d'un pied de page.

Le nombre de lignes est variables selon la commande de 1 à 999.

Voici le message de l'en-tête qui est fixe:

<tXML>
<Header>
<Source>Host</Source>
<Action_Type>Update</Action_Type>
<Reference_ID>XML_OD_DEBORDS_STA00002</Reference_ID>
<Message_Type>DistributionOrder</Message_Type>
<Company_ID>1</Company_ID>
<Msg_Locale>English (United Kingdom)</Msg_Locale>
<Msg_Time_Zone>Europe/Paris</Msg_Time_Zone>
<Version>2015</Version>
<Internal_Reference_ID>STA00002</Internal_Reference_ID>
</Header>
<Message>
<DistributionOrder>
<DistributionOrderId>STA00002</DistributionOrderId>
<OrderType>RA</OrderType>
<OrderedDttm>07/03/2017 23:17</OrderedDttm>
<IsCancelled>false</IsCancelled>
<ReferenceField1>OD_FICTIF</ReferenceField1>
<ReferenceField2>OD_FICTIF</ReferenceField2>
<ReferenceField3>DIVERS</ReferenceField3>
<PlanningOriginFacilityId></PlanningOriginFacilityId>
<ExternalSystemPurchaseOrderNbr>OD_FICTIF</ExternalSystemPurchaseOrderNbr>
<DistroNumber>OD_FICTIF</DistroNumber>
<SalesOrderNbr>OD_FICTIF</SalesOrderNbr>
<DcCenterNbr>OD_FICTIF</DcCenterNbr>
<OriginFacilityAliasId>STA</OriginFacilityAliasId>
<PickupStartDttm>08/03/2017 23:17</PickupStartDttm>
<DestinationFacilityAliasId>1107</DestinationFacilityAliasId>
<DestinationFacilityName>OD_FICTIF</DestinationFacilityName>
<DestinationAddressLine1>OD-FICTIF</DestinationAddressLine1>
<DestinationAddressLine2></DestinationAddressLine2>
<DestinationAddressLine3></DestinationAddressLine3>
<DestinationCity>OD_FICTIF</DestinationCity>
<DestinationCountry>FR</DestinationCountry>
<DestinationPostalCode>99999</DestinationPostalCode>
<DeliveryEndDttm>09/03/2017 23:17</DeliveryEndDttm>
<DestinationContactName>OD_FICTIF</DestinationContactName>
<DestinationContactTelephoneNbr>0102030405/0602030405</DestinationContactTelephoneNbr>
<DestinationContactFaxNbr>OD_FICTIF</DestinationContactFaxNbr>
<MajorOrderGroupAttribute></MajorOrderGroupAttribute>
<LpnCubingIndicator>54</LpnCubingIndicator>
<ShipGroupId>STA00002</ShipGroupId>
<BillToName></BillToName>
<BillToFacilityAliasId></BillToFacilityAliasId>
<BillToFacilityName></BillToFacilityName>
<BillToAddressLine1></BillToAddressLine1>
<BillToAddressLine2></BillToAddressLine2>
<BillToAddressLine3></BillToAddressLine3>
<BillToCity></BillToCity>
<BillToCountryCode>FR</BillToCountryCode>
<BillToPostalCode></BillToPostalCode>
<BillToTelephoneNbr></BillToTelephoneNbr>
<ARCode>RA</ARCode>
<DistributionOrderType>Store Distributions</DistributionOrderType>
<PartlShipConfFlag>true</PartlShipConfFlag>
<TaxId></TaxId>
<ContentLabelType></ContentLabelType>
<SplInstrCode1>O</SplInstrCode1>

Voici le contenu par ligne qui se répète à chaque ligne.
Les données entre % sont celles qui sont dans le DATA

<LineItem>
<DoLineNbr>%1%</DoLineNbr>
<ItemName>%ARTICLE1%</ItemName>
<IsCancelled>false</IsCancelled>
<AllocationSourceType></AllocationSourceType>
<WaveAllocationType></WaveAllocationType>
<Price></Price>
<PurchaseOrderLineNbr>1</PurchaseOrderLineNbr>
<AllocationSourceId></AllocationSourceId>
<FulfillmentType>1</FulfillmentType>
<Quantity>
<OrderQty>%QUANTITE1%</OrderQty>
<QtyUOM>%UNITE1%</QtyUOM>
</Quantity>
<Size>
<SizeUomCode></SizeUomCode>
<SizeValue></SizeValue>
</Size>
<InventoryAttributes>
<InventoryType></InventoryType>
<BatchNbr>%NUANCE1%</BatchNbr>
</InventoryAttributes>
</LineItem>


Voici le pied de page

</DistributionOrder>
</Message>
</tXML>

Mon souhait est de mettre au point une macro qui permettrai de générer l'entête, puis n lignes selon le nombre de ligne dans le data puis le pied de tâches.

Je saurai le faire si j'avais toujours le même nombre de lignes mais je bloque le le nombre de lignes variables
 

Hieu

XLDnaute Impliqué
Salut,

Désolé du temps passé !!
Un essai :
VB:
Sub Macro1()
Set WF = WorksheetFunction
Set t = Sheets("Template")
Set d = Sheets("Data")

OutputDir = t.Range("c1")
Filename = t.Range("c2")
Nbtemplatelines = t.Range("c3")
Nbdatalines = t.Range("c4")
Nbdatacolumns = t.Range("c5")



Open OutputDir & "\" & Filename & "_" & d.Cells(2, 1) & ".xml" For Append As #1

For i = 1 To 59
Print #1, t.Range("a" & i)
Next i

For k = 1 To Nbdatalines
t.Range("b61") = d.Range("a1").Offset(k, 0)
    For i = 60 To 73
    Print #1, t.Range("a" & i) & t.Range("b" & i) & t.Range("c" & i)
    Next i
Next k

For i = 74 To 76
Print #1, t.Range("a" & i)
Next i

Close #1
End Sub
 

Pièces jointes

  • UPOP_v1.xlsm
    23.8 KB · Affichages: 40

Discussions similaires

Réponses
10
Affichages
404

Statistiques des forums

Discussions
315 093
Messages
2 116 136
Membres
112 667
dernier inscrit
foyoman