Macro parcours,extraction et ordonnancement des données

Excel.Deb

XLDnaute Nouveau
Bonjour,
Je voudrais réaliser une macro qui effectue l'ordonnancement des références de produits selon un ordre de criticité donné(de 1 à 3).
En gros,la macro va agir sur 3 feuilles:
feuil 1 contient le plan de production hebdomadaire où est indiqué les quantités planifiées par semaine(possibilité d'avoir des cellules vides par référence)

feuil 2 contient une base de données où se trouve toutes les références,avec leurs composants et l'ordre de criticité dans la même ligne

feuil 3 est la feuil où on devrait afficher le résultat de la macro.

Ce que je voudrais faire c'est me positionner sur la 1ère référence de la feuil 1,si la cellule est vide,on passe à la 2ème référence et extraire les données depuis la feuil 2 liées à cette référence jusqu'à balayer toutes les références et afficher le résultat sur dans un tableau de la feuil 3 qui contient en premier lieu les références avec l'ordre de 1 puis les références avec ordre de 2,ainsi de suite.
Merci de me suggérer quelques idées.
 

Robert

XLDnaute Barbatruc
Bonjour Excel.Deb, bonjour le forum,

Sans un fichier exemple anonymisé je ne m'y risquerai pas. Trop de temps perdu...
 

Robert

XLDnaute Barbatruc
Re,

Je crois que c'est pire avec le fichier !... tu dis : "me positionner sur la 1ère référence de la feuil 1,si la cellule est vide,on passe à la 2ème ". Mais tu parles de quelle colonne ?!... Il y en a 6 pour chaque ligne, des colonnes B à G !... Toujours pas clair ton histoire...
 

Robert

XLDnaute Barbatruc
Re,

Les références onglet 1 : refNuméro. Les références onglet 2 : ref[espace]Numéro... Incohérent !?...
 

Robert

XLDnaute Barbatruc
Re,

Essaie comme ça :

VB:
Sub Macro1()
Dim O1 As Worksheet 'déclare la variable O1 (Onglet 1)
Dim O2 As Worksheet 'déclare la variable O2 (Onglet 2)
Dim O3 As Worksheet 'déclare la variable O3 (Onglet 3)
Dim TV1 As Variant 'déclare la variable TV1 (Tableau des Valeurs 1)
Dim TV2 As Variant 'déclare la variable TV2 (Tableau des Valeurs 2)
Dim I As Integer, J As Integer, K As Integer, L As Integer 'déclare les variables I, J, K et L
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim PL As Range 'déclare la variable PL (PLage)

Set O1 = Worksheets("Feuil1") 'définit l'onglet 1
Set O2 = Worksheets("Feuil2") 'définit l'onglet 2
Set O3 = Worksheets("Feuil3") 'définit l'onglet 3
TV1 = O1.Range("A1").CurrentRegion 'définit la tableau des valeurs TV1
TV2 = O2.Range("A1").CurrentRegion 'définit la tableau des valeurs TV2
O3.Range("A1").CurrentRegion.Offset(2, 0).ClearContents 'efface d'eventuelles ancienne données de l'onglet 3
K = 1 'initialise la variable K
For I = 2 To UBound(TV1, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV1 (en partant de la seconde)
    For J = 2 To UBound(TV2, 1) 'boucle 2 : sur toutes les lignes J du tableau des valeurs TV2 (en partant de la seconde)
        If TV1(I, 2) <> "" And TV1(I, 1) = TV2(J, 1) Then 'condition : si la donnée ligne I colonne 2 de TV1 n'est pas vide et que la référence est commune aux deux tableaux
            ReDim Preserve TL(1 To UBound(TV2, 2), 1 To K) 'redimensionne le tableau des lignes TL (autant de ligne que TV2 a de colonnes, K colonnes)
            For L = 1 To UBound(TV2, 2) 'boucle 3 sur toutes les colonnes K du tableau des valeurs TV2
                TL(L, K) = TV2(J, L) 'récupère dans la ligne L de TL la donnée en colonne L de TV2 (=> Transposition)
            Next L 'prochaine colonne de la boucle 3
            K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
            Exit For 'sort de la boucle 2
        End If 'fin de la condition
    Next J 'prochaine ligne de la boucle 2
Next I 'prochaine ligne de la boucle 1
'renvoie dans A3 redimensionnée le tableau TL transposé
O3.Range("A3").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
Set PL = O3.Range("A1").CurrentRegion 'définit la plage PL
Set PL = PL.Offset(2, 0).Resize(PL.Rows.Count - 2, PL.Columns.Count) 'redéfinit la plage PL (sans les deux premières lignes)
PL.Sort O3.Range("F3"), xlAscending, Header:=xlNo 'classement alphabétique de la colonne 5
O3.Columns(6).Delete 'supprime la colonne 6 (=>colonne F) de l'onglet O3
End Sub
 

Excel.Deb

XLDnaute Nouveau
Bonjour Robert,
Tout d'abord merci pour l'effort fourni,j'ai pris toute la matinée pour comprendre le code,et puis j'ai essayé de l'adapter en changeant quelques appellations relatives à mon code mais il indique une erreur sur une ligne de code que je vais joindre.
 

Fichiers joints

Robert

XLDnaute Barbatruc
Re,

Une ligne de code extraite de son contexte ne me permettra pas de voir d'où pourrait venir l'erreur. Si tu ne fais pas l'effort d'envoyer le fichier contenant le code je ne pourrai rien pour toi...
C'est la deuxième fois que je te le répète : prend l'habitude de proposer un fichier exemple, tu obtiendras de l'aide bien plus rapidement...
 

Excel.Deb

XLDnaute Nouveau
Bonjour,
tout à fait d'accord,c'est noté.
je vais joindre le fichier correspondant.
Cependant,j'ai une remarque par rapport à la boucle L,je pense que les composants devront être remplis pour chaque référence dans la colonne correspondante...si j'ai bien compris la boucle,il sont remplis dans les lignes de tableau9.
 

Fichiers joints

Robert

XLDnaute Barbatruc
Re,

Il est quand même insensé que tu fournisses le fichier sans le code que tu as modifié !!!... C'est désespérant.

Bon, dernière explication car je ne reviendrai plus sur ce fil.
Tu sembles confondre Tableau9 l'onglet et TL la variable tableau des lignes.
Que fait le code :
1. Diverses lignes de préparation
2. Boucle 1 : Il parcourt toutes les lignes de la colonne A de l'onglet Tableau_pdp
3. Boucle 2 : Il parcourt toutes les lignes de la colonne A de l'onglet Tableau_ref
4. Quand les références sont identiques et que la cellule de la colonne Jour1 n'est pas vide (Attention ! Elles sont désormais en colonne 3 au lieu de 2), il alimente le tableau TL. Mais comme on se connaît pas à l'avance le nombre de référence que va contenir TL, il faut redimensionner ce tableau à chaque fois que les conditions sont remplies. Et comme c'est un tableau à deux entrée et que seule la seconde entrée peut-être augmentée on récupère les données en les transposant. Cela signifie que les colonnes de Tableau_pdp sont stockées dans des lignes de TL.
4. À la fin, pour restituer les lignes et les colonnes on re transpose TL.
5. Un tri se fait sur la colonne 6 (qui contient les critères)
6. La colonne 6 des critères est supprimée.
En pièce jointe ton fichier avec le code...
 

Fichiers joints

Excel.Deb

XLDnaute Nouveau
Merci infiniment Robert pour votre aide,cependant,pour clarifier, j'ai joigné le fichier avec l'idée que le code modifié est inclus,parce que c'est pour mon propre intérêt.
Enfin,vous m'avez été très utile pour l'avancement de mon travail..merci encore une fois.
à bienôt.
 

Discussions similaires


Haut Bas