Macro pour copier/coller des données avec critères

Résolu
freeycap Messages postés 87 Statut Membre -  
via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai une liste de formateurs qui donnent par année plusieurs dizaines de formations.
Cette liste est présente dans une feuille avec d'autres informations sur les formations données.
Ce que je cherche à faire, c'est d'extraire la liste des formations données par un formateur, avec ou sans le choix d'une année, et coller cette liste sur la feuille ADMIN de mon doc...

J'ai regardé et testé plusieurs solutions, mais visiblement, il me manque de la connaissance vba. Non seulement je n'arrive pas èa sortir l'info de la feuille DATA, mais en plus, je n'arrive pas les coller è partir d'une certaine cellule, en descendant vers le bas..

Merci d'avance pour votre aide.

Voici le dossier : http://www.cjoint.com/data3/3BddHqivPAP.htm

Yvan

7 réponses

  1. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonjour Yvan

    Macro à associer au bouton :

    Sub Rectangle3_Clic()
    ' efface lignes
    Range("I7:I50").ClearContents
    'variable ligne d'inscription
    ligne = 9
    ' récupère nom et année
    nom = Range("B7")
    annee = Range("B9")
    ' copie nom et année en I
    Range("I7") = nom
    Range("I8") = annee
    ' derniere ligne remplie de DATA en colonne 1
    derlig = Sheets("DATA").Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
    ' boucle sur les lignes d DATA
    For n = 2 To derlig
    ' si le nom en DATA correspond et si pas d'année choisi ou si année en DATA correpond
    If Sheets("DATA").Range("A" & n) = nom And (annee = "" Or Sheets("DATA").Range("C" & n) = annee) Then
    ' incremente la ligne où copier
    ligne = ligne + 1
    ' copie la formation en I
    Range("I" & ligne) = Sheets("DATA").Range("B" & n).Value
    End If
    Next
    End Sub


    Cdlmnt
    0
  2. freeycap Messages postés 87 Statut Membre
     
    C'est tellement parfait...
    Vraiment merci beaucoup.
    Ca marche vraiment bien

    Je ne comprends pas trop la ligne 13
    derlig = Sheets("DATA").Columns(1).Find("*", , , , xlByColumns, xlPrevious)
    plus particulièrement : Find("*", , , , xlByColumns, xlPrevious)
    Je n'arrive pas lire, ou à la visualiser...

    Merci beaucoup,

    Yvan
    0
  3. freeycap Messages postés 87 Statut Membre
     
    Autre question :

    Dans la ligne 21 :
    Range("I" & ligne) = Feuil4.Range("B" & n).Value
    je comprend qu'on va chercher les valeurs dans la colonnes B de la feuille Data.

    Imaginons que je recherche maintenand l'année et le mois d'une formation données par un formateur, alors j'écrirai le code comme tel :

    Private Sub CommandButton24_Click()

    ' efface lignes
    Range("K7:I100").ClearContents

    'variable ligne d'inscription
    ligne = 9

    ' récupère nom et année et mois
    formateur = Range("B7")
    formation = Range("B8")

    ' copie formateur et formation et mois en K
    Range("K7") = formateur
    Range("K8") = formation

    ' derniere ligne remplie de DATA en colonne 1
    derlig = Feuil4.Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row

    ' boucle sur les lignes d DATA
    For n = 2 To derlig

    ' si le nom en DATA correspond et si pas d'année choisie ou si année en DATA correpond
    If Feuil4.Range("A" & n) = formateur And (formation = "" Or Feuil4.Range("B" & n) = formation) Then

    ' incremente la ligne où copier
    ligne = ligne + 1
    ' copie la formation en K
    Range("K" & ligne) = (Feuil4.Range(("C" & "D") & n).Value)
    End If

    Next

    End Sub

    Si je veux fusionner les valeurs présentes en colonne C et D de la feuil4 (data), dans la même cellule, est-ce que :
    Range("K" & ligne) = (Feuil4.Range(("C" & "D") & n).Value)
    est la bonne chose èa faire ?
    0
    1. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
       
      Non car là tu vas chercher la valeur dans la colonne CD !
      Si tu veux fusionner 2 valeurs la bonne syntaxe sera :
      Range("K" & ligne) = Feuil4.Range(("C" & n).Value) & Feuil4.Range(("D" & n).Value)

      Cdlmnt
      0
  4. freeycap Messages postés 87 Statut Membre
     
    Excellent...
    Y a t'il moyen d'ajouter un espace en l'année et le mois ?
    Les 2 valeurs sont collées :
    2014Décembre
    Ou idéalement :
    2014, Décembre
    0
    1. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
       
      oui, tu concatenes ce que tu veux avec les &
      Range("K" & ligne) = Feuil4.Range(("C" & n).Value) & " " & Feuil4.Range(("D" & n).Value)
      ou
      Range("K" & ligne) = Feuil4.Range(("C" & n).Value) & ", " & Feuil4.Range(("D" & n).Value)
      0
      1. freeycap Messages postés 87 Statut Membre > via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention  
         
        mince... c'est tellement plaisant... je me suis tromper de carriere.... lol
        et j'en ai tellement à apprendre en vba excel, moi qui débute... ca donne le tournis...
        0
    2. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
       
      Je m'aperçois que j'avais répondu aussi à ta précédente question concernant le Find mais elle a disparu ! Je remets donc :
      derlig est la dernière ligne non vide de la colonne trouvée par le Find qui cherche une cellule avec quelque chose ("*") à partir du bas voir les explications ici :
      https://forums.commentcamarche.net/forum/affich-37622001-vba-detection-de-cellule-vide-ligne-colonnne
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. freeycap Messages postés 87 Statut Membre
     
    Je m'excuse via55, je te pose beaucoup de questions, mais je débute vraiment...

    si dans ton code, celui que tu m'as donné en premier, je veux aussi permettre la recherche des Formations (Feuil4 col B) par année, j'ai ajouté un morceau à la fin pour faire comme ca :

    ' efface lignes
    Range("I7:I100").ClearContents

    'variable ligne d'inscription
    ligne = 9

    ' récupère nom et année et mois
    nom = Range("B7")
    annee = Range("B9")
    mois = Range("B10")

    ' copie nom et année et mois en I
    Range("I7") = nom
    Range("I8") = annee
    Range("I9") = mois

    ' derniere ligne remplie de DATA en colonne 1
    derlig = Feuil4.Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row

    ' boucle sur les lignes d DATA
    For n = 2 To derlig

    ' si le nom en DATA correspond et si pas d'année choisie ou si année en DATA correpond
    If Feuil4.Range("A" & n) = nom And (annee = "" Or Feuil4.Range("C" & n) = annee) And (mois = "" Or Feuil4.Range("D" & n) = mois) Then

    ' incremente la ligne où copier
    ligne = ligne + 1
    ' copie la formation en I
    Range("I" & ligne) = Feuil4.Range("B" & n).Value

    End If

    Next

    Range("I7:I100").ClearContents

    'variable ligne d'inscription
    ligne = 9

    ' récupère nom et année et mois
    nom = Range("B7")
    annee = Range("B9")
    mois = Range("B10")

    ' copie nom et année et mois en I
    Range("I7") = nom
    Range("I8") = annee
    Range("I9") = mois

    ' derniere ligne remplie de DATA en colonne 1
    derlig = Feuil4.Columns(3).Find("*", , , , xlByColumns, xlPrevious).Row

    ' boucle sur les lignes d DATA
    For n = 2 To derlig

    ' si le nom en DATA correspond et si pas d'année choisie ou si année en DATA correpond
    If Feuil4.Range("C" & n) = annee And (nom = "" Or Feuil4.Range("A" & n) = nom) And (mois = "" Or Feuil4.Range("D" & n) = mois) Then

    ' incremente la ligne où copier
    ligne = ligne + 1

    ' copie la formation en I
    Range("I" & ligne) = Feuil4.Range("B" & n).Value

    End If

    Next

    End Sub

    Le probleme, c'est qu'en faisant comme ca, le code de la premiere partie qui fonctionnait bien ne s'execute plus... J'ai l'impression que
    End If
    Next
    fait que la premiere partie ne s'execute plus... Est-ce que le End If suivi de Next est la bonne chose à faire ?
    0
    1. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
       
      Re,

      Tu as enchainé 2 procédures, le 1er code s'exécute bien mais le second aussi et il efface avec clear.contents ce qu'avait écrit le 1er !
      En fait un seul code suffit le second, en effet si tu n'indiques ni l'année ni le mois il renverra toutes les formations du formateur, si tu indiques l'année il ne renverra que les formations de l'année choisie et si tu indiques aussi le mois que les formations de ce mois

      Supprimes toutes les lignes du 1er code jusqu'au premier next compris et ça devrait fonctionner
      0
  7. freeycap Messages postés 87 Statut Membre
     
    En fait , j'avais essayer comme ca, juste avec la seconde partie du code, mais une recherche sur le formateur uniquement ne fonctionne pas.
    0
    1. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
       
      Désolé je me suis trompé en allant vite , je n'avais pas vu que tu avais inversé les conditions dans le If du 2eme code, c'est le 1er code qu'il faut garder avec :
      If Feuil4.Range("A" & n) = nom And (annee = "" Or Feuil4.Range("C" & n) = annee) And (mois = "" Or Feuil4.Range("D" & n) = mois) Then

      La première condition vérifie le nom et y adjoint la condition de l'année si elle existe et la condition du mois s'il existe)
      0
  8. freeycap Messages postés 87 Statut Membre
     
    Et dans le cas ou je veule extraire les formations (feuil4 col2) avec la conditions unique de l'année, sans prendre en compte la condition du nom du formateur ?
    0
    1. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
       
      Dans ce cas il faut compliquer les IF pour avoir les 2 cas de figure séparés par un OU :
      If (Feuil4.Range("A" & n) = nom And (annee = "" Or Feuil4.Range("C" & n) = annee) And (mois = "" Or Feuil4.Range("D" & n) = mois) ) Or (nom="" And ( Feuil4.Range("C" & n) = annee) ) Then
      0
    2. freeycap Messages postés 87 Statut Membre
       
      Merci beaucoup via55... Une aide grandiose de ta part. Très très apprécié.
      Non seulemement ca m'a permis de compléter mon projet avec brio au travail, mais en plus ca m'a vraiment fait apprendre tout un tas de choses.
      Au plaisir de te retrouver dans mes procgaines questions, parce que mon projet va continuer avec des macros sur les graphiques Excel...

      Yvan
      0
    3. via55 Messages postés 14391 Date d'inscription   Statut Membre Dernière intervention   2 759
       
      Tant mieux

      Merci de passer en résolu (en haut de ton message)

      A plus

      Via
      0