Copier coller avec conditions [Résolu]

Signaler
Messages postés
178
Date d'inscription
jeudi 15 mars 2007
Statut
Membre
Dernière intervention
2 janvier 2015
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour les ptis loups

Voila mon petit probleme :

feuille 1 (Feuille de données)
A1 : OP1
A2 : OP2
A3 : OP3
A4 : OP4
...
Si presence d'un "1" dans la case B1 à B.. copier le contenu de A..? et le coller dans feuille 2 à la suite (feuille recap).

Exemple : presence d'un 1 dans B2 et B4, copier A2 et A4 respectivement dans la feuille 2 (A1 et A2).

Merci de votre aide.

8 réponses

Messages postés
32108
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 avril 2021
345
Bonjour,

Désolé pour cet accueil glacial.. (c'est le temps qui veut ça...) mais bon.. en même temps.. tu n'as pas du lire la charte du site avant de poser ta question....

Ici.. nous ne faisons pas du code à la demande ! Nous AIDONS à le faire...
Donc... quel code as tu essayé de réaliser ?
Sur quoi bloques tu exactement ?
...



Bon.. c'est noël.. je vais être un peu plus sympa.....

Tu pourrais faire quelque chose du genre :
Sub toto()
Dim ShSource As Worksheet
Dim ShCible As Worksheet
Dim PlageATester As Range
Dim LastRFsource As Long
Dim LastRFcible As Long

Set ShSource = ThisWorkbook.Sheets(1)
Set ShCible = ThisWorkbook.Sheets(2)
LastRFsource = Derniere_Ligne(ShSource) + 1
Set PlageATester = ShSource.Range(Cells(1, 2), Cells(LastRFsource, 2))

For Each cell In PlageATester
Debug.Print cell.Value
If cell.Value = 1 Then
    LastRFcible = Derniere_Ligne(ShCible) + 1
    ShCible.Cells(LastRFcible, 1).Value = ShSource.Cells(cell.Row, 1).Value
End If
Next


End Sub

Function Derniere_Ligne(Sh As Worksheet) As Long
On Error GoTo noRow
Derniere_Ligne = Sh.Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row
Exit Function
noRow:
Derniere_Ligne = 0
End Function



Bien entendu .. il existe d'autres façons de faire... Tu pourrais par exemple utiliser les FILTRES .... ou la méthode FINDALL ..... mais là .. je te laisse chercher.


Et connaissant Ucfoutu (bonjour au passage..) ... il a sûrement encore d'autres solutions à proposer surement plus performantes.


Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bonjour, Jordane45,
Il y a en effet (plusieurs) des solutions plus rapides en exécution.
Mais lis mon post scriptum (mon message précédent). Ce n'est pas au hasard que mon accueil de Ticrain a été plutôt "de saison"...
Je ne suis pas certain de ce que du code tout cuit lui rende un vrai service.
Messages postés
32108
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 avril 2021
345 >
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018

Je ne suis pas certain de ce que du code tout cuit lui rende un vrai service.

Oui je sais bien... mais à force de trainer du côté de CCM ... je suis surement devenu trop gentil...

Et pour ce qui est de ton PS... je ne l'ai vu qu'après avoir posté ma réponse.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Oui ...
Bon.
La méthode la plus performante ? ===>>
Ses "1" (dont il se sert pour "cocher") sont donc manuels
La plage est donc déterminable par Specialcells(xlCellTypeConstants)
Et on peut deviner (s'il "coche", qu'en B, on a soit "1", soit rien (et rien d'autre)
Et donc :
Dim laplage As Range
Set laplage = Range("B:B").SpecialCells(xlCellTypeConstants)
j = 1
For Each a In laplage.Areas
For Each c In a.Cells
Worksheets("Feuil2").Range("A" & j).Value = c.Offset(0, -1).Value
j = j + 1
Next
Next


Ce qui peut également s'écrire en une seule ligne de code, ainsi :
Worksheets("Feuil1").Range("B:B").SpecialCells(xlCellTypeConstants).Offset(0, -1).Copy Destination:=Worksheets("Feuil2").Range("A1")


Amitiés.

PS : on peut d'ailleurs se demander pourquoi il "coche" à coups de "1" en B (plusieurs gestes à faire : clavier + souris) alors qu'il suffirait (souris + CTRL maintenu) de sélectionner dans A ! (puis d'utiliser l'objet selection, tout bêtement) !
Messages postés
178
Date d'inscription
jeudi 15 mars 2007
Statut
Membre
Dernière intervention
2 janvier 2015

Bonjour les ptis loups

J'oublié la commande pourra se faire à l'aide d'un commandbutton
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bonjour,
Bon : tu as exposé ce que tu cherches à faire.
Te reste à exposer le code que tu as au moins tenté pour y parvenir (condition sine qua non pour recevoir mon aide, conformément aux règles de ce forum). En te rappelant que nous ne sommes pas des "ptis loups", mais des développeurs, ce que tu es censé être également.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Il est bien évidemment clair que ta solution passe nécessairement par plusieurs (et pas une seule) "difficultés" (j'ai mis ce mot entre guillemets car je me demande si l'on peut vraiment qualifier de "difficultés" des choses simples et que l'on est censé avoir acquises dès le début ... et ton "début", à toi, remonte pourtant à plus de 6 ans ...).
6 ans, c'est beaucoup ...
Je vais donc me contenter à ce stade de de donner la marche à suivre (les étapes à passer).
1) détermination de la dernière ligne remplie de la colonne B :
Bien que cette détermination fasse l'objet d'un bon millier (au moins) de discussions sur ce forum ===>>
derligne = Range("B " & rows.count).end(xlup).row
2) parcours en boucle (et lecture de leur contenu) de 1 à derligne des cellules de la colonne B
3) déterminer si le dernier caractère de chaque valeur V ainsi lue est celui recherché (ton "1", par exemple) ===>> utilisation très simple de la fonction Right (à lire dans ton aide VBA).
et si tel est bien le cas, alors :
3) - a) déterminer le numéro N de la dernière ligne remplie de la colonne de ton autre feuille sous laquelle tu veux ajouter cette valeur ===>> voir ce que j'ai écrit en point 1)
3) b) : donner au contenu de cette cellule N la valeur V lue en 3)
Tout cela est d'une TRES grande simplicité et ne fait appel qu'à des connaissances très rudimentaires.
Reviens avec ton code d'essai écrit sur ces bases si encore en réelle difficulté.

