A partir d'un mot clef copier des cellules sous excel

RWAN35

Nouveau membre
Bonjour,

Je débute en macro sous excel. J'ai un document Feuil1 qui représente une centaine d'informations toutes présentées de la même manière sous forme de tableaux. Je veux récupérer (copier) des valeurs contenues dans certaine cellules de ces tableaux et les reporter (coller) dans des cellules d'une Feuil2 qui elle, présente juste ces informations d'une manière différente.
J'ai par exemple une colonne d'un tableau qui commence par le mot "ETAPES". Je souhaite faire une fonction qui fera en sorte de repérer toutes les valeurs contenues dans les cellules sous "ETAPES" jusqu'à la première cellule vide trouvée (qui indique qu'on n'est plus dans le tableau, en fait), de les copier puis de les coller dans ma Feuil2 dans une colonne nommée "NUMEROS. Et ainsi de suite pour chaque tableau ou il y a une cellule " ETAPE ". Comme tout est bien présenté au départ, ETAPE est toujours en colonne A sur ma Feuil1.
En gros, si j'ai par exemple les valeurs A, D, F, G sous ma première cellule ETAPE de mon premier tableau de ma Feuil1, et les valeurs Toto, V, 45 sous la deuxième cellule ETAPE du deuxième tableau, je dois avoir A, D, F, G, Toto, V, 45 dans ma colonne NUMERO sur ma Feuil2.

Comme je l'ai dit, je débute alors je galère...

J'ai commencé un bout de code pour repérer chaque cellule contenant le mot ETAPE, et après je bloque :

'On travaille toujours sur la feuille 1
Set plage = Application.Sheets(1).Range("A:A") 'on cherche dans la colonne A
n = 0

For Each cel In plage
'c est le mot Step qui a ete choisi pour le decompte
If (cel.Text = "ETAPE") Then
 

zeb

Modérateur
Bonjour et bienvenue,

Tu débute aussi en forum ? - Alors va lire le règlement et modifie ce premier message pour nous présenter ton code mieux que ça.
 

RWAN35

Nouveau membre
Ah oui, effectivement, j'ai mal présenter la chose. Désolé, autant pour moi. Mais ma question fait peut-être doublon avec un sujet identique. Je vais donc chercher des réponses ailleurs. Merci pour l'aide
 

RWAN35

Nouveau membre
Re-bonjour !
Désolé pour la présentation du code, j’aurais voulu mieux faire mais je n’ai pas l’option « insérer du code »… Merci d’être compréhensif…
Sinon, j’ai cherché des réponses approchant mon problème mais me voilà toujours bloqué.

Alors, je le reformule :

Je compte un nombre de tests présentés sous forme de tableaux sur une Feuil1. J'ai choisi de compter le nombre de fois qu'apparait le mot ETAPE (car une fois par test) pour comptabiliser le nombre de tests que j'ai en tout. Ensuite, et c'est là que je bloque, j'aimerais copier chaque cellule pleine (avec une valeur, donc) de chaque colonne ETAPE d'un tableau, pour ensuite les coller les unes à la suite des autres dans une colonne NUMEROS présente elle dans un tableau sur la Feuil2. Est-il judicieux de faire comme ceci : copier tout ce qu'il y a sous ETAPE jusqu'à ce qu'on tombe sur une cellule vide (fin du tableau) puis aller coller sous NUMERO. Et ainsi de suite pour chaque ETAPE présent dans ma Feuil1 sachant qu'on doit ajouter sous ce qui vient d'être collé dans NUMEROS et non pas écraser.
Comment signifier ça dans mon For Each ?

Sub CompterNbreTestsEtCopieCellules()
'nombre de tests presents dans Feuil1

Dim plage As Range
Dim cel As Range
Dim n As Long

'on cherche dans la colonne A

Set plage = Application.Sheets(1).Range("A:A")
n = 0
For Each cel In plage

'c est le mot ETAPE qui a ete choisi pour le decompte des tests

If (cel.Text = "ETAPE") Then
n = n + 1 'compteur

End If
Next
MsgBox "Il y a " & n & " tests dans cette page."
End Sub
 

RWAN35

Nouveau membre
Bonjour ! Bon, j'espère que cette fois-ci ça va être comme vous voulez...

[cpp]Sub CompterNbreTestsEtCopieCellules()
'nombre de tests presents dans Feuil1

Dim plage As Range
Dim cel As Range
Dim n As Long

'on cherche dans la colonne A

Set plage = Application.Sheets(1).Range("A:A" )
n = 0
For Each cel In plage

'c est le mot ETAPE qui a ete choisi pour le decompte des tests

If (cel.Text = "ETAPE" ) Then
n = n + 1 'compteur

End If
Next
MsgBox "Il y a " & n & " tests dans cette page."
End Sub
[/cpp]

