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 :

Erreur d'Exécution '1004' - La méthode Select de la classe Worksheet a échoué (mais pas trop) [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut Erreur d'Exécution '1004' - La méthode Select de la classe Worksheet a échoué (mais pas trop)
    Bonjour le forum,

    Oui, l'intitulé est quelque peu étrange, mais vous devriez comprendre par la suite après les explications

    Voici le code sur lequel apparaît l'erreur d'exécution 1004 (sur 2 lignes)
    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
    Private Sub T_Cons_CBBIC_Init()
        Dim CBR As Range, CellCBR As Range, CBS As Range, CellCBS As Range
        Dim derLig As Integer, derCol As Integer
        'Le fonctionnement est sensiblement identique à T_Cons_CBSite_Init...
     
        Set Wb = ThisWorkbook
        'En premier ici. Mais lorsque je clique sur Débogage, puis de nouveau sur Exécuter... surprise ça fonctionne !
        Wb.Sheets(3).Select
     
        derCol = Wb.Sheets(3).Cells(1, Columns.Count).End(xlToLeft).Column
        'En second ici... Mais lorsque je clique sur Débogage, puis de nouveau sur Exécuter... eh bah ça fonctionne aussi...
        Set CBR = Wb.Sheets(3).Range(Cells(1, 1), Cells(1, derCol))
     
        For Each CellCBR In CBR
            If CellCBR.Value = Frame1.Caption Then
                derLig = Wb.Sheets(3).Cells(Rows.Count, CellCBR.Column).End(xlUp).Row
     
                Set CBS = Wb.Sheets(3).Range(Cells(2, CellCBR.Column), Cells(derLig, CellCBR.Column))
     
                For Each CellCBS In CBS
                    T_Cons_CBBIC.AddItem (CellCBS.Value)
                Next
            End If
        Next
        '...à quelques détails près
        T_Cons_LBBIC.Visible = True
        T_Cons_CBBIC.Visible = True
        'On rend de nouveau visibles la CheckBox_BIC et le Label_BIC
    End Sub
    L'affichage des erreurs se situe au début du code, j'ai mis en commentaire. Je réécris les lignes ci-dessous au cas où ça ne soit pas assez clair dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Wb.Sheets(3).Select
    Set CBR = Wb.Sheets(3).Range(Cells(1,1),Cells(1,derCol))
    Je dois avouer que je ne comprends pas pourquoi l'erreur disparaît comme par enchantement dès lors que je ré-exécute manuellement. La suite du code fonctionne parfaitement et effectue ce que je souhaite. Je tiens à préciser que j'ai un code en tout point pareil, si ce n'est qu'il choisit la Sheets(2), et pour ce code je n'ai aucune erreur d'exécution qui s'affiche...

    Merci d'avoir pris le temps de lire mon problème,

    Bonne journée à vous

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Révèr, bonjour le forum,

    C'est vrai que c'est étrange, surtout si seul le classeur contenant la macro est ouvert... Si tu travailles sur plusieurs classeurs ouverts, il te faut spécifier le classeur actif avant de sélectionner l'onglet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Wb.Activate
    Wb.Sheets(3).Select

  3. #3
    Membre éprouvé
    Homme Profil pro
    Fortune teller
    Inscrit en
    Octobre 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Fortune teller

    Informations forums :
    Inscription : Octobre 2007
    Messages : 110
    Par défaut Méthode select
    Ou bien utilise la collection Worksheets au lieu de Sheets.
    Worksheets(3)...

  4. #4
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut
    Le Wb.Activate a tout simplement résolu le problème, néanmoins j'en ai un autre qui se trouve dans une autre procédure, encore une fois avec un .Select, mais cette fois-ci l'erreur m'indique que " l'indice n'appartient pas à la sélection "

    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
    Private Sub TOTAL_Ent()
        Dim answer As Integer, Année As Integer
     
        Set WbT = Workbooks(OB4.Caption & Frame1.Caption)
     
        WbT.Activate
        answer = Autretest
     
        Select Case answer
     
            Case 1
                With MP1
                    .Pages("Page1").Visible = True
                    .Pages("Page2").Visible = False
                End With
            Case 2
     
            Case 3
     
        End Select
     
     
        Année = InputBox("Veuillez saisir une année comptable - 4 chiffres")
        WbT.Worksheets(Année).Select
    End Sub
    Ligne d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WbT.Worksheets(Année).Select
    J'ai testé avec "Sheets(Année)", avec et sans "WbT.Activate" , j'ai toujours la même erreur.

    Je précise que les valeurs retournées par WbT et par Année correspondent à ce que je souhaite, à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    OB4.Caption = TOTAL
    Frame1.Caption = Nord-Est
    WbT = Workbooks(TOTALNord-Est)
    Année = 2018
    WbT.Worksheets(Année).Select
    'où la variable Année a bien la valeur 2018
    'j'ai vérifié lors du Débogage les valeurs prises par les variables
    Et mon classeur TOTALNord-Est contient bien la feuille 2018.

  5. #5
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 369
    Par défaut
    Je me suis dit... Pourquoi ne pas tester d'intégrer l'InputBox à la place de la variable ? Et... Bingo, ça fonctionne ! Alors oui c'est très moche visuellement, mais je dois avouer ne pas comprendre pourquoi lorsque je mets "Année" ça ne fonctionne pas - alors que... bah Année = InputBox("Veuillez saisir une année comptable - 4 chiffres")
    J'ai essayé en Dim String et Dim Integer, rien ne fonctionnait. La curiosité m'a permis de trouver cette solution, qui je me doute n'est pas la plus jolie au niveau du code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks(OB4.Caption & Frame1.Caption).Sheets(InputBox("Veuillez saisir une année comptable - 4 chiffres")).Select
    Merci à tous pour votre aide, mon problème est résolu ! Néanmoins, si vous trouvez des solutions qui pourraient être plus adaptées, je suis tout à fait preneur ^^

  6. #6
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour le fil, bonjour le forum,

    le nom de l'onglet est de type String donc il te faut déclarer l'inputbox Année de type String et là, pas de soucis.

    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
    Private Sub TOTAL_Ent()
    Dim answer As Integer, Année As String
     
    Set Wbt = Workbooks(OB4.Caption & Frame1.Caption)
    Wbt.Activate
    answer = Autretest
    Select Case answer
        Case 1
        With MP1
            .Pages("Page1").Visible = True
            .Pages("Page2").Visible = False
        End With
        Case 2
        Case 3
    End Select
    Année = InputBox("Veuillez saisir une année comptable - 4 chiffres")
    Wbt.Worksheets(Année).Select
    End Sub
    Cela dit, la règle d'or en VBA c'est d'éviter les Select et autres Activate autant que tu le peux. Ils ne font que ralentir l'exécution du code et sont source de plantages.
    À titre d'exemple, ton premier code sans eux. Il devrait fonctionner très bien (sauf si je me suis planté quelque part (ce qui n'est pas rare)...

    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
    Private Sub T_Cons_CBBIC_Init()
    Dim CBR As Range, CellCBR As Range, CBS As Range, CellCBS As Range
    Dim derLig As Integer, derCol As Integer
    Dim WbO As Worksheet
     
    Set Wb = ThisWorkbook
    Set WbO = Wb.Sheets(3)
    derCol = WbO.Cells(1, Columns.Count).End(xlToLeft).Column
    Set CBR = WbO.Range(WbO.Cells(1, 1), WbO.Cells(1, derCol))
    For Each CellCBR In CBR
        If CellCBR.Value = Frame1.Caption Then
            derLig = WbO.Cells(Rows.Count, CellCBR.Column).End(xlUp).Row
            Set CBS = WbO.Range(wboCells(2, WbO.CellCBR.Column), WbO.Cells(derLig, WbO.Cells.Column))
            For Each CellCBS In CBS
                T_Cons_CBBIC.AddItem (CellCBS.Value)
            Next CellCBS
        End If
    Nextcellcbr
    '...à quelques détails près
    T_Cons_LBBIC.Visible = True
    T_Cons_CBBIC.Visible = True
    End Sub

  7. #7
    Membre éprouvé
    Homme Profil pro
    Fortune teller
    Inscrit en
    Octobre 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Fortune teller

    Informations forums :
    Inscription : Octobre 2007
    Messages : 110
    Par défaut Erreur d'exécution
    Ligne d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WbT.Worksheets(Année).Select
    3 remarques :

    1. Tu dois utiliser la collection Worksheets en mettant l'indice de la feuille (1 pour la première, 2 pour la seconde) càd leur place dans le classeur : Worksheets(1), Worksheets(2), etc
    Soit en mettant le nom de la feuille Worksheets("Feuil1"), Worksheets("Feuil2"), etc

    2. Il y mieux que InputBox pour entrer des données : c'est d'utiliser une cellule d'une feuille en utilsant la validation des données d'Excel : Menu Données > Validation des données. Tu pourras par exemple forcer l'utilisateur à n'entrer qu'un certain type de données dans une certaine plage et à ne pas laisser la saisie vide.
    Sinon il faudra écrire le code de validation dans ta macro.

    3. A mon avis si la saisie des années ne fonctionnait pas, c'est qu'il devait y avoir un espace vide lors de la saisie (ça arrive souvent). La fonction Trim sert à les enlever

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

Discussions similaires

  1. [XL-2010] Erreur d'exécution 1004: La méthode Paste de la classe Worksheet a échoué
    Par Cath_Paradis dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/04/2018, 18h40
  2. Réponses: 1
    Dernier message: 18/11/2014, 16h00
  3. [XL-2007] Erreur d'exécution 1004 La méthode Select de l'Objet Worksheet a échoué !
    Par Nonno 94 dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 08/11/2013, 15h39
  4. Réponses: 13
    Dernier message: 29/06/2007, 18h03

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