Copier coller selon deux conditions

Bonsoir le forum,

Vue la gentillesse et l'aide efficace que j'ai trouvé sur ce forum, me voilà encore une fois avec une nouvelle demande:

J'ai déjà cherché sur le forum mais les solutions proposées ne sont pas adaptées à ma demande.

J'ai une BDD que je voudrais exploiter en plusieurs listes dans plusieurs onglets.

Je cherche une macro qui va copier les "NOM" et "PRENOM" et les coller dans les différentes feuilles nommées selon "CLASSE"

Donc la première condition c'est la colonne D c'est à dire "CLASSE" ( PETITE SECTION sur la feuille PETITE SECTION, ...)

La deuxième condition se trouve sur la colonne BN c'est à dire "DATE DE DEPART" qui devrait être vide. ( si elle est non vide ne pas copier)

Vous trouverez ci-joint un fichier test pour plus de détails.

Merci pour toute aide ou orientation.

25teste-listes.xlsx (72.94 Ko)

Bonjour

Un essai à tester. Te convient-il ?

Bye !

Bonsoir Youness, bonsoir le forum,

Essaie comme ça :

Sub Macro1()
Dim P As Worksheet 'déclare la variable P (onglet Parametrage)
Dim B As Worksheet 'déclare la variable B (onglet Bdd)
Dim TC As Variant 'déclare la variable TC (Tableau des Classes)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément de ligne)
Dim J As Byte 'déclare la variable J (incrément de classe)
Dim OD As Worksheet 'déclare la variable OD (onglet Destination)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

Set P = Worksheets("PARAMETRAGE") 'définit l'onglet P
Set B = Worksheets("BDD") 'définit l'onglet B
TC = P.Range("CHOIX_CLASSE") 'définit le tableau des classes TC
TV = B.Range("A4").CurrentRegion 'définit le tableau des valeurs TV
For J = 1 To UBound(TC, 1) 'boucle 1 : sur toutes les classes J du tableau des classes TC
    Set OD = Sheets(TC(J, 1)) 'définit l'onglet destination OD
    For I = 5 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la cinquième)
        'condition : si la donnée ligne I colonne 66 (=> colonne BN) du tableau des valeurs TV n'est pas vide et si la donnée
        'ligne I colonne 4 (=> colonne D) du tableau des valeurs TV correspond à la classe du tableau des classes TC
        If TV(I, 66) = "" And TV(I, 4) = TC(J, 1) Then
            Set DEST = OD.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0) 'définit la cellule des destination DEST
            DEST.Value = TV(I, 2) 'renvoie le nom dans DEST
            DEST.Offset(0, 1).Value = TV(I, 3) 'renvoie le prénom dans DEST décalée d'une colonne à droite
        End If 'fin de la condition
    Next I 'prochaine ligne de la boucle 1
Next J 'prochaine classe de la boucle 2
End Sub

Salut,

Il y a du monde sur le fil !

J'ai une proposition basée sur le filtre avancé.

27teste-listes.xlsm (99.40 Ko)

A toi de voir.

A+

H

Bojour gmb, ThauThème ,LordNelson45,

Merci beaucoup pour vos propositions qui marchent bien.

Remarque à propos de celle de ThauThème, (d'abord merci pour les commentaires et explications, cela me permet d'apprendre et de comprendre le fonctionnement pour mieux adapter la solution). Le problème c'est qu'à chaque fois que je relance la macro les noms se mettent en dessous des anciens existant au lieu de faire une mise à jour. Je pense au fait que le code ne contient pas .ClearContents. Pourrait-on l'inclure et à quel niveau. Merci

Bonjour le fil, bonjour le forum,

Tu ne l'avais pas précisé et impossible de remettre la main sur ma boule de cristal !...

Sub Macro1()
Dim P As Worksheet 'déclare la variable P (onglet Parametrage)
Dim B As Worksheet 'déclare la variable B (onglet Bdd)
Dim TC As Variant 'déclare la variable TC (Tableau des Classes)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément de ligne)
Dim J As Byte 'déclare la variable J (incrément de classe)
Dim OD As Worksheet 'déclare la variable OD (onglet Destination)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

Set P = Worksheets("PARAMETRAGE") 'définit l'onglet P
Set B = Worksheets("BDD") 'définit l'onglet B
TC = P.Range("CHOIX_CLASSE") 'définit le tableau des classes TC
TV = B.Range("A4").CurrentRegion 'définit le tableau des valeurs TV
For J = 1 To UBound(TC, 1) 'boucle 1 : sur toutes les classes J du tableau des classes TC
    Set OD = Sheets(TC(J, 1)) 'définit l'onglet destination OD
    OD.Rows("5:45").ClearContents 'efface d'éventuelles anciennes données
    For I = 5 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la cinquième)
        'condition : si la donnée ligne I colonne 66 (=> colonne BN) du tableau des valeurs TV n'est pas vide et si la donnée
        'ligne I colonne 4 (=> colonne D) du tableau des valeurs TV correspond à la classe du tableau des classes TC
        If TV(I, 66) = "" And TV(I, 4) = TC(J, 1) Then
            Set DEST = OD.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0) 'définit la cellule des destination DEST
            DEST.Value = TV(I, 2) 'renvoie le nom dans DEST
            DEST.Offset(0, 1).Value = TV(I, 3) 'renvoie le prénom dans DEST décalée d'une colonne à droite
        End If 'fin de la condition
    Next I 'prochaine ligne de la boucle 1
Next J 'prochaine classe de la boucle 2
End Sub

Bonjour ThauThème, Le forum,

Merci beaucoup pour le code, ça marche très bien et il est tellement bien expliqué que j'ai voulu en faire plus.

Voila j'ai créer d'autres feuille sur le même fichier où je voudrais avoir d'autres informations à partir de la BDD ( En plus du nom et prénom, je voudrais avoir la classe "colonne D", la date de naissance" colonne CE " le lieu de naissance"colonne CF" et la date d'inscription"colonne J"). J'ai créer une nouvelle liste sur "PARAMETRAGE" avec un nom "LISTE_CLASSE" mais cela ne marche pas. Je n'arrive pas à adapter le code pour une double utilisation dans le même fichier.

Je vous met le nouveau fichier pour plus de détails.

Merci d'avance.

11teste-listes-2.xlsm (138.17 Ko)

Bonjour Youness, bonjour le forum,

Tu avais bien compris le principe et bien adapté mais tu as oublié que dans la colonne CLASSE (colonne D) de la base de données tu n'écrivais pas "Liste " suivi de la classe mais seulement la classe.

Donc, la condition :

If TV(I, 66) = "" And TV(I, 4) = TC(J, 1) Then

n'était jamais vérifiée et tes tableaux restaient vide.

J'ai remplacé cette condition par :

If TV(I, 66) = "" And TV(I, 4) = Mid(TC(J, 1), 7)

et maintenant ça marche...

Le fichier :

22youness-v02.xlsm (140.90 Ko)

Bonjour ThauThème, le forum,

Merci beaucoup pour le temps et les efforts que vous avez consacré à ma demande.

Je viens de tester et ça marche bien. Merci encore une fois.

Rechercher des sujets similaires à "copier coller deux conditions"