conditionnelle et recherche dans feuilles

johnshark

XLDnaute Junior
Bonjour le forum,
j'ai un classeur "obs1"(actif) et des feuilles bilans dont l'intitulé est nom et prénom (donc c'est très variable),
je souhaiterais créer une macro qui vérifierait si la cellule "B2" (qui est le nom de l'individu") dans chaque feuille est équivalente à celle de la colonne 1 de"obs1" (dans mon exemple de code la ligne 7, mais il me faudrait une boucle à vrai dire) :
Code:
Private Sub CommandButton2_Click()
For Each Sheet In ActiveWorkbook
    If ActiveSheet.Cells(7, 1).Text = Worksheet.Range("B2").Text Then
    Sheet.Range("C3").Value = ActiveSheet.Range("7,3").Text
    End If
Next Sheet
End Sub
J'ai un rapport d'erreur sur la première ligne du code... quelqu'un pourrait-il m'aider? J'ai oublié de dire mais cela doit se voir dans mon code, je suis débutant.

Merci d'avance
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : conditionnelle et recherche dans feuilles

Bonjour John, bonjour le forum,

J'ai commencé à regarder ton problème mais je n'y comprend rien... Je pense que tu t'es mélangé les pinceaux entre classeur et onglet... Pour ma part, j'attends que tu donnes plus d'informations avant de te proposer quelque chose.
 

johnshark

XLDnaute Junior
Re : conditionnelle et recherche dans feuilles

Bonjour Robert et le forum,

oui effectivement, je viens de voir l'énormité que j'ai écrite : ce n'est pas classeur "obs1" mais feuille "obs1".

Je mets une partie de mon fichier pour que tu puisses voir un peu.
Globalement, des userforms (non présentes sur le fichier) permettent d'ajouter des noms et prénoms dans le tableau de "obs1" et en parallèle de créer des fiches bilans (intitulé par le biais des noms et prénoms).
Des userforms permettent de remplir "obs1" (un formulaire avec textbox que la personne remplit).
Mon objectif est de créer une macro permettant de faire basculer les résultats d'un individu, inscrits dans "obs1" vers la feuille bilan qui s'y rapporte.
Donc je souhaite créer une macro qui :
- vérifie qui recherche où se trouve la cellule identique à la cellule de la colonne 1 dans la feuille active ("obs1"), dans les feuilles du classeur en "B2"
- qui copie les résultats aux tests vers cette feuille.
 

Pièces jointes

  • bien - Copie.zip
    32.2 KB · Affichages: 37

Robert

XLDnaute Barbatruc
Repose en paix
Re : conditionnelle et recherche dans feuilles

Bonjour John, bonjour le forum,

Plusieurs remarques... Dans ton exemple deux onglets (bilan et SharkJohn) ont la même valeur en B2. Tu ne dis pas comment doit réagir la macro dans ce cas là. Dans le code que je te propose j'ai mis un Exit For qui sort de la boucle dès qu'il rencontre le premier nom mais je ne sais pas si c'est cela que tu désires. Et, si c'est bien cela, comment doit vas-tu faire en cas d'homonymie ?

Si j'ai pas trop mal compris... voici le code :
Code:
Private Sub CommandButton2_Click()
Dim sh As Worksheet 'déclare la variable sh
Sheets("obs1").Select 'sélectionne l'onglet "Obs1"
For Each sh In Sheets 'boucle sur tous les onglets du classeur
    If sh.Name <> "Obs1" Then 'condition 1 : si le nom de l'onglets est différent de "Obs1"
        If Range("A7").Value = sh.Range("B2").Value Then 'condition 2 : si A7 (de "Obs1") = B2 (de l'onglet),
            sh.Range("C3").Value = Range("C3").Value 'C3 (de l'onglet) prend la valeur de C3 (de "Obs1")
            Exit For 'sort de la boucle
        End If 'fin de la condition 2
    End If 'fin de la condition 1
Next sh 'prochain onglet du classeur
End Sub
 

nolich

XLDnaute Occasionnel
Re : conditionnelle et recherche dans feuilles

Bonjour johnshark et Robert, bonjour à toutes et à tous :)

Sans savoir vraiment à quoi cela te servira, je te propose le code suivant :

Code:
Private Sub CommandButton2_Click()
'
Dim Sh As Worksheet
Dim ShName As String
'
  For Each Sh In ActiveWorkbook.Worksheets
    ShName = Sh.Name
    If ShName <> ActiveSheet.Name Then
      If Cells(7, 1).Text = Sh.Range("B2").Text Then
        Sh.Range("C3").Value = Range("7,3").Text
      End If
    End If
  Next Sh
End Sub

Tiens-nous au courant ;)

@+
 

johnshark

XLDnaute Junior
Re : conditionnelle et recherche dans feuilles

Re Michel, nolich let le forum,

Un grand merci à tous les deux.

Pour ce qui est des homonymies, j'ai fait le choix de la facilité en mettant une macro ajoutant un chiffre à côté du nom quand il y en a deux pareils (au début je souhaitais réaliser une vérification nom et prénom mais ça me semblait assez compliqué et lourd pour excel).

Je souhaiterais maintenant avoir la même chose mais avec le fait qu'il change de ligne (dans "obs1" la colonne ne bougeant pas) lorsqu'il a trouvé la feuille adéquate dans le classeur.
Globalement quand il a trouvé la feuille où "B3" = ligne 7 colonne 1 de "obs1"
il réalise la même chose pour la ligne suivante (ou précédante si on part de la fin).
Est ce possible ?
Merci d'avance pour votre aide
 

