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 SubBonjour, 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.
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
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 SubBonjour, 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-,
Merci beaucoup pour votre aide !