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 échoué


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Par défaut La méthode Select de la classe Range a échoué
    Bonjour,
    Le titre dit bien quel est mon problème, mais...ce que je ne parviens pas à comprendre, c'est pourquoi une fois ça marche, une fois ça marche pas et j'obtiens cette erreur... avec plusieurs instructions différentes, d'ailleurs !
    Je m'explique....
    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
    16
    17
     
    Private Sub Importer_Click()
    ' ============================================= PROGRAMME PRINCIPAL ================
    Set WB_Principal = ActiveWorkbook
    Dim Fichier1, Fichier2 As String
     
    FichierDB = ouverture_fichiers()
     
    WB_Principal.Activate
    Range("B65536").End(xlUp).Select    ' recherche de la dernière cellule non vide de la colonne B
    MONTANT1 = ActiveCell.Value
     
    Workbooks(FichierDB).Activate
    Range("A300").End(xlUp).Select    ' recherche de la dernière cellule non vide de la colonne A
    MONTANT2 = ActiveCell.Value
     
    End Sub
    Je travaille sur 2 tableurs simultanément.
    Dans le premier, la recherche de la dernière cellule non vide de la colonne B se passe sans problème
    Dans le second, la recherche aboutit à l'erreur 1004 et au message annoncé : "La méthode Select de la classe Range a échoué".
    J'ai essayé de remplacer cette instruction récalcitrante par plus élémentaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Cells(21, 1).Select
    Range("A21").Select
    avec le même résultat dans tous les cas.

    J'ai tendance à penser, à la lecture de plusieurs articles, que le problème se situe dans mon tableur 2, mais je ne vois pas où !

    Quelqu'un peut-il m'aider ?
    Merci d'avance à celui ou celle qui pourra ,
    Mike

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pourquoi ne travaillez vous pas avec un tableau structuré, la recherche du nombre de lignes est bien plus aisée et la programmation est beaucoup plus simple pour supprimer, ajouter des lignes

    Je travaille sur 2 tableurs simultanément.
    Dans le premier, la recherche de la dernière cellule non vide de la colonne B se passe sans problème
    Dans le second, la recherche aboutit à l'erreur 1004 et au message annoncé : "La méthode Select de la classe Range a échoué".
    J'ai essayé de remplacer cette instruction récalcitrante par plus élémentaire:
    Il est vraisemblable que le problème provienne du fait que vous ne précisez pas la parentalité de la cellule (classeur et feuille) en question et de plus il est inutile d'utiliser la méthode Select avec le VBA

    A lire éventuellement
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    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
    Déjà, le Select sur un Range, dans 99% des cas, ça ne sert à rien qu'à compliquer le code et l'utilisation.

    Exemple avec ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Importer_Click()
       Dim Fichier1, Fichier2 As String, FichierDB As String
       Dim WB_Principal As Workbook
     
       Set WB_Principal = ActiveWorkbook
       FichierDB = ouverture_fichiers()
     
       WB_Principal.Activate
       MONTANT1 = Cells(Rows.Count; 2).End(xlUp).Value
     
       Workbooks(FichierDB).Activate
       MONTANT2 = Range("A300").End(xlUp).Value
    End Sub
    Je n'ai pas tout corrigé dans tes déclaration mais il est étrange que tu déclares deux variables que tu n'utilises pas mais que tu ne déclares pas les variables que tu utilises.

    Tu ne le dis pas mais d'après le titre de ta macro, elle est sans doute déclenchée par un bouton de UserForm, non ?
    Il se pourrait que ton problème vienne que tu n'indiques pas les parents (la Worksheet) des Range et donc que celle qui est par sélectionnée ne correspond peut-être pas à celle dans laquelle devrait se faire la recherche.

    Ca cadrerait assez avec ce problème inconstant.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Par défaut
    Bonjour à tous 2,
    Désolé pour mon temps de réaction, j'ai été... très occupé

    Philippe:
    Ta suggestion pour l'utilisation de tableaux structurés est sans doute bonne sur le fond, mais... ce n'est pas moi qui crée le classeur en question.
    Il s'agit d'un classeur récupéré depuis mon agence bancaire.
    Leur première version est un classeur Excel assez joli et de structure peut-être pas si simple (on ne voit peut-être pas tout)
    Je peux aussi récupérer ces données sous forme de fichier .CSV: structure extrêmement simple, cette fois

    Et mon problème est identique avec les 2 documents... et demeure

    Menhir:
    Pour ce qui est des variables, tu as évidemment tout-à-fait raison !
    Cela provient du fait que j'ai voulu, pour proposer mon code, le résumer à l'endroit qui me pose problème, à savoir trouver la dernière cellule non vide d'un colonne.... et quelques petits restes ou imprécisions de variables n'ont pas été bien nettoyés.
    Pour ce qui est de ta suggestion, je n'avais pas précisé que le classeur où se fait la 2ème recherche ne comporte qu'UNE seule sheet; il ne peut donc y avoir de confusion.
    De plus, en effectuant le code pas à pas, je constate que le curseur se trouve bien dans la bonne feuille.

    Donc, merci à vous deux, mais.... ma question demeure entière: pourquoi la recherche de la dernière cellule non vide d'un colonne (voire simplement la sélection d'une cellule quelconque) se déroule sans problème dans le premier classeur, et refuse de s’exécuter dans le second ???

    Quelqu'un aurait-il une autre idée ? Je suis calé
    Merci d'avance
    Mike

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    ma question demeure entière: pourquoi la recherche de la dernière cellule non vide d'un colonne (voire simplement la sélection d'une cellule quelconque) se déroule sans problème dans le premier classeur, et refuse de s’exécuter dans le second ???
    Déjà expliqué dans ma première intervention
    Il est vraisemblable que le problème provienne du fait que vous ne précisez pas la parentalité de la cellule (classeur et feuille) en question et de plus il est inutile d'utiliser la méthode Select avec le VBA
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Par défaut
    Bonsoir Philippe,
    Merci de ta réponse.
    Comme la première fois, je ne suis pas sûr de bien comprendre...
    Comme je le disais, au pas à pas, je constate que mon "curseur" se trouve bien dans le bon classeur, ainsi que dans la bonne (unique) feuille.

    Néanmoins, en espérant avoir compris ce que tu veux me dire, j'ai ajouté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Historique des transactions").Select
    sans davantage de résultat.

    Mais peut-être n'ai pas bien compris ce que tu entends par la parentalité de la cellule (classeur et feuille)

    Et comme, ainsi que tu le dis: "Ce qui se conçoit bien....", pourrais-tu me préciser ce que tu entends par là ?

    Merci du coup de main
    Mike

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Mais peut-être n'ai pas bien compris ce que tu entends par la parentalité de la cellule (classeur et feuille
    Le parent d'une cellule est la feuille dans laquelle elle se trouve et le parent de la feuille est le classeur où elle se trouve. C'est pas plus compliqué que cela.

    Exemple
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Sub t()
      ' Déclaration des variables
      Dim wkbSource As Workbook
      Dim wkbTarget As Workbook
      Dim shtSource As Worksheet
      Dim shtTarget As Worksheet
      Dim rngSource As Range
      Dim rngTarget As Range
      ' Référnncement des objets
      Set wkbSource = Workbooks("2019 12 ChiifreAffaires.xlsx")
      Set wkbTarget = Workbooks("2019 Annuel.xlsx")
      Set shtSource = wkbSource.Worksheets("db")
      Set shtTarget = wkbTarget.Worksheets("Recap")
      Set rngSource = shtSource.ListObjects("T_Personnel").Range
      Set rngTarget = shtTarget.Range("A1")
     
    ' Code
      rngSource.Copy Destination:=rngTarget
     
     
      ' Libèrre les variables objets
      Set wkbSource = Nothing: Set shtSource = Nothing: Set rngSource = Nothing
      Set wkbTarget = Nothing: Set shtTarget = Nothing: Set rngTarget = Nothing
     
    End Sub
    A partir du moment où l'on a défini les objets, on peut copier, coller, effacer, trier, filtrer, etc.

    Par exemple
    • RngSource.Clear Efface la plage source
    • ShtTarget.Cells.Clear Efface toutes les cellules de la feuille cible
    • shtTarget.Tab.Color = vbBlue Met en bleu l'onglet de la feuille cible
    • etc.


    Rapel : Pas de Select ni d'Activate
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Par défaut
    Re-bonjour Philippe,
    J'ose encore me repointer

    J'avais donc bien compris cette notion de parentalité, c'est déjà ça.
    Pour le reste, je progresse puisque je n'ai plus de message d'erreur

    Mais ... cela dit, la progression s'arrête là.
    Voici ma fonction réécrite (un peu copiée-collée ) selon tes suggestions, mais le problème d'origine reste pour moi le même:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Private Sub Importer_Click()
      ' Déclaration des variables
      Dim wkbSource As Workbook
      Dim wkbTarget As Workbook
      Dim shtSource As Worksheet
      Dim shtTarget As Worksheet
      Dim rngSource As Range
      Dim rngTarget As Range
      ' Référnncement des objets
      Set wkbSource = Workbooks("DB-comptes2.xlsm")
      Set wkbTarget = Workbooks("Historique des transactionsxx.xlsx")
      Set shtSource = wkbSource.Worksheets("M+C-20")
      Set shtTarget = wkbTarget.Worksheets("Historique des transactions")
      'Set rngSource = shtSource.ListObjects("T_Personnel").Range
      'Set rngTarget = shtTarget.Range("A1")
     
    ' Code
      Set rngSource = shtSource.Range("B2000")
      DATE1 = rngSource.End(xlUp).Value
      LIGNE_max_1 = rngSource.End(xlUp).Row     'recherche de la dernière cellule de la colonne
      CELLULE_1 = Cells(LIGNE_max_1, 2).Value
      CELLULE_11 = Cells(LIGNE_max_1 - 4, 2).Value
     
      Set rngTarget = shtTarget.Range("A2000")
      DATE2 = rngTarget.End(xlUp).Value
      LIGNE_max_2 = rngTarget.End(xlUp).Row     'recherche de la dernière cellule de la colonne
      CELLULE_2 = rngTarget.Cells(LIGNE_max_2, 1).Value
      CELLULE_22 = rngTarget.Cells(LIGNE_max_2 - 4, 1).Value
      CELLULE_222 = rngTarget.Cells(66, 1).Value
     
      ' Libèrre les variables objets
      Set wkbSource = Nothing: Set shtSource = Nothing: Set rngSource = Nothing
      Set wkbTarget = Nothing: Set shtTarget = Nothing: Set rngTarget = Nothing
     
    End Sub
    Je sais, les variables ne sont pas encore correctement initialisées, mais le problème n'est pas là. Je cherche encore à comprendre le problème, et ceci n'est que le tout début d'un truc beaucoup plus large.
    Dans le classeur Source, CELLULE 1 et CELLULES 11 prennent les valeurs attendues, càd le contenu des cellules visées
    Dans le classeur Target, CELLULE_2,CELLULE_22 et CELLULE_222 restent désespérément vides ! J'utilise exactement les mêmes instructions dans les 2 classeurs.
    Je trouve cela d'autant plus surprenant que LIGNE_max_1 et LIGNE_max_2 récupèrent toutes les 2 une valeur correcte pour les 2 classeurs !!!

    Donc je ne comprends pas à côté de quoi je passe. Où est le lézard ?
    Merci encore de ton aide... mais si tu en attrapes marre, tu me le dis, hein
    Mike

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour comprendre, remplace l'instruction CELLULE_2 = rngTarget.Cells(LIGNE_max_2, 1).Value de la ligne 28 par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox rngTarget.Cells(LIGNE_max_2, 1).Address
    et je crois que tu comprendras où est l'erreur.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Par défaut
    Bonjour Philippe,

    Eh bien non je ne comprends pas !
    Je vois que la ligne d'adresse affichée ainsi est de 1999 unités trop grande, alors que la variable LIGNE_max_2 contient bien l'adresse de la ligne cherchée.
    Bien entendu, il est très simple de résoudre mon problème en remplaçant LIGNE_max_2, par LIGNE_max_2-1999,mais j'aimerais comprendre pourquoi ce n'est pas la valeur réelle de LIGNE_max_2 qui est prise en compte dans Cells(ligne,colonne) de la ligne 28.

    Je comprends d'autant moins que la ligne 22, parfaitement identique, me donne la réponse que j'attends, et en plus, si j'apporte la même correction en 22 qu'en 28, càd -1999, cela déclenche cette fois une erreur.

    Je reste donc toujours aussi perplexe et ma question demeure: pourquoi un comportement différent de 2 instructions identiques dans les 2 classeurs ?

    Encore merci de me consacrer ton temps
    Mike

  11. #11
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Dans l'instruction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CELLULE_2 = rngTarget.Cells(LIGNE_max_2, 1).Value
    L'erreur vient du fait que tu rattaches un objet Range (Cells(LIGNE_max_2, 1) à un autre objet Range (rngTarget) alors que c'est certainement à l'objet Worksheet (shtTarget) qu'il doit l'être.

    Dans l'illustration ci-dessous et à l'aide du code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub t()
      Dim sht As Worksheet
      Dim rng As Range
      Dim myValue As Variant
      Set sht = ThisWorkbook.Worksheets("Data")
      Set rng = sht.Range("B7").CurrentRegion
      '
      Debug.Print rng.Cells(3, 2).Address
      Debug.Print rng.Cells(3, 2).Value
      '
      Set sht = Nothing: Set rng = Nothing
    End Sub
    Nous pouvons constater que l'instruction Debug.Print rng.Cells(3, 2).Address, affiche dans la fenêtre d'exécution l'adresse $C$5 soit la ligne 3, 2ème colonne de la plage B3:E9

    Alors que si nous avions écrit Debug.Print sht.Cells(3, 2), l'adresse renvoyée aurait été $B$3 soit la 3ème ligne, 2ème colonne de la feuille

    As-tu saisi la différence ?
    Nom : 200913 dvp Range Cells.png
Affichages : 2259
Taille : 17,3 Ko
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 61
    Par défaut
    Bonjour Philippe,

    YES !!!
    Oui, j'ai compris ! Qu'est-ce que je peux être c.... ... (parfois)

    Merci de ta patience et pour tes explications didactiques !

    Au revoir et encore merci !
    Mike

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/04/2016, 14h33
  2. [XL-2007] La méthode Select de la classe Range a échoué
    Par aziz1015 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/10/2015, 11h23
  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

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