Recherche et attribution de référence selon type de produit

Bonjour au forum,

je vous sollicite car je ne trouve pas de solution par moi même....

mon problème:

j'ai un stock de produit et dans chaque code de produit j'ai des références.

je voudrais scanner mon stock et distribuer mes références dans l'onglet "plan" en colonne C en fonction du produit.

il peut avoir plus de produits au plan qu'en stock et vice versa.

je vous joint un fichier avec des code produit bibon et un stock bidon c'est pour montrer le besoin.

Pouvez-vous m'aider.

Merci par avance a ceux qui se pencheront sur mon problème.

18classeur1.xlsx (10.29 Ko)

Bonjour,

Ton "produit1" (par exemple) correspond à 4 références différentes, en feuille "Stock" ... qu'est-ce qu'on est supposé afficher dans les six cellules correspondant à "produit1" dans ta feuille "Plan"

Bonjour U. Milité, franck-63

Si j'ai bien compris :

Option Explicit
Sub test()
Dim a, i As Long, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    a = Sheets("stock").Range("a1").CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        If Not dico.exists(a(i, 1)) Then
            Set dico(a(i, 1)) = CreateObject("System.Collections.ArrayList")
        End If
        dico(a(i, 1)).Add a(i, 2)
    Next
    With Sheets("plan").Range("a1").CurrentRegion
        a = .Value
        For i = 2 To UBound(a, 1)
            If dico.exists(a(i, 2)) Then
                If dico(a(i, 2)).Count Then
                    a(i, 3) = dico(a(i, 2))(0)
                    dico(a(i, 2)).RemoveAt 0
                End If
            End If
        Next
        .FormulaLocal = a
    End With
End Sub

klin89

bonjour Klin89,

C'est tout à fait ça !!!

un grand merci, le code marche. Plus cas le modifier pour mon vrai fichier.

Encore merci et merci au forum.

Re-bonjour,

Pour le plaisir de saluer Klin89

... Maintenant que j'ai compris, on peut sans doute utiliser aussi une formule matricielle, en C2:

=SI(NB.SI(stock!$A$2:$A$17;B2)>=NB.SI($B$2:B2;B2);INDEX(stock!$B$2:$B$17;PETITE.VALEUR(SI(stock!$A$2:$A$17=B2;LIGNE(stock!$A$2:$A$17)-1);NB.SI($B$2:B2;B2)));"")

Valider avec Ctrl+Shift+Enter

... Mais je reconnais bien volontiers que ça a moins de "chien" qu'un Dictionary garni de ArrayList

bonjour,

ça marche aussi très bien en formule matricielle.

C'est avec vos réponse que l'on voit qu'il reste du chemin avant de bien se débrouiller sur excel....

encore merci à vous de vous êtes pencher sur mon problème.

Bonjour,

Sur un volume conséquent, la proposition de Klin89 sera certainement préférable (dictionary et tableaux seront plus rapides et moins gourmands en ressources) ... d'aucuns diront qu'elle est préférable dans l'absolu

bonjour,

Je reviens vers vous encore....

Je n'arrive pas a modifier le code pour changer les colonnes de l'onglet plan.

Comment dois-je faire pour les modifier je n'est pas mon vrai fichier sous la main mais j'ai essayé de modifier le code en modifiant mes colonne exemple le code produit en E et la référence a noté en I.

avec la formule matricielle pas de souci mais le code je suis trop mauvais des que je fais des modif soit je n'ais rien soit je suis en erreur...

En gros je suis dépassé...

Merci d'avance si vous pouvez m'aider.

re franck-63,

Dans cette partie,

With Sheets("plan").Range("a1").CurrentRegion
    a = .Value
    For i = 2 To UBound(a, 1)
        If dico.exists(a(i, 2)) Then
            If dico(a(i, 2)).Count Then
                a(i, 3) = dico(a(i, 2))(0)
                dico(a(i, 2)).RemoveAt 0
            End If
        End If
    Next
    .FormulaLocal = a
