Correction inversion
Bonjour,
Je travaille sur un fichier qui permettrait de détecter et corriger des inversions de quantités identiques. Voici le problème, je reçois des produits venant de magasins dans un entrepôt. Chaque magasin déclare la quantité de chaque produit qu'il envoit, l'entrepôt rentre également les quantités reçues par magasin pour chaque produit. Il peut arriver qu'il y ait des inversions dans l'entrepôt: des quantités ayant dû être affectées à un magasin A sont affectées à un magasin B, créant des différences.
Par exemple pour un produit A, le magasin A déclare 30 unités, le magasin B déclare 10. A l'entrepôt, 25 unités sont déclarées sur le magasin A et 15 au magasin B. Le magasin A a donc -5 unités et le magasin B +5 unités
Je souhaiterais avoir une formule (ou au pire une macro) qui permettrait de détecter ces inversions "parfaites" et faire les corrections. Je me dis qu'il y aurait peut-être une possibilité avec des formules matricielles mais j'ai un doute...
Je joins un fichier avec quelques exemples, sachant qu'en réalité je pourrai avoir des centaines de magasins avec des centaines de produits...
Merci d'avance
Bonjour,
une proposition via une macro. Suppose que la feuille est triée en ordre croissant sur la reference produit.
Sub aargh()
With Sheets("correction switch parfait")
dl = .Cells(Rows.Count, 1).End(xlUp).Row
.Range("G2:G" & dl).ClearContents
For i = 2 To dl 'on parcourt toutes les lignes
If .Cells(i, 7) = "" Then 'pas encore de switch pour cette ligne i
For j = i + 1 To dl 'on parcourt toutes les lignes à partir de de i+1
If .Cells(j, 7) = "" Then 'pas encore de switch pour cette ligne j
If .Cells(i, 2) = .Cells(j, 2) Then ' même produit ?
If .Cells(i, 5) = -.Cells(j, 5) Then ' même quantité au signe près ?
.Cells(i, 6) = .Cells(i, 4) - .Cells(i, 5) 'correction stock i
.Cells(j, 6) = .Cells(j, 4) - .Cells(j, 5) 'correction stock j
.Cells(i, 7) = "switch parfait entre ligne " & i & " et ligne " & j
.Cells(j, 7) = "switch parfait entre ligne " & j & " et ligne " & i
Exit For
End If
' si feuille non triée sur produit enlever les 2 lignes suivantes
ElseIf .Cells(i, 2) < .Cells(j, 2) Then
Exit For
End If
End If
Next j
If .Cells(i, 7) = "" Then .Cells(i, 6) = .Cells(i, 4) ' pas de correction du stock
End If
Next i
End With
End SubBonjour h2so4!
Je viens de tester le code, il semble fonctionner plutôt bien, merci beaucoup! Le message qui indique entre quels magasins le switch a eu lieu peut en plus m'être très utile, c'est encore mieux que ce que j'espérais
Juste une petite anomalie: si pour une référence donnée j'ai plusieurs magasins avec différence =0, j'ai quand même le message de switch parfait, quelle ligne de code faudrait-il ajouter pour éviter cela?
re-Bonjour,
code adapté
Sub aargh()
With Sheets("correction switch parfait")
dl = .Cells(Rows.Count, 1).End(xlUp).Row
.Range("G2:G" & dl).ClearContents
For i = 2 To dl 'on parcourt toutes les lignes
If .Cells(i, 5) <> 0 Then 'si différence non nulle
If .Cells(i, 7) = "" Then 'pas encore de switch pour cette ligne i
For j = i + 1 To dl 'on parcourt toutes les lignes à partir de de i+1
If .Cells(j, 7) = "" Then 'pas encore de switch pour cette ligne j
If .Cells(i, 2) = .Cells(j, 2) Then ' même produit ?
If .Cells(i, 5) = -.Cells(j, 5) Then ' même quantité au signe près ?
.Cells(i, 6) = .Cells(i, 4) - .Cells(i, 5) 'correction stock i
.Cells(j, 6) = .Cells(j, 4) - .Cells(j, 5) 'correction stock j
.Cells(i, 7) = "switch parfait entre ligne " & i & " et ligne " & j
.Cells(j, 7) = "switch parfait entre ligne " & j & " et ligne " & i
Exit For
End If
ElseIf .Cells(i, 2) < .Cells(j, 2) Then
Exit For
End If
End If
Next j
If .Cells(i, 7) = "" Then .Cells(i, 6) = .Cells(i, 4) ' pas de correction du stock
End If
End If
Next i
End With
End SubLa mention "switch parfait" a bien disparu, mais du coup la quantité après correction n'apparait également plus..
Le bout de code
If .Cells(i, 7) = "" Then .Cells(i, 6) = .Cells(i, 4) ' pas de correction du stockne semble pas fonctionner quand différence =0, même en faisant tourner le code pas à pas, je ne vois pas ce qui pose problème...
bonsoir,
erreur de ma part
Sub aargh()
With Sheets("correction switch parfait")
dl = .Cells(Rows.Count, 1).End(xlUp).Row
.Range("G2:G" & dl).ClearContents
For i = 2 To dl 'on parcourt toutes les lignes
If .Cells(i, 5) <> 0 Then 'si différence non nulle
If .Cells(i, 7) = "" Then 'pas encore de switch pour cette ligne i
For j = i + 1 To dl 'on parcourt toutes les lignes à partir de de i+1
If .Cells(j, 7) = "" Then 'pas encore de switch pour cette ligne j
If .Cells(i, 2) = .Cells(j, 2) Then ' même produit ?
If .Cells(i, 5) = -.Cells(j, 5) Then ' même quantité au signe près ?
.Cells(i, 6) = .Cells(i, 4) - .Cells(i, 5) 'correction stock i
.Cells(j, 6) = .Cells(j, 4) - .Cells(j, 5) 'correction stock j
.Cells(i, 7) = "switch parfait entre ligne " & i & " et ligne " & j
.Cells(j, 7) = "switch parfait entre ligne " & j & " et ligne " & i
Exit For
End If
ElseIf .Cells(i, 2) < .Cells(j, 2) Then
Exit For
End If
End If
Next j
End If
End If
If .Cells(i, 7) = "" Then .Cells(i, 6) = .Cells(i, 4) ' pas de correction du stock
Next i
End With
End SubBonjour h2s04,
Ca fonctionne nickel! Merci beaucoup pour ton aide, cela va bien m'aider!