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 :

La méthode select de la classe range a echoué (recherche de cellule) [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut La méthode select de la classe range a echoué (recherche de cellule)
    Bonjour,

    Mes recherches sur ce forum et sur internet ne me permettent pas de comprendre pourquoi la macro me renvoie ce message :
    "la méthode select" de la classe range a échoué".

    Je précise que je suis néophyte et que je crée mes macros sur la base des exemples récoltés au fur et à mesure de mes recherches (bref, le code est sans doute perfectible).
    Vous trouverez en pièce jointe le code et les variables associées.

    En synthèse: dans l'onglet "ADI", le double clic sur une cellule doit renvoyer sur l'onglet "GP", sur la cellule de même valeur que la cellule double-cliquée.
    La Macro:
    1. récupère la valeur double-cliquée: ok (cf exemple ="identifier et traiter les risques")
    2. cherche bien la cellule de l'onglet "GP" : ok
    3. trouve l'adresse de la cellule à atteindre : ok (cf exemple = "$B$9").
    4. refuse de se positionner dessus : KO


    A quoi est due cette erreur?
    Merci par avance pour tout éclairage.

    Bonne réception.

    Nom : Capture.PNG
Affichages : 418
Taille : 77,4 Ko

  2. #2
    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 re
    bonsoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub test()
        Dim Trouve As Range, PlaDeRecherche As Range, Valeur_Cherchee As String, AdresseTrouvee As String
        With Sheets("GP")
     
            'Valeur_Cherchee = ActiveCell.FormulaR1C1 '??????????
            Valeur_Cherchee = ActiveCell.Value
     
            'Set plagederecherche = .Columns(2) '?????????
            Set plagederecherche = .Range(.Cells(1, 2), .Cells(Rows.Count, 2).End(xlUp))
     
            Set Trouve = plagederecherche(what:=Valeur_Cherchee)'tu pourrais voir ici les argument lookat,lookin et autres ;aide VBA touche F1 dans VBE
     
            If Trouve Is Nothing Then .Activate: Trouve.Select on active le sheets si on trouve sinon on peut pas selectionner 
        End With
    End Sub
    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

  3. #3
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    Bonsoir Patrick,

    Merci pour votre réactivité.
    J'ai repris votre code.

    Dim Trouve As Range, PlaDeRecherche As Range, Valeur_Cherchee As String, AdresseTrouvee As String
    Je corrige « PlageDeRecherche », c'est bien cela?

    initialement : Set PlageDeRecherche = Sheets("GP").Columns(2)
    Votre proposition : Set plagederecherche = .Range(.Cells(1, 2), .Cells(Rows.Count, 2).End(xlUp))
    En testant ma solution initiale, cela me permettait de rechercher l'adresse de la cellule à atteindre (cf mon exemple et la pièce jointe).
    En quoi est-ce différent?
    Est-ce que la 2nde démarche explique le message d'erreur que j’avais?

    Set Trouve = PlageDeRecherche(what:=Valeur_Cherchee) 'tu pourrais voir ici les argument lookat,lookin et autres ;aide VBA touche F1 dans VBE
    Je suppose qu'il faut ajouter ".Find" avant "(what:=...), n'est-ce pas?
    Effectivement, j'ai vu que la fonction Find peut préciser des arguments sur la façon de chercher mais ces arguments sont facultatifs.
    Dans mon cas, la recherche se fait bien (cf exemple et PJ) --> je ne précise pas les éléments facultatifs.

    If Trouve Is Nothing Then .Activate: Trouve.Select 'on active le sheets si on trouve sinon on ne peut pas sélectionner
    Ici, j’ajoute NOT --> IF NOT Trouve … car je pense que c'est ce que vous souhaitez compte-tenu de votre commentaire.

    Après réalisé ces quelques ajustements, la macro me semble répondre à mes attentes, comme je le souhaitais. Je teste mais déjà un grand merci!

    Egalement, j’aurai aimé comprendre pourquoi la 1ère méthode de ne fonctionnait pas pour ne pas refaire l'erreur plus tard.
    L’adresse était bien récupérée mais je suppose que l’instruction Range(AdresseTrouvee).Select n’est pas correcte sans que je comprenne pourquoi.
    Dans votre démarche, je ne comprends pas pourquoi il est inutile de récupérer l'adresse.

    Cordialement,

  4. #4
    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 re
    Re
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub test()
        Dim Trouve As Range, PlageDeRecherche As Range, Valeur_Cherchee As String, AdresseTrouvee As String
        With Sheets("GP")
     
            'Valeur_Cherchee = ActiveCell.FormulaR1C1 '??????????
            Valeur_Cherchee = ActiveCell.Value
     
            'Set plagederecherche = .Columns(2) '?????????
            Set PlageDeRecherche = .Range(.Cells(1, 2), .Cells(Rows.Count, 2).End(xlUp))
     
            Set Trouve = PlageDeRecherche(what:=Valeur_Cherchee)
     
            If Not Trouve Is Nothing Then .Activate: Trouve.Select
        End With
    End Sub
    je faisait la meme erreur que toi
    Valeur_Cherchee = .ActiveCell.Value
    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

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      Dim Trouve As Range, PlageDeRecherche As Range
      Dim ValeurCherchee As String
     
      ValeurCherchee = ActiveCell.Value
      Set PlageDeRecherche = Sheets("GP").Columns(2)
      Set Trouve = PlageDeRecherche.Find(what:=ValeurCherchee)
      If Not Trouve Is Nothing Then
        Sheets("gp").Select
        Trouve.Select
      End If
    End Sub
    Le problème que tu rencontres provient du fait qu'au moment du Range(AdresseTrouvee).Select, tu es toujours dans l'évènement DoubleClick de la feuille ADI. Dès lors, Range(AdresseTrouvee).Select "veut dire" Worksheets("ADI").Range(AdresseTrouvee).Select. Or tu ne peux sélectionner des cellules que sur la feuille sélectionnée qui est déjà GP => plantage...

    Avec le code que je donne, Trouve EST sur GP => pas de plantage
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    Bonjour,

    Merci pour le code est les explications.

    Pourtant, quand je reprends mon code, je cherchais également dans l'onglet "GP", et plus dans l'onglet "ADI" (cf capture en pièce jointe de mon 1er billet).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AdresseTrouvee = Trouve.Adresse
    sheets("GP").select
    range(AdresseTrouvee).select
    En tous cas encore merci.
    Le code marche, c'est très bien.
    C'est juste que j'ai l'impression de ne pas aller au bout de mon erreur.

    Bonne réception.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Je vais essayer de t'aider à aller au bout...

    On croit trop souvent, à tort, que ne pas préfixer un Range force VBA à aller le chercher sur la feuille active, mais ce n'est pas aussi simple ni automatique que cela.

    Ce sera le cas lorsque tu es dans un module standard ou dans un module de classe qui n'expose pas d'objet Range dans ses propriétés, comme par exemple un userform. Si le Range non préfixé est utilisé dans un module de classe qui expose un objet Range (une feuille de calcul, mais tout module de classe qui exposerait un objet Range), c'est l'objet de ce module de classe qui est le parent du Range.

    Or, le code que tu utilises se trouve dans un module de classe qui expose une propriété Range (tu es dans le code de la feuille ADI), donc VBA associe le Range non préfixé que tu utilises à cet objet-là, c'est-à-dire la feuille ADI. En fait, lorsque tu utilises range(AdresseTrouvee).select dans un module de feuille de calcul, c'est comme si tu utilisais Me.range(AdresseTrouvee).select, Me. voulant dire "le module de classe dans lequel se trouve le code que tu utilises".

    Pour observer cela, dans un nouveau classeur, place le code suivant dans le module de Feuil1 ET dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub Test()
      MsgBox "Parent of Range(ActiveCell.Address): " & Range(ActiveCell.Address).Parent.Name & vbCrLf & _
        "Parent of ActiveCell: " & ActiveCell.Parent.Name
    End Sub
    Dans le module d'une autre feuille de calcul, ici Feuil2, place le code évènementiel suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      Feuil1.Test
      Test
    End Sub
    Le premier msgbox, appelé de Feuil1Test, montre bien que Range(ActiveCell.Address) pointe vers Feuil1, puisque Test est dans le module de Feuil1, donc VBA comprend le Range non préfixé comme Me.Range(Activecell.Address) et Me=Feuil1, et que ActiveCell est bien dans Feuil2 puisque c'est la feuille active.

    Nom : 20180824_1.png
Affichages : 259
Taille : 12,4 Ko



    Le second msgbox, appelé d'un module standard, considère que Range(...) non préfixé est sur la feuille Active, soit Feuil2

    Nom : 20180824_2.png
Affichages : 256
Taille : 12,7 Ko



    J'espère que ces explications t'auront éclairé sur le pourquoi du comment...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    Merci pour le complément d’information.

    Je clos la demande.

    Bonne réception

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 09/07/2014, 16h40
  2. [XL-2010] Méthode Select de la classe Range échoué
    Par Identifiant_Anonyme dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 29/05/2014, 10h06
  3. Méthode select de la classe range a échoué
    Par BERRACHED SAID dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 06/06/2013, 13h11
  4. Réponses: 4
    Dernier message: 26/08/2010, 13h40
  5. erreur méthode select de la classe range
    Par chloe2 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/11/2009, 10h23

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