End With

remplace a(i, 2) par a(i, 5)

et a(i, 3) par a(i, 9)

mais bon, je n'ai pas ton tableau cible sous les yeux

klin89

super...

encore merci à vous

bonjour,

je suis navrer mais je reviens encore vers vous, en utilisant la macro et plusieurs extraction du stock j'ai vu qu'il me manquait une condition, désoler....

Peut-on rajouter dans le code que si dans la case référence "de l'onglet plan" il y a quelque chose ça passe la ligne.

car je peux avoir a lancer la macro en fonction du stock qui varie mais je veux garder les lignes du plan qui avait été affecter avant.

Merci à vous

Re franck-63,

Remplace cette ligne

If dico.exists(a(i, 2)) Then

par celle ci :

If dico.exists(a(i, 2)) And IsEmpty(a(i, 3)) Then

klin89

Super.

Vraiment vous êtes trop fort.

Merci mille fois.

bonjour,

Toujours moi qui reviens....

le IsEmpty(a(i, 3)) marche très bien

par contre peut ton mettre à la place si la valeur de la référence n'est pas dans le dico?

car sinon j'ai des doubles dans les référence si je relance et qu'il me reste du stock.

J'ai essayé de mettre " If dico.exists(a(i, 2)) And Not dico.exists(a(i, 3)) Then "

Je sais que je complique ma première demande.

Merci d'avance.

Re franck-63

Option Explicit
Sub test()
Dim a, i As Long, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    a = Sheets("stock").Range("a1").CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        If Not dico.exists(a(i, 1)) Then
            Set dico(a(i, 1)) = CreateObject("System.Collections.ArrayList")
        End If
        If Not dico(a(i, 1)).Contains(a(i, 2)) Then
            dico(a(i, 1)).Add a(i, 2)
        End If
    Next
    With Sheets("plan").Range("a1").CurrentRegion
        a = .Value
        For i = 2 To UBound(a, 1)
            If dico.exists(a(i, 2)) And IsEmpty(a(i, 3)) Then
                If dico(a(i, 2)).Count Then
                    a(i, 3) = dico(a(i, 2))(0)
                    dico(a(i, 2)).RemoveAt 0
                End If
            End If
        Next
        .FormulaLocal = a
    End With
End Sub

klin89

Re et re

Comme çà alors

Option Explicit
Sub test()
Dim a, i As Long, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    a = Sheets("stock").Range("a1").CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        If Not dico.exists(a(i, 1)) Then
            Set dico(a(i, 1)) = CreateObject("System.Collections.ArrayList")
        End If
        If Not dico(a(i, 1)).contains(a(i, 2)) Then
            dico(a(i, 1)).Add a(i, 2)
        End If
    Next
    With Sheets("plan").Range("a1").CurrentRegion
        a = .Value
        For i = 2 To UBound(a, 1)
            If Not IsEmpty(a(i, 3)) Then
                If dico.exists(a(i, 2)) Then
                    If dico(a(i, 2)).Count Then
                        If dico(a(i, 2)).contains(a(i, 3)) Then
                            dico(a(i, 2)).removeat dico(a(i, 2)).Indexof(a(i, 3), 0)
                        End If
                    End If
                End If
            End If
        Next
        For i = 2 To UBound(a, 1)
            If dico.exists(a(i, 2)) And IsEmpty(a(i, 3)) Then
                If dico(a(i, 2)).Count Then
                    a(i, 3) = dico(a(i, 2))(0)
                    dico(a(i, 2)).removeat 0
                End If
            End If
        Next
        .FormulaLocal = a
    End With
    Set dico = Nothing
End Sub

klin89

bonjour,

Avec du retard merci ça marche super bien.

encore bravo à vous et un grand merci

Rechercher des sujets similaires à "recherche attribution reference type produit"