Récupération de données d'un Excel avec conditions
Bonjour à tous, je reviens vers vous aujourd'hui car je me trouve de nouveau face à un mur et la première fois ou j'ai écouté vos conseils cela m'a été plus que bénéfiques.
La première fois on avait pu faire en sorte de récolter plusieurs valeurs à l'aide d'un dictionnaire pour les compacter en une seule valeur par référence dans un tableau.
Sub TrierEtAdditionner2()
' 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("A2: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, 5) ' colonne E article référé
Quantite = aA(i, 9) ' colonne I, quantité
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
If IsNumeric(Stock) Then 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)
ptr = Dict.Count
If ptr = 1 Then Dict.Add "xxxx", Dict.Items()(0) 'problème si le dictionnaire ne contient qu'un record
With .Range("BD1").Resize(, 3) 'quelque colonnes plus loin !!!
.EntireColumn.ClearContents 'RAZ
.Value = Array("Référence d'article", "Total Quantité", "Total Stock") 'l'entête
If ptr > 0 Then
With .Offset(1).Resize(ptr, 3) 'cette plage
.Value = Application.Index(Dict.Items, 0, 0) 'les données
.Sort .Range("A1"), Header:=xlNo 'trier l'article référé
' Modifier les couleurs en fonction de la comparaison entre stock et quantité pour chaque référence
For i = 1 To ptr
If .Cells(i, 2).Value > .Cells(i, 3).Value Then
.Cells(i, 3).Interior.Color = RGB(10, 255, 150) ' Vert
Else
.Cells(i, 3).Interior.Color = RGB(150, 55, 255) ' Violet
End If
Next i
End With
End If
End With
End With
End Suble résultat de ce code donnes la chose suivante :
mon objectif maintenant est de vérifier les valeurs AW35624 (Référence de BD) : si Stock < Quantité alors on va chercher dans le document État des commandes la date qui correspond à la référence ici présente (Donc on cherche dans la colonne 3 la référence AW35624 dans l'autre document)
si on trouve la référence on va chercher colonne M sur la même ligne (Délais négociés), si la case est vide on prend la colonne délais d'arriver) et sinon on va prendre la date dans la colonne K (Délais souhaités)
M = Délais négociés (Date)
L = Délais d'arriver (Date)
K = Délais souhaités (Date)
Sub VerifierLivraison()
' Déclaration des variables
Dim wsExtraction As Worksheet
Dim wsCommandes As Worksheet
Dim lastRow As Long
Dim rngExtraction As Range
Dim cell As Range
' Référence à la feuille de travail "Extraction client"
Set wsExtraction = ThisWorkbook.Sheets("Extraction client")
' Référence à la feuille de travail "Etat des commandes fournisseurs"
Set wsCommandes = Workbooks.Open("C:\Users\apprenti.info\Desktop\macro vba\Etat des commandes fournisseurs (reçues du jour et non livrées) au 14-11-2023.xlsx").Sheets(1)
' Trouver la dernière ligne avec des données dans Extraction client
lastRow = wsExtraction.Cells(wsExtraction.Rows.Count, "E").End(xlUp).Row
' Définir la plage à vérifier dans Extraction client
Set rngExtraction = wsExtraction.Range("E2:AK" & lastRow)
' Parcourir les lignes de la plage
' Parcourir les lignes de la plage
Dim outputRow As Long
outputRow = 2 ' Commencer à la deuxième ligne (à ajuster selon ta configuration)
For Each cell In rngExtraction.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
Dim DelaiArrivee As Variant
' Obtenir les valeurs des colonnes appropriées dans la ligne actuelle de la plage
Reference = cell.Cells(1, 56).Value ' Colonne BD pour la référence d'article
Quantite = cell.Cells(1, 57).Value ' Colonne BE pour la quantité
Stock = cell.Cells(1, 58).Value ' Colonne BF pour le stock
' Vérifier si le stock est inférieur à la quantité
If IsNumeric(Stock) And IsNumeric(Quantite) Then
If Stock < Quantite Then
' Rechercher la référence d'article dans Etat des commandes fournisseurs
Dim commandeRow As Range
For Each commandeRow In wsCommandes.UsedRange.Rows
' Vérifier si la référence d'article dans Etat des commandes fournisseurs n'est pas vide
If Not IsEmpty(commandeRow.Cells(1, 3).Value) Then
Debug.Print "Référence : " & Reference
' Vérifier si la référence d'article correspond à celle dans la colonne C de Etat des commandes fournisseurs
If commandeRow.Cells(1, 3).Value = Reference Then
' Vérifier si la commande est en cours de livraison
If IsEmpty(commandeRow.Cells(1, 12).Value) Then
' Récupérer le délai d'arrivée depuis la colonne M, ou depuis la colonne L si M est vide, ou depuis la colonne K si L et M sont vides
DelaiArrivee = commandeRow.Cells(1, 13).Value
If IsEmpty(DelaiArrivee) Then
DelaiArrivee = commandeRow.Cells(1, 12).Value
If IsEmpty(DelaiArrivee) Then
DelaiArrivee = commandeRow.Cells(1, 11).Value
End If
End If
' Copier le délai d'arrivée en face de la référence d'article dans "Extraction client"
wsExtraction.Cells(cell.Row, 59).Value = DelaiArrivee
' Afficher une boîte de message avec des informations sur l'article en cours de livraison et sa date d'arrivée
MsgBox "Référence : " & Reference & " est en cours de livraison avec un délai d'arrivée de " & DelaiArrivee
Exit For ' Sortir de la boucle une fois que la référence a été trouvée
End If
End If
End If
Next commandeRow
End If
End If
Next cell
' Fermer le fichier Etat des commandes fournisseurs sans sauvegarder les modifications
Workbooks("Etat des commandes fournisseurs (reçues du jour et non livrées) au 14-11-2023.xlsx").Close SaveChanges:=False
End SubJe vous présente donc la suite de mon code qui en soi fonctionne jusque la boucle mais ne rentre jamais dans celle-ci (Merci le pas à pas).
J'ai essayé plusieurs choses mais je rencontrai toujours un souci. Je suis débutant en Vba donc je ne suis pas contre quelque conseil !
j'ai apporter des modifications au code ce qui à résolu certain problème, j'ai mis beaucoup de message de debug :
Sub VerifierLivraison()
' Déclaration des variables
Dim wsExtraction As Worksheet
Dim wsCommandes As Worksheet
Dim lastRow As Long
Dim rngExtraction As Range
Dim cell As Range
' Vérifier si le classeur actif est le bon document
If ThisWorkbook.Name <> "JD PDL - V6.xlsm" Then
MsgBox "Veuillez ouvrir le document JD PDL - V6.xlsm avant d'exécuter la macro.", vbExclamation
Exit Sub
End If
' Vérifier si la feuille active est "Extraction client"
If ActiveSheet.Name <> "Extraction client" Then
MsgBox "Veuillez activer la feuille 'Extraction client' dans le document JD PDL - V6.xlsm.", vbExclamation
Exit Sub
End If
' Référence à la feuille de travail "Extraction client"
Set wsExtraction = ThisWorkbook.Sheets("Extraction client")
' Référence à la feuille de travail "Etat des commandes fournisseurs"
Set wsCommandes = Workbooks.Open("C:\Users\apprenti.info\Desktop\macro vba\Etat des commandes fournisseurs (reçues du jour et non livrées) au 14-11-2023.xlsx").Sheets(1)
' Trouver la dernière ligne avec des données dans Extraction client
lastRow = wsExtraction.Cells(wsExtraction.Rows.Count, "BF").End(xlUp).Row
' Définir la plage à vérifier dans Extraction client
Set rngExtraction = wsExtraction.Range("BD2:BF" & lastRow)
' Parcourir les lignes de la plage
Dim outputRow As Long
outputRow = 2 ' Commencer à la deuxième ligne (à ajuster selon ta configuration)
For Each cell In rngExtraction.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
Dim DelaiArrivee As Variant
Debug.Print "Début du traitement..."
Debug.Print "Nombre de lignes dans la plage : " & rngExtraction.Rows.Count
' Obtenir les valeurs des colonnes appropriées dans la ligne actuelle de la plage
Reference = cell.Cells(1, 56).Value ' Colonne BD pour la référence d'article
Quantite = CDbl(cell.Cells(1, 57).Value) ' Colonne BE pour la quantité
Stock = CDbl(cell.Cells(1, 58).Value) ' Colonne BF pour le stock
' Afficher les valeurs dans la fenêtre "Immediate" pour débogage
Debug.Print "Chemin du document : " & ThisWorkbook.FullName
Debug.Print "Feuille active : " & ActiveSheet.Name
Debug.Print "Feuille active : " & wsExtraction.Name
Debug.Print "Colonne : " & cell.Column
Debug.Print "Ligne : " & cell.Row
Debug.Print "Reference : " & Reference
Debug.Print "Quantite : " & Quantite
Debug.Print "Stock : " & Stock
' Vérifier si le stock est inférieur à la quantité
If IsNumeric(Stock) And IsNumeric(Quantite) Then
If Stock < Quantite Then
' Rechercher la référence d'article dans Etat des commandes fournisseurs
Dim commandeRow As Range
For Each commandeRow In wsCommandes.UsedRange.Rows
' Vérifier si la référence d'article dans Etat des commandes fournisseurs n'est pas vide
If Not IsEmpty(commandeRow.Cells(1, 3).Value) Then
Debug.Print "Référence : " & Reference
' Vérifier si la référence d'article correspond à celle dans la colonne C de Etat des commandes fournisseurs
If commandeRow.Cells(1, 3).Value = Reference Then
' Vérifier si la commande est en cours de livraison
If IsEmpty(commandeRow.Cells(1, 12).Value) Then
' Récupérer le délai d'arrivée depuis la colonne M, ou depuis la colonne L si M est vide, ou depuis la colonne K si L et M sont vides
DelaiArrivee = commandeRow.Cells(1, 13).Value
If IsEmpty(DelaiArrivee) Then
DelaiArrivee = commandeRow.Cells(1, 12).Value
If IsEmpty(DelaiArrivee) Then
DelaiArrivee = commandeRow.Cells(1, 11).Value
End If
End If
' Copier le délai d'arrivée en face de la référence d'article dans "Extraction client"
wsExtraction.Cells(cell.Row, 59).Value = DelaiArrivee
' Afficher une boîte de message avec des informations sur l'article en cours de livraison et sa date d'arrivée
MsgBox "Référence : " & Reference & " est en cours de livraison avec un délai d'arrivée de " & DelaiArrivee
Exit For ' Sortir de la boucle une fois que la référence a été trouvée
End If
End If
End If
Next commandeRow
End If
Debug.Print "Stock égal à la quantité. Référence : " & Reference & ", Quantité : " & Quantite & ", Stock : " & Stock
End If
Next cell
' Fermer le fichier Etat des commandes fournisseurs sans sauvegarder les modifications
Workbooks("Etat des commandes fournisseurs (reçues du jour et non livrées) au 14-11-2023.xlsx").Close SaveChanges:=False
Debug.Print "Fin du traitement..."
End SubDébut du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 122
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 123
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 124
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 125
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 126
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 127
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 128
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 129
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 130
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 131
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 132
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 133
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 134
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 135
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 136
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 137
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 138
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Début du traitement...
Nombre de lignes dans la plage : 138
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Matière (Toutes cdes en-cours)
Feuille active : Extraction client
Colonne : 56
Ligne : 139
Reference :
Quantite : 0
Stock : 0
Stock égal à la quantité. Référence : , Quantité : 0, Stock : 0
Fin du traitement...Comme on peux le voir il scrute bien les lignes mais jamais il nous sort de valeurs alors que les données parcourut sont censé être celle-ci :
re,
je n'ai pas lu votre 2ième post, mais j'ai fait des changements dans la macro TrierEtAdditionner2
Déjà merci beaucoup pour votre aide ! J'ai encore des petits soucis (peut-être une erreur de manip de ma part mais je vous explique cela, à savoir que le souci semble être le même que dans le code que j'avais renvoyé hier et que vous n'avez pas eu le temps de lire)
Reference = 40
Quantite = 0
stock = vide
voici les problèmes lors du pas-à-pas.
Mon document s'appelle comme ça :
Etat des commandes fournisseurs (reçues du jour et non livrées) au 14-11-2023.xlsx
j'ai donc modifié le code de cette manière :
j'ai de nouveau le même problème. Si j'ajoute quelque message pour debug voici ce que la console me dit :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 7
Reference : 180
Quantite : 27
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 8
Reference : 2
Quantite : 0
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 9
Reference : 60
Quantite : 0
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 10
Reference : 96
Quantite : 0
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 11
Reference : 3
Quantite : 74
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 12
Reference : 300
Quantite : 0
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 13
Reference : 225
Quantite : 140
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 14
Reference : 250
Quantite : 0
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 15
Reference : 7
Quantite : 0
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 16
Reference : 50
Quantite : 0
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 17
Reference : 75
Quantite : 37
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 18
Reference : 4
Quantite : 0
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 19
Reference : 6
Quantite : 0
Stock :
Chemin du document : C:\Users\apprenti.info\Desktop\macro vba\t\JD PDL - V6.xlsm
Feuille active : Extraction client
Feuille active : Extraction client
Colonne : 5
Ligne : 20
Reference : 16
Quantite : 219
Stock : Les références ne correspondent pas à celle de mon document pourtant c'est bien les bonnes cellules.