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 Sub

Bonjour 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 Sub

La 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 stock

ne 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 Sub

Bonjour h2s04,

Ca fonctionne nickel! Merci beaucoup pour ton aide, cela va bien m'aider!

Rechercher des sujets similaires à "correction inversion"