PS : lorsque tu reviendras avec ton code d'essai, j'aurai l'occasion de te parler par ailleurs de l'imprécision de ta question, hein ...
Interroge-toi sur le pourquoi de ce post-scriptum. Un indice : Cela n'a rien à voir avec l'informatique et tout avec la logique.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Allez !
Je vais, avant ma sieste, t'aider à analyser ce que tu as écrit :
Si presence d'un "1" dans la case B1 à B

alors :
"1" est présent dans chacune de ces chaînes de caractères :
- "aaaa1bbbb2"
- "aaaabbbb12"
- ""aaaabbb21"
Ah zut alors !
Voudrais-tu alors dire que "1" doit être le dernier caractère ?
Ah ! mais alors :"1" est le dernier caractère de :
- "aaaabbb1"
- "aaaabbb31"
Ah ! zut, alors !
Voudrais-tu alors dire que ... Que quoi, donc ? Exprime-le s'il te plait avec PRECISION. Si tu y parviens, tu auras (avant toute notion informatique) fait le tout premier pas ...
Allez !Un effort à ce stade, au moins, s'il te plait.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
178
Date d'inscription
jeudi 15 mars 2007
Statut
Membre
Dernière intervention
2 janvier 2015

Bonjour à tous,

Merci pour vos réponses et cet accueil chaleureux! :)

Des images valent mieux que des longs discours!

Photo 1 : 5 operations de A1 a A5
3 sont checkés à l'aide de "1" dans les colonnes B1, B3 et B5 en exemple

Photo 2 : L'action sur le commandbutton
Photo 3 : Affiche dans la feuille 2 les operations checkés à l'aide des "1" les unes à la suite des autres.

Merci.

Ludo.


Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Alors :
1) ni un "long discours", ni des "images" n'étaient nécessaires !
Ce que tu aurais dû simplement dire était ceci :
"copier à la suite une une feuille feuille2, les données figurant en colonne A d'une feuille feuil1 lorsque, qui correspondent à une valeur = 1 en colonne B"
Ce n'est pas "en présence d'un "1" (qui est flou et ne veut pas forcément dire que ce "1" est le seul caractère critère), mais = 1
Bon ...
2) Tu as lu mes messages précédents, non ?
On attend ce que tu as au moins tenté d'écrire et qui est d'un niveau de débutant de chez débutant :
Ce que tu dois utiliser :
- détermination de la dernière ligne remplie d'une colonne (je t'ai dit comment)
- parcours de ta colonne B jusqu'à sa dernière ligne derlig remplie (une boucle élémentaire For I = 1 to derlig)
Au sein de cette boucle : lire la valeur de la cellule "B" & i (ouvre ton aide VBA sur le mot Range) et :
- Si = 1 ===>>
--- déterminer la dernière ligne derlig2 remplie de la colonne A ta feuille 2 (je t'ai dit comment)
--- donner à la cellule "A" & derlig + 1 de ta feuille 2 la valeur de la cellule "A" & i de ta feuille 1
C'est là vraiment quelque-chose de très très très rudimentaire et je t'ai donné tous les éléments pour y parvenir. Tout ce qu'il te faut apprendre (ton aide VBA est à lire), c'est ce qu'est un objet Range, dont la valeur est accessible en lecture et écriture et ce qu'est une boucle For ... to ... Next
La seule petite difficulté était la détermination de la dernière ligne remplie d'une colonne. Je t'ai dit comment le faire.
Reviens avec ton code d'essai, maintenant, s'il te plait.

PS : désolé si mes réponses te paraissent sévères, mais tu développes sous VBA depuis 7 ans déjà. Si, en 7 ans, tu n'as toujours pas acquis ces connaissances extrêmement rudimentaires, ce ne sera sans aucun doute pas en t'écrivant un code que tu n'aurais qu'à copier/coller que tu commenceras à apprendre.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
178
Date d'inscription
jeudi 15 mars 2007
Statut
Membre
Dernière intervention
2 janvier 2015

Merci Jordane 45