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
2) Récupérer les données concernant les produits commandés
  • Référence fournisseur
  • Désignation
  • Quantité vendue
  • Prix d’achat
  • Prix payé
NB : si le client a commandé plusieurs produits, il faudra mettre les produits commandés l' un en dessous de l’autre car on reste sur le même client et la même commande.

Si vous avez plus de questions n'hésitez pas à m'écrire .

Merci d’avance de votre aide

Bonne journée,

14exemple.xlsx (13.59 Ko)

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

12soukaina.xlsm (22.63 Ko)

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 merci encore une fois .

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,

macro adaptée

10soukaina.xlsm (22.75 Ko)

Bonjour,

Merci beaucoup, ça fonctionne très bien

Bonne journée,

Cordialement

Rechercher des sujets similaires à "ordonner donnees vba"