Je me demande si je ne dois pas faire une seconde macro tout compte fait au lieu de vouloir inclure la copie de données dans de qui est écrit ci-dessus. Qu'en pensez-vous ? J'ai commencé a écrire ceci, mais le résultat n'est pas à la hauteur...


[cpp] If (cel.Text = "Step") Then
ActiveCell.Offset(1, 0).Activate 'descendre a la cellule suivante vers le bas
End If
If ActiveCell.Value <> Empty Then
Selection.copy
Else
Set cible = Worksheets("Feuil2").Range.Value("NUMEROS").End(xlDown).Offset(1, 0)
Selection.Paste
End If[/cpp]
 

zeb

Modérateur
Ah, voilà, c'est mieux présenté. Avoue que tu ne l'avais pas lu ce règlement ! [:zeb:4]

[mode modo=off]
____________________________________

Bon, je relis et je consulte ton code.

Primo, il va falloir apprendre à indenter ton code. C'est une infamie ! Autant pour toi le relire que pour les autres puisque tu le proposes à la critique.

Secondo, tu vas abandonner tout de suite cette vilaine manie de passer par le presse-papier. Seul l'utilisateur doit explicitement utiliser le presse-papier, pas les macros qu'il utilise.

Tertio, et juste pour me faire plaisir (si, si, tu verras, prochainement, tu en auras envie :) ), je ne veux plus voir le moindre couple select/activate selection/activetruc. Fais une recherche sur le site pour savoir pourquoi !

Encore un truc, ne mets pas de parenthèses autour de tes tests. if() c'est du C ou du Java, pas du Basic ;)

Alors, le môssieu veut écrire dans une feuilles des nombres récoltés dans une autre.

Code:
Dim source As Range
Dim cible As Range
Dim compteur As Integer

compteur = 0

Set cible = Worksheets(2).Range("A2")       ' // A revoir. Admettons que A1 contienne le titre Numéros.
For Each source In Worksheets(1).Cols(1)    ' // On parcourt la première colonne de la feuille 1 
	If source.Text = "ETAPE" Then             ' // Cette cellule de la colonne 1 contient ETAPE
		cible.Value = source.Offset(0, 1).Value ' // On se décale d'une colonne à droite, et on copie la valeur de la cellule vers la cible
		Set cible = cible.Offset(1, 0)          ' // La cible est un peut plus bas
		compteur = compteur + 1
	End If
Next
Msgbox "Copie de " & compteur & " numéro(s)."

Oups, j'ai oublié de vérifier si ce que je recopiais était non vide :
Code:
Dim source As Range
Dim cible As Range

Set cible = Worksheets(2).Range("A2")
For Each source In Worksheets(1).Cols(1)
	If source.Text = "ETAPE" And source.Offset(0, 1).Text <> "" Then
		cible.Value = source.Offset(0, 1).Value
		Set cible = cible.Offset(1, 0)		
	End If
Next
Msgbox "Copie de " & compteur & " numéro(s)."

Bon, je n'ai pas tout compris, surtout en ce qui concerne le format de tes tableaux, mais voici une autre versions qui devrait t'aider à faire toi-même les réglages :


Code:
Dim source As Range
Dim cible As Range

Set cible = Worksheets(2).Range("A2")
For Each source In Worksheets(1).Columns(1).Cells
    If source.Text = "ETAPE" Then
        If source.Offset(0, 1).Text <> "" Then
            cible.Value = source.Offset(0, 1).Value
            MsgBox "ETAPE trouvé dans " & source.Worksheet.Name & "." & source.Address & "." & vbCrLf & _
                   "La cellule " & source.Offset(0, 1).Address & " est pas vide." & vbCrLf & _
                   "Le contenu a été copié dans " & cible.Worksheet.Name & "." & cible.Address & "." & vbCrLf & _
                    "La nouvelle cible est " & cible.Offset(1, 0).Address & "."
            Set cible = cible.Offset(1, 0)
        Else
            MsgBox "ETAPE trouvé dans " & source.Worksheet.Name & "." & source.Address & "." & vbCrLf & _
                   "Mais la cellule " & source.Offset(0, 1).Address & " est vide."
        End If
    End If
Next
 

RWAN35

Nouveau membre
Euh, je l'avais lu le réglement mais en diagonale... Et puis je ne

suis pas un habitué des forums comme tu l'as constaté alors pas de

coup sur la tête s'il te plait ! :ange:

Quelle clarté tout à coup !!! Merci beaucoup Zeb, c'est sympa car je

commence à y voir un peu plus clair grâce à tes explications avec ce

langage. J'y vais pas à pas tout de même !
Alors, je n'ai peut-être pas été précis concernant ce que je veux

faire, mais néanmoins j'ai déjà un bon début grâce à toi.
Ce ne sont pas les valeur à droite que je voulais, mais celles du

