Variétés stagnantes
Bonjour
S'il vous plaît, aidez-moi si vous le pouvez
Il existe une feuille de démonstration pour un aperçu du travail requis. Je souhaite connaître les éléments statiques et mobiles pour chaque magasin, comme indiqué dans le code.
Il y a un problème dans le code qui n'affiche pas les éléments stagnants
Cela passe par la validité du mouvement du produit et de la quantité
Sub FindStagnantItems()
Dim ws As Worksheet, wsOutput As Worksheet
Dim lastRow As Long, i As Long
Dim item As String, category As String, lastMovementDate As Date
Dim stagnantItemsByCategory As Object
Dim warehouseNames As Variant
Dim stagnantPeriod As Integer
Dim totalStagnantItemsByCategory As Object
' ' Définir la période au bout de laquelle l'article est considéré comme stagnant
stagnantPeriod = 90
' ' Précisez les noms des feuilles de calcul qui représentent les magasins
warehouseNames = Array("Magasin principal", "Branche 1")
' 'Créer un dictionnaire pour stocker les éléments stagnants par classification
Set stagnantItemsByCategory = CreateObject("Scripting.Dictionary")
Set totalStagnantItemsByCategory = CreateObject("Scripting.Dictionary")
'' Répétez le processus pour chaque magasin
For Each warehouseName In warehouseNames
On Error Resume Next
Set ws = ThisWorkbook.Sheets(warehouseName)
If Err.Number <> 0 Then
MsgBox "'Une erreur s'est produite lors de l'accès à la feuille de calcul: " & Err.Description
Exit Sub
End If
On Error GoTo 0
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
'' Rechercher les articles en rupture de stock dans le magasin actuel
For i = 2 To lastRow
item = ws.Cells(i, 1).Value
category = ws.Cells(i, 4).Value
lastMovementDate = ws.Cells(i, 3).Value
If DateDiff("d", lastMovementDate, Date) > stagnantPeriod Then
If Not stagnantItemsByCategory.Exists(category) Then
stagnantItemsByCategory.Add category, New Collection
End If
stagnantItemsByCategory(category).Add item
' 'Calculer le total des articles dormants pour chaque catégorie
If Not totalStagnantItemsByCategory.Exists(category) Then
totalStagnantItemsByCategory.Add category, 1
Else
totalStagnantItemsByCategory(category) = totalStagnantItemsByCategory(category) + 1
End If
End If
Next i
Next warehouseName
'' Créer une nouvelle feuille de calcul pour afficher les résultats
Set wsOutput = Worksheets.Add
wsOutput.Name = "Variétés dormantes"
wsOutput.Range("A1").Value = "Classification"
wsOutput.Range("B1").Value = "Nombre d'éléments stagnants"
'' Afficher les résultats
Dim categoryName As Variant
Dim currentRow As Long
currentRow = 2
For Each categoryName In totalStagnantItemsByCategory.Keys
wsOutput.Cells(currentRow, 1).Value = categoryName
wsOutput.Cells(currentRow, 2).Value = totalStagnantItemsByCategory(categoryName)
currentRow = currentRow + 1
Next categoryName
End Sub
Bonjour,
C'est assez compliqué de comprendre votre code sans explications sur le projet/le fonctionnement voulu.
Si au moins vous pourriez fournir une feuille des résultats attendus, car en soi la macro fonctionne sans bugs de ce que j'ai pu tester. Moi après l'exécution, sur votre exemple, j'obtiens ceci :
Avec comme feuille de départ :
J'ai remis en G le calcul de datediff. On voit dans le code que vous filtrez pour ajouter dans vos dictionnaires uniquement les lignes vérifiant datediff > 90. On obtient donc bien le résultat voulu : Branche 1 : 2 éléments stagnants. (et Magasin principal : 0).
Pour info, je pense que vous n'avez pas besoin de 2 dictionnaires. Puisque stagnantItemsByCategory contient des Collections, on peut simplement récupérer le nombre d'éléments dans la collection avec stagnantItemsByCategory(category).Count.
Donc veuillez préciser le résultat attendu svp. Le code a un fonctionnement qui suit la logique indiquée.