Copie valeurs colonne sous conditions valeurs autre colonne
Bonjour,
J'essaie de trouver un code me permettant de récupérer des valeurs figurant dans une colonne A, en fonction de valeurs présentes dans une autre colonne D et les copier à la suite sur une autre feuille et classé par ordre alphabétique .
exemple :
feuill1
colonne A--------colonne D
2012--------------Pierre
2014--------------Paul
2014--------------Jacques
2013--------------Daniel
je voudrais par la valeur d'un textbox qui sera sur mon userform et en activant un bouton récupérer les valeurs de la colonne D les copier sur la feuill2 à la suite, trier par ordre alphabétique.
textbox1.value = 2014
résultat
feuill2
colonne A
Jacques
Paul
J'espère avoir été claire.
Vous seriez sympa de m'aider à trouver Ce code
Je vous en remercie par avance
Amicalement
Bonjour et bienvenue sur le forum
Un essai à tester. Te convient-il ?
Merci pour ta réponse rapide et complète
C'est beaucoup plus compliqué que ce que je pensais
Ton fichier est parfait et fait exactement ce que je souhaite.
J'ai essayer, mais je n'arrive pas à adapter ton code a mon projet
J'ai fais une demande simple pensant pouvoir l'adapter mais en fait c'est plus compliqué que ça
Je te donne plus de précisions si tu veux bien continuer à m'aider
La procédure commence à partir un userform déjà très chargé donc ton initialize me semble lourd à intégrer à l'initialize du gros userform de départ
Private Sub UserForm_initialize()
End Sub
Est-il possible de mettre tout ou partie du contenu de ton Private Sub UserForm_initialize() au début du double clique du combobox qui se nomme enfmc qui lance la procédure ?
L'affichage de l'userform et la procédure ne doit se faire qu'à partir d'une feuille qui se nomme sheets("menu") qui reste affiché tout le temps de la procédure (l'utilisateur ne doit pas voir le déroulement, avec je pense l'utilisation de Application.ScreenUpdating = False/True)
La procédure se lance à partir d'un double clic sur un combobox qui se nomme enfmc
La valeur de l'année est donné par un combobox nommé anref
la feuille de départ ou figure les années et les prénoms se nomme sheets("BASE_FULL")
les données d'années démarrent en A4
les valeurs des prénoms à récupérer sont en colonne i donc .offset (9)
la feuille d'arrivée se nomme sheets("DONNES2")
les valeurs récupérées sont à mettre en Q1
les prénoms en Q1 jusqu'à ? doivent trier alphabétiquement
la liste ainsi obtenue alimente (par un simple .rowsource je pense) une combobox qui se nomme enfmc (de laquelle d'ailleurs je lance la procédure par un double clic)
Je reste à ta disposition pour plus de précisions et un grand merci pour ton aide
Amicalement
une petite question
que vient faire ce code ?
Range("A1").CurrentRegion.Offset(1, 0).ClearContents
et à quoi sert-il dans mon cas ?
il m'a tout effacé sur la page de réception des valeurs prénoms
nicaise a écrit :une petite question que vient faire ce code ?
Range("A1").CurrentRegion.Offset(1, 0).ClearContentset
à quoi sert-il dans mon cas ?
Il sert à initialiser c'est à dire effacer la plage de cellules où la macro va écrire ses résultats.
Si tu cliques plusieurs fois sur le bouton ''Import'' les anciens résultats sont effacés avant d'être remplacés par les nouveaux.
Sans cette instruction, les nouveaux résultats se mettent à la suite des anciens...
Pour tes autres demandes, c'est bien volontiers que je t'aiderai mais il me faudrait alors ton ''vrai'' fichier. Je ne sais pas faire avec un fichier virtuel...
Bye !
Merci
Je te prépares demain matin samedi 24/01/15, un fichier allégé avec juste ce qu'il te faut (là je vais dormir, chez moi il est 0:25).
Bonne soirée
Bonjour
Un essai à tester pour la production des états, si j’ai bien compris.
Elle s’obtient avec le bouton de la feuille ‘’ETATS’’ à partir de la feuille ‘’BASE_FULL’’
Cela te convient-il ?
Bonjour,
Merci pour ta réponse
J'ai téléchargé ton fichier mais la production des états ne fonctionne pas.
Quoi que j'indique dans le combobox1 (année de référence) j'ai le message du msgbox
"Il n'y a aucune valeur de l'année...). Il ne trouve pas la valeur année qui pourtant figure bien dans la BASE_FULL
Donc je n'ai pas pu voir ce que donne le résultat de la procédure une fois terminée.
Je cherche dans le code d'où peux venir le problème, sans succès pour l'instant.
Le code semble correcte pourtant
Pour tester, j'ai enlevé ceci du code
'On s'assure qu'il y a au moins une ligne pour l'année demandée
Set cell = bf.Range("A4:A" & Range("A" & Rows.Count).End(xlUp).Row).Find(Val(ComboBox1), lookat:=xlWhole)
' Set cell = bf.Range("A4:A" & Range("A" & Rows.Count).End(xlUp).Row).Find(Val(ComboBox1), lookat:=xlWhole)
If cell Is Nothing Then
MsgBox "Il n'y a aucune valeur de l'année " & ComboBox1 & _
" dans le tableau de la feuille ''BASE_FULL''", 16
End
End If
Le problème vient de ce bout de code parce qu'après
ÇA FONCTIONNE ET LE RÉSULTAT EST MAGNIFIQUE
Juste un petit souci avec 2013 sélectionné avec cette ligne
'Totaux horizontaux
For col = 13 To derCol Step 3
Cells(lgn + 2, col).Formula = "=SUM(R[-" & lgn - 4 & "]C:R[-2]C)" >>>> le débogage m'emmène sur cette ligne
Edit : en fait pour 2013
2013 semble ne pas existé dans la BASE_FULL
Aussi comme j'ai enlevé le code au début qui teste la présence d'une ligne au moins pour l'année demandée la procédure continue et met erreur en calculant les totaux.
Si le bout de code est remis il ne trouve pas l'année et la procédure s'arrête
En produisant les états, je constate aussi un petit décalage avec les entêtes
Les périodes sont inversées avec les N_Fact, dès la première colonne, ce qui décale tout le reste
Edit
Après quelques test en changeant cette ligne
bf.Range(bf.Cells(ln, col - 16), bf.Cells(ln, col - 15)).Copy
en
bf.Range(bf.Cells(ln, col - 15), bf.Cells(ln, col - 14)).Copy
Le décalage ne se fait plus et tout va au bon endroit
Peux tu confirmer ?
J'espère que cette modification n'a pas d'incidence sur autre chose
Bonjour
Je vois que tu ne te débrouilles pas mal du tout.
Pour les lignes que tu as supprimées, il y avait effectivement un bug. J’ai complété l’instruction où il manquait un ''bf.'' :
Set cell = bf.Range("A4:A" & bf.Range("A" & Rows.Count).End(xlUp).Row).Find(Val(ComboBox1), lookat:=xlWhole)
Et le test s’effectue normalement sur mon PC.
Fais l’essai avec 2011 ou 2016. Tu dois avoir un message mais pas de bug.
Si tu fais l’essai avec 2013, cela plantait tout de même car il n’y a aucune ligne répondant aux critères et la macro ne parvenait pas à faire les totaux.
J’ai donc fait un autre test. Là aussi, fais l’essai.
Et dis-moi le résultat…
Pour le décalage, tu as raison, la correction que tu as faite est bonne. Je l’ai reprise.
Bye !
J'ai modifié la ligne au début
et ajouté ces lignes
If lgn = "" Then
MsgBox "Il n'y a pas de valeurs positives dans les colonnes ''RESTE PÉRIODE'' pour " & ComboBox1
End
C'EST PARFAIT L'ETAT FONCTIONNE PAFAITEMENT ET 2013 NE POSE PLUS DE PROBLEMES
Le résultat est impressionnant, et au delà de mes attentes.
Tu es très fort et franchement j'ai encore du chemin à faire pour arriver à ce niveau.
J'aime beaucoup le VBA et obtenir des résultats comme ceux-ci me motive pour progresser.
UN GRAND MERCI A TOI.
Tu as travaillé sur l'état et je t'en remercie, mais qu'en est-il de ma demande de départ
(la copie des noms enfants en fonction de l'année choisi) ?
Je t'ai envoyé le fichier avec un userform pour comprendre et y insérez le code.
Il te suffit de cliquer sur interface pour voire ce que je souhaite.
Je me suis peut être mal exprimé ou tu ne m'as peut être pas compris ?
Vu ce que tu as fait avec mon fichier pour la production de l'état, cela ne doit être qu'une formalité pour toi.
Merci de me tenir informer
(je mettrais résolu une fois ma demande de départ résolue)
Amicalement
Bonjour
nicaise a écrit :qu'en est-il de ma demande de départ (la copie des noms enfants en fonction de l'année choisi) ?
Un essai à tester pour cette partie.
Mais je ne suis pas sûr du tout que cela soit bien ce que tu souhaites : à ton tour de cliquer sur le bouton INTERFACE de la page MENU et de jouer avec les menus déroulants de la fenêtre qui s'ouvre. Tu me diras ce qu'il en est.
Une remarque : tu sembles apprécier la propriété ‘’rowsource’’ des combobox.
Personnellement, je m’en sers très peu car la valeur de la propriété est alors figée.
Je préfère charger mes combobox avec la macro. De cette façon, ils s’adaptent aux besoins.
J’ai dû en effacer car on ne peut pas superposer les deux méthodes.
A te relire.
Bye !
Waou tu as fait compliqué et je me suis peut être mal fait comprendre.
Je vais avoir du mal a intégrer ton code à mon projet
Pour bien comprendre, le petit userform du fichier que je t'ai transmis n'existe pas.
C'est seulement un fragment du gros userfrom (capturé en jpeg pour te montrer le contexte de la procédure).
Ce que je souhaite est très simple.
Sur l'userform en sélectionnant l'année de référence, je veux que le combobox ne propose uniquement les enfants issus de la feuille BASE_FULL, classés par ordre alphabétique et correspndant à l'année choisie. C'est tout.
Je pense que l'idéal est de déclencher la procédure en choisissant l'année de référence (combobox anref) qui copirait sur la feuille DONNEES2 à colonne Q1 les enfants de l'année voulue issus de BASE_FULL et classés par ordre alphabétique.
La propriété rowsource du combobox enfant va de Q1à Q36 en sachant que cette structure ne peut accueillir que 30 enfants maxi par an
La limite du rowsource ne sera jamais atteinte.
Je trouve que c'est plus simple de cette façon parce que dès que des données apparaissent en DONNEES Q1, sans aucun autre code, ils sont dispo sur le combobox enfant.
Donc les seuls contrôles concernés par ma demande sont le combobox anneref et le combobox enfant.
Pour TOUT le reste, le projet est bouclé et les codes sont ok, c'est juste ça qui me manque pour la saisie des factures/enfants/années
Peux tu faire exactement comme cela ?
Je remercie encore pour ton aide
Amicalement
Bonjour
nicaise a écrit :Peux tu faire exactement comme cela ?
Bien sûr ! Je peux au moins essayer :
Cela te convient-il ?
What else ?
Bye !
J'ai adapté et modifié ton dernier code pour obtenir ce que je voulais.
Le résultat est parfait et tout fonctionne parfaitement
UN GRAND MERCI POUR TON AIDE
J'ai beaucoup apprécié ta participation
A bientôt je l'espère, sur une question
Amicalement
Ci-joint le fichier final avec les bon codes