Ordonner les données VBA
Bonjour,
Je vous souhaite une bonne année et meilleur vœux .
N'ayant pas trouvé une macro permettant d'ordonner les données.Je tente ma chance si quelqu'un peut m'aider à créer cette macro.
Donnée entrant : fichier Excel
Donnée sortant : Fichier sous format TXT
Dans le fichier excel, j’ai des lignes de commandes clients ou nous avons les informations fiche client (nom / prénom/ adresse mail/ N° tel/ adresse) mais également les informations concernant le produit (Nom de produit / Quantité commandée/Prix d’achat/ Prix payé par le client…etc
Une ligne sur excel = un client/une référence commandée
Un client = N° commande unique
Un client peut commander plusieurs produits mais aura le même N° commande
Donnée sortant : fichier TXT
1) Reprendre les données fiche client respectivement :
- Numéro de commande
- Nom
- Prénom
- Adresse mail
- Adresse de livraison ETC
- Référence fournisseur
- Désignation
- Quantité vendue
- Prix d’achat
- Prix payé
Si vous avez plus de questions n'hésitez pas à m'écrire .
Merci d’avance de votre aide
Bonne journée,
Bonjour et bonne année,
Voici un code pour faire ce que tu demandes mais qui va sûrement devoir être amélioré/modifié mais c'est un début de piste. Voir les commentaires dans le code pour la compréhension :
'utilise des types "Utilisateur" pour plus de clarté !
'propriétés de l'article
Type Article
Nom As String
Quantite As Long
Prix As Double
PrixPaye As Double
Devise As String
End Type
'coordonnées du client
Type Client
Email As String
Prenom As String
Nom As String
Genre As String
NumTel As String
Adresse1 As String
Adresse2 As String
CP As String
Ville As String
ElemCommande() As Article 'les articles du client seront stockés dans ce tableau
End Type
'niveau commande
Type Commande
External_id As String
Devise As String
Prix_paye As Double
Status As String
LeClient As Client
End Type
Sub Test()
Dim Fe As Worksheet
Dim ComClient() As Commande 'tableau pour les différentes commandes
Dim Plage As Range
Dim Cel As Range
Dim I As Long
Dim J As Long
Set Fe = Worksheets("Feuil1")
'défini la plage sur toute la feuille
Set Plage = DefPlage(Fe)
'effectue un tri sur les numéros de commande
Plage.Sort Plage(1, 14), xlAscending, , , , , , xlYes
'parcours la colonne A...
For Each Cel In Plage.Columns(1).Cells
'...et évite la ligne d'entêtes
If Cel.Row > 1 Then
'incrémente si ce n'est pas le même numéro de commande
If Cel.Offset(-1, 13).Value <> Cel.Offset(, 13).Value Then I = I + 1
'redimensionne le tableau...
ReDim Preserve ComClient(1 To I)
'...et y stocke les différentes valeurs
With ComClient(UBound(ComClient))
.External_id = Cel.Offset(, 13).Value
.Devise = "EUR" '<--- pas indiqué dans la base !!!
.Status = Cel.Offset(, 5).Value
With .LeClient
.Email = Cel.Value
.Prenom = Cel.Offset(, 2).Value
.Nom = Cel.Offset(, 3).Value
.Genre = Cel.Offset(, 1).Value
.NumTel = Cel.Offset(, 11).Value
.Adresse1 = Cel.Offset(, 6).Value
.Adresse2 = Cel.Offset(, 7).Value
.CP = Cel.Offset(, 9).Value
.Ville = Cel.Offset(, 8).Value
'initilise le tableau en fonction du nombre d'article
If Not (Not .ElemCommande) Then ReDim Preserve .ElemCommande(1 To UBound(.ElemCommande) + 1) Else ReDim .ElemCommande(1 To 1)
With .ElemCommande(UBound(.ElemCommande))
.Nom = Cel.Offset(, 22).Value
.Quantite = Cel.Offset(, 26).Value
.Prix = Cel.Offset(, 37).Value
.PrixPaye = .Prix * .Quantite
.Devise = "EUR"
'totalise la commande du client en cours
ComClient(UBound(ComClient)).Prix_paye = ComClient(UBound(ComClient)).Prix_paye + .PrixPaye
End With
End With
End With
End If
Next Cel
'appel de la Sub pour la création du fichier texte
FichierTxt ComClient
End Sub
Sub FichierTxt(Tbl() As Commande)
Dim Chemin As String
Dim Chaine As String
Dim I As Long
Dim J As Integer
'enregistre dans le même dossier que le classeur
Chemin = ThisWorkbook.Path & "\"
'création ou écrasement du fichier "Fichier Commande.txt"
Open Chemin & "Fichier Commande.txt" For Output As #1
For I = 1 To UBound(Tbl)
'construction de la chaine. Si on logiciel est utilisé pour la lecture,
'il ne devrait pas y avoir de problème car le fichier est construit par rapport au fichier fourni en exemple
'si problème, il faudra appeofondir ou alors créer une SUb de lecture
With Tbl(I)
Chaine = "{" & vbCrLf
Chaine = Chaine & """external_id"": " & """" & .External_id & """," & vbCrLf
Chaine = Chaine & """prix payé"": " & .Prix_paye & "," & vbCrLf
Chaine = Chaine & """devise"": " & """" & .Devise & """," & vbCrLf
Chaine = Chaine & """status"": " & """" & .Status & """," & vbCrLf
Chaine = Chaine & """client"": {" & vbCrLf
With .LeClient
Chaine = Chaine & """email"": " & """" & .Email & """," & vbCrLf
Chaine = Chaine & """prénom"": " & """" & .Prenom & """," & vbCrLf
Chaine = Chaine & """nom"": " & """" & .Nom & """," & vbCrLf
Chaine = Chaine & """genre"": " & """" & .Genre & """," & vbCrLf
Chaine = Chaine & """pnumero"": " & """" & .NumTel & """," & vbCrLf
Chaine = Chaine & """address"": " & """" & .Adresse1 & """," & vbCrLf
Chaine = Chaine & """address complement"": " & """" & .Adresse2 & """," & vbCrLf
Chaine = Chaine & """code"": " & """" & .CP & """," & vbCrLf
Chaine = Chaine & """ville"": " & """" & .Ville & """" & vbCrLf
Chaine = Chaine & "}," & vbCrLf
Chaine = Chaine & """order_items"": [" & vbCrLf
For J = 1 To UBound(.ElemCommande)
With .ElemCommande(J)
Chaine = Chaine & "{" & vbCrLf
Chaine = Chaine & """sku"": {" & vbCrLf
Chaine = Chaine & """name"": " & """" & .Nom & """" & vbCrLf
Chaine = Chaine & "}," & vbCrLf
Chaine = Chaine & """quantité"": " & .Quantite & "," & vbCrLf
Chaine = Chaine & """prix"": " & .Prix & vbCrLf
Chaine = Chaine & """prix paye"": " & .PrixPaye & "," & vbCrLf
Chaine = Chaine & """devise"": " & """" & .Devise & """" & vbCrLf
Chaine = Chaine & "}," & vbCrLf
End With
Next J
Chaine = Chaine & "]"
End With
End With
'inscription du client en cours dans le fichier
Print #1, Chaine
Chaine = ""
Next I
Close #1
End Sub
Function DefPlage(Fe As Worksheet, Optional L As Long = 1, Optional C As Long = 1) As Range
On Error GoTo Fin
With Fe
Set DefPlage = .Range(.Cells(L, C), _
.Cells(.Cells.Find("*", .[A1], -4123, , _
1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
2, 2).Column))
End With
Exit Function
Fin:
Set DefPlage = Nothing
End Function
Bonjour,
Je vous remercie pour cette proposition rapide. malheureusement je n'ai pas pu lancer la macro car ça bloque au niveau
sub FichierTxt(Tbl() As Commande)--------------------------Erreur de compilation:Type défini par l'utilisateur non défini.
Est ce que je dois activer les librairies (références) contenant ce type de variable?
Bonne journée
Merci d'avance,
cordialement
Bonjour,
Je te poste ton classeur avec le code complet et un bouton d'exécution. Si tout va bien, en cliquant sur le bouton, le fichier texte est créé et ensuite affiché à l'écran :
Bonjour,
J'ai cliqué sur le bouton mais apparemment le code est fait pour 32 et non 64 bits.
donc j'ai mis Lib "shell64.dll mais ça ne fonctionne pas ...
tu trouveras ci dessous le message d'erreur :
Microsoft Visual Basic pour Applications
Erreur de compilation:
Le code contenu dans ce projet doit être mis à jour pour pouvoir être utilisé sur les systèmes 64 bits. Vérifiez et mettez à jour les instructions Declare, puis marquez-les avec l'attribut PtrSafe.
OK Aide
Merci d'avance de votre aide
Cordialement
Bonjour,
j'avais également travaillé sur ton sujet, une autre proposition. Lancer la macro aargh, via alt-F8
Bonjour,
je vous remercie énormément de votre aide. Ca y est j'ai pu tester et le fichier fonctionne très bien.
Je suis super contente
cordialement
bonjour h2so4,
Serait il possible de modifié la macro sur les deux points suivants:
1) Partie fiche produit ( item) : le prix payé =prix d'achat colonne AK * quantité vendue colonne AA
2) Partie fiche client : le prix payé = la somme (prix d'achat colonne AK * quantité vendue colonne AA) si jamais il y a plusieurs produits commandés
Merci d'avance,
Cordialement
Bonjour,
Merci beaucoup, ça fonctionne très bien
Bonne journée,
Cordialement