Macro pour copier/coller des données avec critères
Résolu/Fermé
freeycap
Messages postés
87
Date d'inscription
lundi 27 octobre 2014
Statut
Membre
Dernière intervention
3 septembre 2018
-
3 févr. 2015 à 03:23
via55 Messages postés 14496 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 22 novembre 2024 - 6 févr. 2015 à 19:34
via55 Messages postés 14496 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 22 novembre 2024 - 6 févr. 2015 à 19:34
A voir également:
- Macro pour copier/coller des données avec critères
- Copier coller pdf - Guide
- Copier-coller - Accueil - Windows
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Historique copier-coller android - Guide
- Symbole clavier copier coller - Guide
7 réponses
via55
Messages postés
14496
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
22 novembre 2024
2 735
5 févr. 2015 à 00:53
5 févr. 2015 à 00:53
Bonjour Yvan
Macro à associer au bouton :
Cdlmnt
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
freeycap
Messages postés
87
Date d'inscription
lundi 27 octobre 2014
Statut
Membre
Dernière intervention
3 septembre 2018
5 févr. 2015 à 04:50
5 févr. 2015 à 04:50
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
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
freeycap
Messages postés
87
Date d'inscription
lundi 27 octobre 2014
Statut
Membre
Dernière intervention
3 septembre 2018
5 févr. 2015 à 05:26
5 févr. 2015 à 05:26
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 ?
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 ?
via55
Messages postés
14496
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
22 novembre 2024
2 735
5 févr. 2015 à 14:27
5 févr. 2015 à 14:27
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
Si tu veux fusionner 2 valeurs la bonne syntaxe sera :
Range("K" & ligne) = Feuil4.Range(("C" & n).Value) & Feuil4.Range(("D" & n).Value)
Cdlmnt
freeycap
Messages postés
87
Date d'inscription
lundi 27 octobre 2014
Statut
Membre
Dernière intervention
3 septembre 2018
5 févr. 2015 à 15:14
5 févr. 2015 à 15:14
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
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
via55
Messages postés
14496
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
22 novembre 2024
2 735
5 févr. 2015 à 15:18
5 févr. 2015 à 15:18
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)
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)
freeycap
Messages postés
87
Date d'inscription
lundi 27 octobre 2014
Statut
Membre
Dernière intervention
3 septembre 2018
>
via55
Messages postés
14496
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
22 novembre 2024
Modifié par freeycap le 5/02/2015 à 16:30
Modifié par freeycap le 5/02/2015 à 16:30
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...
et j'en ai tellement à apprendre en vba excel, moi qui débute... ca donne le tournis...
via55
Messages postés
14496
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
22 novembre 2024
2 735
5 févr. 2015 à 15:22
5 févr. 2015 à 15:22
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
freeycap
Messages postés
87
Date d'inscription
lundi 27 octobre 2014
Statut
Membre
Dernière intervention
3 septembre 2018
5 févr. 2015 à 16:03
5 févr. 2015 à 16:03
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 ?
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 ?
via55
Messages postés
14496
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
22 novembre 2024
2 735
5 févr. 2015 à 17:17
5 févr. 2015 à 17:17
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
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
freeycap
Messages postés
87
Date d'inscription
lundi 27 octobre 2014
Statut
Membre
Dernière intervention
3 septembre 2018
5 févr. 2015 à 17:28
5 févr. 2015 à 17:28
En fait , j'avais essayer comme ca, juste avec la seconde partie du code, mais une recherche sur le formateur uniquement ne fonctionne pas.
via55
Messages postés
14496
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
22 novembre 2024
2 735
Modifié par via55 le 5/02/2015 à 19:00
Modifié par via55 le 5/02/2015 à 19:00
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)
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)
freeycap
Messages postés
87
Date d'inscription
lundi 27 octobre 2014
Statut
Membre
Dernière intervention
3 septembre 2018
5 févr. 2015 à 19:47
5 févr. 2015 à 19:47
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 ?
via55
Messages postés
14496
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
22 novembre 2024
2 735
Modifié par via55 le 5/02/2015 à 20:25
Modifié par via55 le 5/02/2015 à 20:25
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
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
freeycap
Messages postés
87
Date d'inscription
lundi 27 octobre 2014
Statut
Membre
Dernière intervention
3 septembre 2018
6 févr. 2015 à 19:18
6 févr. 2015 à 19:18
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
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
via55
Messages postés
14496
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
22 novembre 2024
2 735
6 févr. 2015 à 19:34
6 févr. 2015 à 19:34
Tant mieux
Merci de passer en résolu (en haut de ton message)
A plus
Via
Merci de passer en résolu (en haut de ton message)
A plus
Via