dessous. Ca, j'ai su faire. No problemo.
En revanche, et j'ai joint une image, ce n'est pas une seule cellule

que je souhaite copier mais bel et bien tout une plage de cellules

non vides, ici ce sont des numéros mais ça pourrait être du texte

aussi.
Dans la colonne A (Feuil1) de l'image, c'est mon document comment il

se présente en gros, et des tableaux ETAPE j'en ai une bonne centaine

! La colonne C, c'est ce que je souhaiterais obtenir au final

(Feuil2). En fait, je dois "balayer" toute la plage de cellule sous

ETAPE puis quand j'arrive sur une cellule vide alors je sais que mon

tableau se termine à la cellule juste au dessus (ici 4 et 7) et donc

que c'est cette plage de cellules comprise entre ETAPE (non inclus)

et ma première cellule vide trouvée (non incluse) que je dois copier

pour ensuite les coller sous NUMERO. Et ainsi de suite jusqu'au

dernier ETAPE trouvé...
Bon, je vais essayé quand même tout seul. Si j'ai un problème, je te

rappelle ? ;)

PS : Merci beaucoup pour ces réponses rapides ! C'est bien que des gens comme toi prennent de leur temps pour expliquer aux débutants un peu perdus ! Je ne sais pas si l'image va bien passer... Pourvu que si !


Vous devez être connecté pour voir les images.


Vous devez être connecté pour voir les images.

 

RWAN35

Nouveau membre
Bonjour Zeb !
Désolé de te déranger à nouveau, mais là je bloque à nouveau. J'essaie donc de faire ce que je dis ci-dessus à savoir copier toutes les cellules non vides sous chaque ETAPE pour arriver au résultat tel qu'il est illustré sur l'image jointe. J'utilise une boucle "do while" mais elle ne me donne aucun résultat satisfaisant. La plupart du temps, je ne récupère que les valeurs 1 et non les 2,3,4,5 etc...

[cpp]For Each source In Worksheets(1).Columns(1).Cells ' // On parcourt la première colonne de la feuille 1
If source.Text = "ETAPE" And source.Offset(0, 1).Text <> "" Then
cible.Value = source.Offset(1, 0).Value ' // On se décale d'une colonne en bas, et on copie la valeur de la cellule vers la cible
Set cible = cible.Offset(1, 0) ' // La cible est un peut plus bas
Do While ActiveCell.Value = ""
'If source.Offset(0, 1).Text <> "" Then
'Do While ActiveCell.Value = ""
ActiveCell.Offset(1, 0).Select
Loop[/cpp]

 

zeb

Modérateur
Désolé de te déranger à nouveau
Tu ne me déranges pas, parce que je te réponds si je veux :p
Pis je ne suis pas le seul sur ce forum :o

[:antp] J'ai déjà dit que je ne voulais plus voir d'ActiveTruc !
Code:
Do While ActiveCell.Value = ""
ActiveCell.Offset.Select

________________________________________


Tiens, je vais te proposer de la programmation avec drapeau :

Code:
Baisse {drapeau}

Pour {cellule} Dans {toutes les cellules de la plage A:A} Faire
  Si {texte de cellule} = "" Alors
  	Baisse {drapeau}
  Sinon Si {texte de cellule} = "ETAPE" Alors
  	Lève {drapeau}
  Sinon Si {drapeau} est levé
  	Copier {texte de cellule} Vers {cible}
		{cible} = Suivant {cible}
  Fin Si
Fin Pour

T'as compris quelque chose ? Alors à toi de le faire en VB... :D
(Donne-nous ton code pour le re soumettre à la critique)

A te lire :)
 

RWAN35

Nouveau membre
Salut Zeb,
Je reviens à mon problème après quelques jours d'absence. J'avais un autre boulot à terminer en priorité... Et évidemment, c'est plus dur de reprendre ses marques quand on a lâcher l'affaire quelques temps.
Et en parlant de "marques", je comprends qu'il faut marquer (flagger) dans ma feuil1 les cellules vident et ne pas marquer (ou dé-flagger) celles qui suivent une cellule dans laquelle le mot ETAPE apparait. Puis, copier ces cellules non marquée pour les coller dans ma feuil2 dans la colonne que j'aurai indiqué ("NUMERO" donc, et en l'occurrence à partir de la cellule I2).
Problème, je cherche comment on fait ça et là je trouve pas...
 

zeb

Modérateur
A mais non, pas du tout. Ce ne sont pas les cellules que tu dois flagguer. Relis le code en considérant drapeau comme une variable interne au programme. C'est juste comme si tu levais autant de doigts que de retenues dans une addition de tête ;) Tes doigts non rien à voir avec le calcul mais ils t'aident quand même :)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 136
Messages
6 718 120
Membres
1 586 398
Dernier membre
mookie767
Partager cette page
Haut