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 424: Objet requis - Activate ne marche plus si variable de feuille dans Array


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Finance d'entreprise
    Inscrit en
    Juin 2016
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Finance d'entreprise
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2016
    Messages : 184
    Par défaut Erreur d'exécution 424: Objet requis - Activate ne marche plus si variable de feuille dans Array
    Bonjour à toutes et à tous,

    Curiosité: ce code renvoie l'erreur d'exécution 424: Objet requis en surlignant en jaune la partie en gras ci-dessous:
    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
    Option Base 1
    
    Sub Test()
    
            Dim a As Worksheet
            Dim b As Worksheet
            Dim c As Worksheet
            Dim d As Worksheet
            
            Set a = Worksheets("A")
            Set b = Worksheets("B")
            Set c = Worksheets("C")
            Set d = Worksheets("D")
            
            Dim fl As Variant
            
            fl = Array(a, b, c, d)
            
        With fl(1)
            .Range("A1").Value = "A"
        End With
          
    For i = 1 To 4
    
            fl(i).Activate
    
    Next
    
    End Sub
    Apparemment, c'est lié à la commande d'avant, car si With n'est pas utilisé, ça fonctionne:
    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
    Option Base 1
    
    Sub Test()
    
            Dim a As Worksheet
            Dim b As Worksheet
            Dim c As Worksheet
            Dim d As Worksheet
            
            Set a = Worksheets("A")
            Set b = Worksheets("B")
            Set c = Worksheets("C")
            Set d = Worksheets("D")
            
            Dim fl As Variant
            
            fl = Array(a, b, c, d)
            
    
            fl(1).Range("A1").Value = "A"
        
          
    For i = 1 To 4
    
            fl(i).Activate
    
    Next
    
    End Sub

    De même, si With est utilisé, mais que la feuille est indiquée par sa variable directe et non par sa position dans une variable tableau (Array), ça fonctionne aussi:
    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
    Option Base 1
    
    Sub Test()
    
            Dim a As Worksheet
            Dim b As Worksheet
            Dim c As Worksheet
            Dim d As Worksheet
            
            Set a = Worksheets("A")
            Set b = Worksheets("B")
            Set c = Worksheets("C")
            Set d = Worksheets("D")
            
            Dim fl As Variant
            
            fl = Array(a, b, c, d)
            
        With
            a.Range("A1").Value = "A"
        End With
          
    For i = 1 To 4
    
            fl(i).Activate
    
    Next
    
    End Sub
    Est-ce que c'est un bogue? Y a-t-il un moyen de le contourner?

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Avec cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To 4
            fl(i).Activate
    Next
    La boucle terminée, ta seule feuille active est ta feuille numéro 4. Tu ne peux pas avoir deux feuilles actives dans le même classeur.

    Le seul bienfait de la méthode Activate est de désigner la feuille qui va faire l'objet de l'attention de la macro. Et on peut joyeusement toujours s'en passer, ou presque.

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sheets("Feuil1").activate
    activesheet.range("a1").value = 2.71828
    Peut, le plus facilement du monde être remplacée par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sheets("Feuil1").range("a1").value = 2.71828
    Et c'est le même principe pour select.

    Si tu dois boucler sur un ensemble de feuilles et traiter chaque feuille tu dois faire ton traitement dans ta boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 1 To 4
            fl(i).Activate
    activesheet.range("A3").value = activesheet.range("A1").value + activesheet.range("A2").value 
    Next
    et encore là, tu peux de passer de Activate.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To 4
          sheets(i).range("A3").value = activesheet.range("A1").value + activesheet.range("A2").value 
    Next
    Tu as aussi plusieurs collections déjà implantées dans VBA-Excel qui permettent la plupart du temps d'éviter de gérer des tableaux de noms d'objets :

    Sheets : l'ensemble des feuilles d'un classeur, incluant les feuilles graphique, le feuilles de calcul, les feuilles de macros Excel 4 et les autres type de feuille qui pourraient exister
    Worksheets : l'ensemble des feuilles (uniquement les feuilles de calcul).
    Workbooks : l'ensemble des classeurs ouverts dans un instance déterminée d'Excel

    Tiens, ton code pourrait être réduit à ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Test()
        'sans s ==> l'objet
        'Avec un s ==> la collection des objets (sans le s)
        For each unefeuille in activeworkbook.workshheets
            'unefeuille devient automatiquement un objet Worksheet
            unefeuile.Range("A1").Value = unefeuille.name
        Next
    End Sub
    Ou, ce qui revient au même:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Test2_A()
        'sans s ==> l'objet
        'Avec un s ==> la collection des objets (sans le s)
        for i = 1 to Activeworkbook.worksheets.count
            worksheets(i).Range("A1").Value = worksheets(i).name
        Next
    End Sub
    Ou, avec des blocs with:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Test_A()
        'sans s ==> l'objet
        'Avec un s ==> la collection des objets (sans le s)
        For each unefeuille in activeworkbook.workshheets
            'unefeuille devient automatiquement un objet Worksheet
            with unefeuille
                .Range("A1").Value = .name
            end with
        Next
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Test2()
        'sans s ==> l'objet
        'Avec un s ==> la collection des objets (sans le s)
        for i = 1 to Activeworkbook.worksheets.count
            with worksheets(i)
                .Range("A1").Value = .name
            end with
        Next
    End Sub
    P.S. Cela a été un peu long à rédiger. Si jamais, j'ai provoqué des doublons ou des collisions, toutes mes excuses.

    P.P.S. Un bon truc à ne pas négliger:

    Dans l'éditeur VBA (et même pour VB6 et VB.net). Un clic sur un mot-clef et

Discussions similaires

  1. Erreur d'excution '424' objet requis
    Par mjlaurent dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/04/2013, 16h43
  2. Erreur d'exécution '424', objet requis
    Par JPierreM dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/12/2012, 14h07
  3. Erreur d'exécution '424':objet requis
    Par argaz01 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/06/2010, 15h02
  4. [OL-2003] Erreur d'exécution '424' : Objet requis
    Par ptitemeuh dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 25/05/2010, 11h32
  5. Erreur d'execution '424' : Objet requis
    Par deglingo37 dans le forum Access
    Réponses: 3
    Dernier message: 09/10/2006, 16h47

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