Boucle / Dictionnaire VBA Excel - Demande d'assistance

Sub TrierEtAdditionner()

    ' Déclaration des variables
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim rng As Range
    Dim cell As Range

    ' Référence à la feuille de travail
    Set ws = ThisWorkbook.Sheets("Extraction client")

    ' Trouver la dernière ligne avec des données
    lastRow = ws.Cells(ws.Rows.Count, "E").End(xlUp).Row

    ' Définir la plage à trier
    Set rng = ws.Range("E2:AK" & lastRow)

    ' Trier la plage par colonne E puis par colonne I
    rng.Sort key1:=rng.Columns(1), order1:=xlAscending, key2:=rng.Columns(5), order2:=xlAscending, Header:=xlYes

    ' Utiliser des dictionnaires pour stocker les totaux par référence d'article
    Dim dictQuantite As Object
    Dim dictStock As Object
    Set dictQuantite = CreateObject("Scripting.Dictionary")
    Set dictStock = CreateObject("Scripting.Dictionary")

    ' Parcourir les lignes de la plage triée et stocker les données dans les dictionnaires
    For Each cell In rng.Rows
        ' Récupérer la référence d'article, la quantité et le stock
        Dim reference As String
        Dim quantite As Double
        Dim stock As Variant
        reference = cell.Cells(1, 1).Value
        quantite = cell.Cells(1, 5).Value
        stock = cell.Cells(1, 37).Value ' Utiliser la colonne AK pour les stocks

        ' Ajouter la quantité au total correspondant à la référence d'article dans le dictionnaire de quantités
        If dictQuantite.Exists(reference) Then
            dictQuantite(reference) = dictQuantite(reference) + quantite
        Else
            dictQuantite.Add reference, quantite
        End If

        ' Vérifier si la cellule de stock contient une valeur numérique et n'est pas une date
        If Not IsEmpty(stock) And IsNumeric(stock) And Not IsDate(stock) Then
            ' Ajouter le stock au total correspondant à la référence d'article dans le dictionnaire de stocks
            If dictStock.Exists(reference) Then
                dictStock(reference) = dictStock(reference) + stock
            Else
                dictStock.Add reference, stock
            End If
        End If
    Next cell

    ' Afficher les résultats dans les colonnes J et K (ou des colonnes de votre choix)
    ws.Range("AZ1").Value = "Référence d'article"
    ws.Range("BA1").Value = "Total Quantité"
    ws.Range("BB1").Value = "Total Stock"

    Dim outputRow As Long
    outputRow = 2

    ' Parcourir les dictionnaires et afficher les résultats dans la feuille
    Dim key As Variant
    For Each key In dictQuantite.keys
        ' Écrire la référence d'article en colonne AZ (52)
        ws.Cells(outputRow, 52).Value = key

        ' Écrire la quantité totale en colonne BA (53)
        ws.Cells(outputRow, 53).Value = dictQuantite(key)

        ' Écrire le stock total en colonne BB (54)
        If dictStock.Exists(key) Then
            ws.Cells(outputRow, 54).Value = dictStock(key)
        End If

        ' Si la cellule de stock n'est pas vide et est de type Date, ajouter le stock au total correspondant à la référence d'article dans le dictionnaire de stocks
If Not IsEmpty(stock) Then
    If IsDate(stock) Then
        If dictStock.Exists(reference) Then
            dictStock(reference) = dictStock(reference) + stock
        Else
            dictStock.Add reference, stock
        End If
    End If
End If

        ' Ajouter une ligne vide entre les enregistrements
        outputRow = outputRow + 1
    Next key

End Sub

Bonjour, je vous présente aujourd'hui mon code qui dans les faits lors de l'exécutions ne crée pas d'erreur mais dans les faits génère une réponse incohérente. J'ai essayé plein de chose pour trouver une solutions au problème mais rien à faire je ne comprends pas. Je vais essayé alors d'expliqué mon problème de manière simple et précise et je reste à votre dispositions pour toute demande lier au sujet de ce poste.

image


Objectif du code :

Le code vient regarder la colonne E .(Article Ref) et trié le tableau par rapport à celle-ci, ensuite il vient prendre toutes les quantités qui se trouvent sur la même ligne que la référence en question et s'il en trouve plusieurs il les additionne pour sortir un résultat comme montré dans la capture d'écran ci-dessous

image Mon problème rencontré est lors de l'écriture du total stock qui fonctionne en soi de la même façon que le Total quantité mais qui après de nombreux tests n'a pu m'afficher soit que des valeurs fausses, des dates ou alors des cases vident comme montrés sur le screen ci-dessus.

bonjour MBP owli,

quelle macro ! N'avez-vous pas un fichier (anonymisé) à joindre, cela est plus facile.

Sub TrierEtAdditionner()

     ' Déclaration des variables
     Dim aA, Dict, i, it, ptr, Reference, Quantite, Stock
     ' Référence à la feuille de travail
     With ThisWorkbook.Sheets("Extraction client")
          aA = .Range("E2:AK" & .Cells(.Rows.Count, "E").End(xlUp).Row).Value2

          Set Dict = CreateObject("Scripting.Dictionary")
          Dict.comparemode = vbTextCompare
          For i = 1 To UBound(aA)
               Reference = aA(i, 1)
               Quantite = aA(i, 5)
               Stock = aA(i, 37)             ' Utiliser la colonne AK pour les stocks

               If Not Dict.exists(Reference) Then Dict(Reference) = Array(Reference, 0, 0)
               it = Dict(Reference)
               it(1) = it(1) + Quantite      ' Ajouter la quantité au total correspondant à la référence d'article dans le dictionnaire de quantités
               it(2) = it(2) + Stock         ' Vérifier si la cellule de stock contient une valeur numérique et n'est pas une date
               Dict(Reference) = it
          Next

          ' Afficher les résultats dans les colonnes J et K (ou des colonnes de votre choix)
          .Range("AZ1").Resize(, 3).Value = Array("Référence d'article", "Total Quantité", "Total Stock")
          ptr = Dict.Count
          'If ptr = 1 Then Dict.Add "xxxx", Dict().items(0) 'prolbème si dictionaire ne contient qu'un record
          If ptr > 0 Then
               With .Range("AZ2").Resize(ptr, 3)
                    .Value = Application.Index(Dict.items, 0, 0)
                    .Sort .Range("A1"), Header:=xlNo
               End With
          End If
     End With
End Sub

Bonjour, dans un premier temps pensé vous qu'on puisse en discuter ici? Le document cache beaucoup d'informations que je ne peux montrer et l'anonymiser prendrait un temps monstrueux ! Si je dois vraiment le faire je le ferai !

J'ai finalement pu le faire assez simplement

re,

avec la macro dans votre fichier

17dupli-pour-forum.xlsm (177.18 Ko)

Re-,

Merci beaucoup pour votre aide !

Rechercher des sujets similaires à "boucle dictionnaire vba demande assistance"