nolich

XLDnaute Occasionnel
Re : conditionnelle et recherche dans feuilles

Re :)

Peux-tu tester ce code qui va chercher dans chaque feuille le nom, puis vérifie s'il est bien dans la feuille de base "obs" et si oui, remplit l'année de naissance en cellule C3 de la feuille testée avec celle contenue en feuille "obs". Un exemple d'utilisation de Find, en prime :)

Code:
Private Sub CommandButton2_Click()
'
Dim Sh As Worksheet
Dim Cel As Range
'
  For Each Sh In ActiveWorkbook.Worksheets
    If Sh.Name <> ActiveSheet.Name Then
      Set Cel = Range("A:A").Find(what:=Sh.Range("B2"), LookIn:=xlValues)
      If Not Cel Is Nothing Then
        Sh.Range("C3").Value = Cells(Cel.Row, 3).Text
      End If
    End If
  Next Sh
End Sub

Tiens-nous au courant.

@+

EDIT : Correction d'une erreur : Cells(Cel.row, 3).Text au lieu de Range(Cel.Row, 3)
 
Dernière édition:

nolich

XLDnaute Occasionnel
Re : conditionnelle et recherche dans feuilles

Re :)

Dans les déclarations de variables, "Cel" est une variable Objet Range (non initialisée au départ).

Dans l'instruction : Set Cel = Range("A:A").Find(what:=Sh.Range("B2"), LookIn:=xlValues), si le programme trouve le contenu de B2 dans la colonne A:A, "Cel" représentera la cellule dans laquelle ce contenu a été trouvé.

Si, par contre, aucune correspondance n'a été trouvée, Cel sera un objet "vide" c'est-à-dire égal à Nothing. 2 solutions pour tester la valeur de Cel afin de ne pas avoir une erreur :

Cel Is Nothing => pas de correspondance en colonne A
Not Cel Is Nothing => Cel représente un objet Range valide donc correspondance en colonne A

Je ne sais pas si j'ai été très clair :rolleyes:

@+
 

johnshark

XLDnaute Junior
Re : conditionnelle et recherche dans feuilles

Bonjour le forum, nolich,
si je comprends ce que tu veux dire.

Par contre je viens de me rendre compte qu'il y a en fait un problème avec le code, je l'utilise pour copier 16 valeurs des obs1 vers une feuille bilan. Les feuilles bilans sont très bien remplie mais j'ai limpression que le processus inverse marche aussi : globalement il recherche et transmet les infos de "obs1" vers la feuille bilan correspondante, mais il envoie aussi dans l'autre sens (feuille bilan vers "obs1").
J'y ai passé mon après-midi mais je ne vois pas comment changer le code
 

nolich

XLDnaute Occasionnel
Re : conditionnelle et recherche dans feuilles

Re le fil, bonsoir à toutes et à tous :)

johnshark à dit:
Par contre je viens de me rendre compte qu'il y a en fait un problème avec le code, je l'utilise pour copier 16 valeurs des (?) obs1 vers une feuille bilan. Les feuilles bilans sont très bien remplie mais j'ai limpression que le processus inverse marche aussi : globalement il recherche et transmet les infos de "obs1" vers la feuille bilan correspondante, mais il envoie aussi dans l'autre sens (feuille bilan vers "obs1").

Normalement, l'instruction suivante :

If Sh.Name <> ActiveSheet.Name Then

empêche toute manipulation de cellules dans la feuille obs1. Le CommandButton2 est bien placé dans ta feuille obs ?
Ou exprimé autrement, la feuille obs1 est-elle bien la feuille active au moment de l'exécution du code ?

@+
 

johnshark

XLDnaute Junior
Re : conditionnelle et recherche dans feuilles

Re,
pardon une faute de frappe...
oui la feuille obs1 est bien active. Le bouton de commande est dans un userform qui n'est lié à proprement parler à aucune feuille (si je ne me trompe pas... un userform menu se lance au moment du lancement du fichier).
Donc le problème viendrait de là?
 

nolich

XLDnaute Occasionnel
Re : conditionnelle et recherche dans feuilles

Re :)

johnshark à dit:
oui la feuille obs1 est bien active. Le bouton de commande est dans un userform qui n'est lié à proprement parler à aucune feuille (si je ne me trompe pas... un userform menu se lance au moment du lancement du fichier).
Donc le problème viendrait de là?

Normalement non :confused: . Essaie quand même d'ajouter une instruction Sheets("obs1").Activate en début de procédure, on ne sait jamais.

Tiens-nous au courant.
 

johnshark

XLDnaute Junior
Re : conditionnelle et recherche dans feuilles

Dans un bouton permettant d'activer l'userform où il y le code, j'ai :
Code:
Sheets("obs1").Select

Je viens d'essayer avec celui que tu m'as donné, en le mettant au début du code de recherche et rien n'y fait.

Ok je crois que je viens de comprendre :eek: : en fait j'ai "obs1" et "obs2" et je réalise l'opération deux fois en activant "obs1" puis "obs2". Ma cervelle de moineau n'a pensé à aucun moment que,quand je suis sur "obs2", "obs1" n'est plus actif et donc l'écriture est permise...
Je suis vraiment désolé.
 

Discussions similaires

Statistiques des forums

Discussions
312 440
Messages
2 088 454
Membres
103 855
dernier inscrit
davignon