macro qui travaille sur plusieurs feuilles

  • Initiateur de la discussion Tony
  • Date de début
T

Tony

Guest
Bonjour à vous,

j'ai encore un problème à vous soumettre:

Ayant décidé de changer quelque peux l'organisation de mon projet excel, je me retrouve avec un bouton sur une feuille A qui doit rechercher quelque chose sur un tableau dans la feuille B et renvoyer les résultats sur la feuille A.

Ma macro faisait exactement ce que je voulais lorsqu'elle travaillait dans une même et unique feuille mais maintenant...

Voici la fonction, il faut que je l'exécute à partir de la feuille A, qu'elle recherche des lignes sur la feuille B, et qu'elle les renvoie sur la feuille A.
La prise de tête!!! (pour moi en tout cas)


Private Sub recherche_Click()

Rows("73:573").Select
Selection.Interior.ColorIndex = xlNone

ligne = 73
colonne = 1
token = 0
nbentree = 0

While token < 10

If colonne < 11 Then

If Cells(ligne, colonne) <> "" Then

'If UCase(Cells(ligne, colonne)) = UCase(TextBox1) Then
If InStr(UCase(Cells(ligne, colonne)), UCase(TextBox1)) > 0 Then
Range(Cells(ligne, 1), Cells(ligne, 10)).Select

With Selection.Interior
.ColorIndex = 44
.Pattern = xlSolid
End With

nbentree = nbentree + 1
ligne = ligne + 1

Else

colonne = colonne + 1

End If

Else
colonne = colonne + 1
token = token + 1

End If

Else
ligne = ligne + 1
colonne = 1
token = 0

End If
Wend

End Sub


Encore une fois, un grand merci d'avance à celui ou celle qui peut me donner un coup de main!


Tony
 
L

Lord Nelson

Guest
Salut Tony,

En fait quand tu travailles avec des données de la feuille active, tu n'as pas besoin de préciser où elles se trouvent. En revanche si tu veux voir des cellules d'une autre feuille, tu dois préciser :
Feuil2.Range("A1") ou Feuil3.Cells(1, 1) par exemple.
Donc, tu peux modifier ta recherche comme ceci :

If InStr(UCase(Feuil2.Cells(ligne, colonne)), UCase(TextBox1)) > 0 Then

et ça devrait marcher.

A+
LN
 
O

omicron

Guest
Bonsoir Tony,

A la lecture du code, je pense que ce que tu voudrais recopier de la feuille B à la feuille A, ce sont les cellules qui contiennent le texte contenu dans TextBox1.

A priori le problème est relativement simple, mais il faudrait toutefois préciser ou ranger les cellules à recopier dans la page A.


Je pense qu'il s'agit de la même place.

Exemple:
Si la cellule B73 de la page B contient le texte recherché, on la recopie dans la cellule B73 de la page A.

Merci de me confirmer cette supposition afin que je puisse te proposer une solution. Si tu le peux essaie de m'envoyer un petit exemple en pièce jointe.

A bientôt peut être.

Cordialement.

Omicron
 
T

Tony

Guest
Salut Omicron et Lord Nelson (ça faisait longtemps :) ), merci pour vôtre aide.

Lord Nelson:

En fait il faudrai que TOUTE la macro s'exécute sur une feuille différente (celle qui contient le tableau) car elle contient (la macro) les tests à effectuer pour parcourir le tableau.

Je récapitule mon souhait: elle s'active sur la feuille A, fait tout le boulot sur la feuille B, et recopie les ligne contenant les valeures trouvées sur la feuille A.

Omicron:

Exactement. J'ai joint le fichier, si tu a le temps de jeter un petit coup d'oeil..

Un GRAND MERCI à vous deux, si vous voulez dans mon fichier j'ai un morceau de code qui accélère les macros, c'est assez pratique je trouve.

A+

Tony
 

Pièces jointes

  • Proj1_ed.zip
    29.5 KB · Affichages: 21
O

omicron

Guest
Bonsoir Tony,

A partir du fichier envoyé, j'ai programmé un petit exemple qui peut t'aider à résoudre ton problème.

Dans la feuille A on saisit le texte à rechercher, on lance la recherche de ce teste dans la feuille B, on recopie chaque ligne de la feuille B contenant ce texte dans la feuille A.

=====================================================
Private Sub But_Rechercher_Click()

'Initialisation Range source à analyser (toutes les lignes)
Set RngSrc = Sheets("BaseParc").Range("73:573")

'Effacement des lignes du Range destination
Set RngDst = Sheets("Recherche").Range("8:508")
RngDst.Delete

'Initialisation Range destination (première ligne contenant le texte recherché)
Set RngLig = Sheets("Recherche").Rows(8)

'Recherche dans les lignes non vides (optimisation) de la source de toutes les lignes contenant le texte cherché
For Each Row In Intersect(Sheets("BaseParc").UsedRange, RngSrc).Rows
Set Cel = Row.Find(TextBox1.Text, LookIn:=xlValues)
If Not Cel Is Nothing Then
Cel.EntireRow.Copy Destination:=RngLig
Set RngLig = RngLig.Offset(1, 0)
End If
Next Row

'Comptage du nombre d'élément trouvés
Sheets("Recherche").Range("E3") = "Trouvé dans " & RngLig.Row - 8 & " lignes."

End Sub
=====================================================

Bien sur ce n'est qu'un exemple, beaucoup de variantes sont possibles.

Cordialement.

Omicron.
 

Pièces jointes

  • CopieRecherche.zip
    27.8 KB · Affichages: 28
T

Tony

Guest
Waow, super merci Omicron, ça marche impec!

Par contre euh comment dire...
Je capte pas grand chose au code que tu as écris, c'est que je suis un novice, pour le moment j'en suis à me démerder avec des boucles if then et do while, et avec des marqueurs.
Par rapport à ce que tu as fais il est clair que c'est du bricolage, mais ce classeur excel représente une partie de mon projet de fin d'année et il faut que je sache très bien l'expliquer, et en plus de ça j'ai d'autres macro à adapter de la même façon.

En fait je pensais qu'il suffisait juste de mettre un truc style activesheets("BaseParc") au début et inversement à la fin.

A ton avis y aurait-il moyen de "recycler" mes macros de cette façon ?

Je te remercie d'avoir déjà consacré pas mal de temps (à mon avis) à résoudre mon problème.
 
T

Tony

Guest
[oups, l'adresse mail ça fait spam style!]


Waow, super merci Omicron, ça marche impec!

Par contre euh comment dire...
Je capte pas grand chose au code que tu as écris, c'est que je suis un novice, pour le moment j'en suis à me démerder avec des boucles if then et do while, et avec des marqueurs.
Par rapport à ce que tu as fais il est clair que c'est du bricolage, mais ce classeur excel représente une partie de mon projet de fin d'année et il faut que je sache très bien l'expliquer, et en plus de ça j'ai d'autres macro à adapter de la même façon.

En fait je pensais qu'il suffisait juste de mettre un truc style activesheets("BaseParc") au début et inversement à la fin.

A ton avis y aurait-il moyen de "recycler" mes macros de cette façon ?

Je te remercie d'avoir déjà consacré pas mal de temps (à mon avis) à résoudre mon problème.
 

Discussions similaires

Réponses
0
Affichages
161

Statistiques des forums

Discussions
312 370
Messages
2 087 678
Membres
103 635
dernier inscrit
aime nguessanj