IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Test d'un Cells.Find


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet SI
    Inscrit en
    Février 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Chef de projet SI

    Informations forums :
    Inscription : Février 2015
    Messages : 42
    Par défaut Test d'un Cells.Find
    Bonjour,

    Je cherche à tester un cells.find et s'il ne trouve pas la valeur qu'il arrête ma boucle.

    J'ai testé le code suivant mais sans réussite, la boucle étant arrêtée car il ne trouve pas de correspondance alors que la donnée cherchée existe bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim lignePA1 As Integer
    Dim PA1 As String
     
    For i = 1 To 3
        PA1 = Sheets("TR").Cells(lignePA, 2).Value
        If Cells.Find(PA1) Is Nothing Then
            Exit For
        Else
    Si vous avez une idée, je suis à l'écoute.

    Merci.

    Rémi

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Etant donné que ni ce que tu recherches ni la plage de recherche ne dépendent de la variable qui est modifiée par ta boucle (variable i), il est normal que s'il trouve quelque chose au premier passage, il le trouve aussi aux passages suivant.
    A moins qu'il y ait quelque chose dans la suite de ton code qui modifie le contenu des cellules trouvées.

    Il ne faut pas confondre Find et FindNext.

    Autre remarque. Etant donné qu'en cas de recherche infructueuse, tu sors de la boucle, il est inutile de mettre un "Else".
    Le "Else" et le "Exit For" sont redondants.
    Il est plus simple d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To 3
        PA1 = Sheets("TR").Cells(lignePA, 2).Value
        If Cells.Find(PA1) Is Nothing Then Exit For

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    Bonjour
    quand tu est dans l'éditeur vbe tape F1(aide vba) ou clique sur le point d'interrogation en haut a droite
    tape dans le moteur de recherche de la fenêtre find ou findnext et tu a un exemple tout prêt il te reste a l'adapter a ton cas
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Membre averti
    Homme Profil pro
    Chef de projet SI
    Inscrit en
    Février 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Chef de projet SI

    Informations forums :
    Inscription : Février 2015
    Messages : 42
    Par défaut
    Bonjour et merci pour vos réponses,

    J'ai déjà pu améliorer mon code grâce à ça.

    J'ai retravaillé mon code également, pour faire le test sur deux cells.find(variable) .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For lignePA = 1 To 3
        PA1 = Sheets("TR").Cells(lignePA, 2).Value
        PA2 = Sheets("TR").Cells(lignePA + 1, 2).Value
        If Cells.Find(PA1) Or Cells.Find(PA2) Is Nothing Then
            Exit For
            Else
            lignePA1 = Cells.Find(PA1).Row
            lignePA2 = Cells.Find(PA2).Row
        End If
    j'obtiens une incompatibilité de type (sachant que mes variables PA1 et PA2 sont définies en tant que String) alors que cela fonctionne quand je teste une seule variable à la fois.

    Auriez vous une idée pour éviter cette erreur ?

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par remi2305 Voir le message
    J'ai déjà pu améliorer mon code grâce à ça.
    Vu que tu as laissé ton "Else", ça ne semble pas avoir été très utile de t'indiquer comment rendre ton code plus lisible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cells.Find(PA1) Or Cells.Find(PA2) Is Nothing Then
    Le problème, ce ne sont pas des variable, c'est cette ligne.
    Tu additionnes des choux et des carottes.

    Find renvoie une référence de cellule. On ne peut pas faire un calcul binaire (ce que fait l'opérateur Or) sur une référence de cellule. Il faut une valeur binaire.

    Ton code marchera mieux (ou du moins ne renverra pas ce message d'erreur) ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For lignePA = 1 To 3
        PA1 = Sheets("TR").Cells(lignePA, 2).Value
        PA2 = Sheets("TR").Cells(lignePA + 1, 2).Value
     
        If Cells.Find(PA1) Is Nothing Or Cells.Find(PA2) Is Nothing Then Exit For
     
        lignePA1 = Cells.Find(PA1).Row
        lignePA2 = Cells.Find(PA2).Row

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] if cells.find = false
    Par Djromé dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/06/2011, 00h43
  2. [XL-2007] Gestion d'erreur- boucle de tri cells.find - debutant
    Par isfet dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/06/2010, 09h54
  3. [XL-2007] cells.find après un tri de données
    Par Médéstrac dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/05/2010, 16h27
  4. Utilisation de cells.find
    Par wanou44 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/11/2008, 17h24
  5. Réponses: 4
    Dernier message: 08/08/2006, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo