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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 171
    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 171
    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 171
    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 171
    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 171
    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 171
    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

+ 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