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 '-2147221080 (800401a8)': Erreur Automation en supprimant feuille


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Par défaut Erreur d'exécution '-2147221080 (800401a8)': Erreur Automation en supprimant feuille
    Erreur d'exécution '-2147221080 (800401a8)': Erreur Automation à la suppression d’une feuille

    Bonjour,

    Je suis nouveau sur ce Forum et souhaite solliciter votre aide.

    Je comprends pourquoi j’obtiens cette erreur « Erreur d'exécution '-2147221080 (800401a8)': Erreur Automation » mais je n’arrive pas à la résoudre pour autant.

    J’explique le contexte :

    J’utilise un classeur avec plusieurs feuilles contenant une feuille de travail pour élaborer une facture et des modèles de factures.
    En fonction de certaines conditions, que je détecte via des événements Worksheet_SelectionChange et Worksheet_Change dans ces feuilles, je peux être amené à basculer une facture en cours sur un autre modèle. Tout ceci est automatisé dans des procédures dans des modules en dehors des feuilles.

    A la fin du basculement, il ne me reste plus qu’une chose à faire : supprimer la feuille contenant la facture avant le basculement. C’est la dernière instruction de ma procédure BasculeModèle.
    Mais cette instruction Sheets("old").Delete se plante avec le message « Erreur d'exécution '-2147221080 (800401a8)': Erreur Automation » et le bouton Déboggage est désactivé. Toute ma procédure fonctionne, la feuille en question est bel et bien supprimée, mais je n’arrive pas à éviter le message d’erreur.

    Je pense avoir compris que j’obtiens cette erreur parce que je supprime une feuille depuis laquelle toute l’exécution de code a commencé. Donc VBA ne peut plus y retourner et se plante.

    Structure d’appel :

    Feuille contenant la facture en cours d’élaboration
    + -> contient Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    qui appelle juste la procédure Cellule_Modifié
    avec Target comme paramètre.
    +-> Cellule_Modifié
    - effectue certaines vérifications et, selon le cas,
    - appelle de la procédure BasculeModèle
    +-> BasculeModèle
    o crée une nouvelle feuille au début du classeur
    en copiant le modèle adéquat
    o copie une partie du contenu de la feuille contenant la
    facture en cours d’élaboration vers la nouvelle feuille
    o désigne la nouvelle feuille comme celle contenant la facture
    en cours (essentiellement un renommage)
    o supprime l’ancienne feuille, devenue inutile.

    Simple non ?
    Je suis en EXCEL 2002 sur XP SP3. Je ne pense pas que ce problème soit différent dans d’autres versions, m’enfin.

    Je vous remercie par avance pour votre aide !

    Ronald

  2. #2
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut


    Bienvenue sur le forum.

    je te suggère d'être plus concis dans tes explications et de mentionner ton code en cause en utilisant les balises code (clique sur l'icone # et met ton code entre les balises).

    Car la ton post est inbuvable et demande trop de temps pour l'assimiler.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Par défaut Complément d’information :
    Merci de me répondre si vite, Godzestla.

    Désolé de la longueur de mon message, mais j'ai scruté pas mal de discussions sur ce forum avant de publier la mienne et je constate qu'il y a souvent x allers/retours avant que celui qui vient en aide ait compris quelle était réellement la situation.

    L'instruction en cause est le .
    Rien de spécial. J'ai déjà essayé avec d'autres façons de référencer la feuille (Index, Codename...), mais le problème n'est pas là. La feuille se supprime bien.
    Je veux bien publier mon code mais cela risque de faire beaucoup...
    Il y a 3 modules concernés, comme j'ai expliqué.


    J’ai lu la discussion « [VBA-E] Erreur automation » publié par Elstak le 07/04/2006.
    Ce cas est très semblable au mien, sauf que les différentes options proposées dans cette discussion ne fonctionnent pas chez moi, hélas !
    C’est peut être dû au fait que chez moi le code est déclenché au tout début par un événement.
    - J’ai déjà essayé de supprimer le code événementiel dans la feuille contenant la facture en cours avant de la supprimer. Même résultat.
    Je pense que c’est parce que cette suppression intervient déjà trop tard.
    Le code est déjà en cours d’exécution et reste en mémoire, je suppose.
    - J’ai aussi essayé d’isoler la suppression dans un autre module.
    Mais cela ne fait aucune différence, ce dont je me doutais bien, mais je l’ai essayé par acquis de conscience…
    - Dans une autre discussion encore, quelqu’un avait résolu le problème en déprotégeant la feuille avant suppression. Je ne vois pas le rapport, mais en tout cas, chez moi cela ne fait aucune différence.

    J’ai déjà eu plusieurs autres cas bizarres dans ce classeur.
    Sans doute dû aux tests, mais quand même :
    - Il m’arrive que tout d’un coup une procédure se plante car elle n’a pas pu créer une nouvelle feuille.
    Alors que des dizaines de fois précédentes tout fonctionnait.
    Dans ce cas, quand j’essaie de le faire à la main, idem, rien ne se passe.
    Il faut que je ferme et rouvre EXCEL pour que ça fonctionne à nouveau. Est-ce un problème lié ?

  4. #4
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Ronald,

    Pourquoi dois-tu absolument supprimé la facture après le basculement.

    Tu ne pourrais pas te contenter de faire une clear complet de ta feuille de travail, si c'est de celle-là qu'il s'agit.

    Et si ton classeur est instable, as-tu essayé de créer un nouveau, copier les feuilles et le code valides sur ce nouveau et de tester après rename.

    C'est juste un idée !

    Quelle est la feuille que tu veux supprimer ? As-tu du code dessus ?
    Pourquoi erreur d'automation ? Tu n'es pas dans ce classeur quand tu tente cette suppression ?

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Si j'ai bien compris, le code est dans la feuille que tu veux supprimer... Mais ai-je bien compris ?
    Si oui, je te propose de terminer ta macro par le lancement d'une macro se trouvant dans un module standard, macro qui supprimerait la feuille en question.
    Visiblement, si tu es arrivé jusque là, tu n'as pas besoin de notre code pour faire ça
    Tu dis
    A+

    Edit
    Je viens de relire et tu as déjà fait ce que je t'ai mis. Alors je corrige : Dans la macro principale écris ça pour appeler la macro qui supprime
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ontime Now + TimeValue("00:00:01"), "LaMacroQuiSupprime"
    Ainsi tu laisses une seconde à la macro principale pour se terminer

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Par défaut Le code...
    Dans la feuille "Facture" :
    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 Worksheet_SelectionChange(ByVal Target As Excel.Range)
     
    ' Cette macro est lancée dès que l'on sélectionne
    ' n'importe quelle cellule de la feuille Facture
    Nouvelle_Sélection Target
    End Sub
    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
     
    ' Cette macro est lancée dès que l'on modifie une valeur
    Cellule_Modifié Target
    End Sub
    Private Sub laBox_Change()
    ' cette macro est exécutée dès qu'un produit a été sélectionné dans la ComboBox
    ' mais son exécution intervient APRÈS celle de Worksheet_SelectionChange et Worksheet_Change
     
    ' si le curseur n'est pas positionné dans la colonne C, je sors
    ' car dans ce cas je suis arrivé ici après initialisation (copie) de la feuille.
    If ActiveCell.Column <> 3 Then Exit Sub
     
    ' je copie le produit sélectionné dans la cellule
    ActiveCell.Value = laBox.Value
    ' je cache laBox
    ActiveSheet.OLEObjects("laBox").visible = False
    ' S'il y a un prix unitaire, je mets par défaut 1 dans la colonne quantité
    End Sub
    >> la procédure Cellule_Modifié (version simplifiée) :
    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
    Sub Cellule_Modifié(Cellule_cible)
    ' Publié sur développez.net
     
    If Cellule_cible.Columns.Count > 1 Then Exit Sub ' La sélection contient plus d'une colonne, je sors
    If Cellule_cible.Rows.Count > 1 Then Exit Sub ' La sélection contient plus d'une ligne, je sors
     
    If Cellule_cible.Column <> 3 Then Exit Sub '
     
    If Cellule_cible.Row < 17 Then Exit Sub ' Je suis positionné dans l'en-tête de la facture, je sors
     
    ' Je vérifie la présence des informations de facturation
    If Cells(ActiveCell.Row, 3) = Sheets("paramètres").Cells(10, 8) And Cells(2, 4) <> "Informations de facturation" Then
        ' OK, le basculement n'a pas encore été fait
        BasculeModèle
        Exit Sub
    End If
    ...
    >> Enfin, BasculeModèle, là où ça tourne mal tout à la fin :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    Sub BasculeModèle()
    Application.DisplayAlerts = False
     
    ' je mémorise le nom du client et l'emplacement du curseur
    client = Range("I8")
    emplacement = ActiveCell.Address
     
    ' Je crée une nouvelle feuille, devant "Facture".
    ' Cette feuille se base sur le Modèle facture pour Agrément
    Sheets("Modèle Facture Agrément").Copy before:=Sheets("Facture")
     
    'je retourne sur "Facture" et copie le corps de la facture
    Sheets(2).Select
    ActiveSheet.Unprotect
    Range(Cells(17, 1), Cells(47, 8)).Select
    Application.CutCopyMode = False
    Selection.Copy
     
    'je sélectionne la feuille pour l'agrément et colle le corps de la facture
    Sheets(1).Select
    ActiveSheet.Unprotect
    Range(Cells(17, 1), Cells(47, 8)).Select
    ActiveSheet.Paste
    ' je renomme la feuille "Facture"
    Sheets(2).Name = "old"
    Sheets(1).Name = "Facture"
     
    ActiveWorkbook.Sheets("Facture").Tab.ColorIndex = 4
    ' je remet le nom du client et l'emplacement du curseur
    Range("I8") = client
    Range(emplacement).Select
    ActiveSheet.Protect
     
    ' je supprime l'ancienne feuille "Facture"
    Supprimer_feuille "old"
    End Sub
    Public Sub Supprimer_feuille(ByVal nom As String)
    Dim feuille As Worksheet
    Set feuille = ThisWorkbook.Worksheets(2)
     
            Application.DisplayAlerts = False
            feuille.Delete
            Application.DisplayAlerts = True
    End Sub

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Par défaut Non seulement ouskel'n'or a bien compris, il a aussi LA solution !
    Merci ouskel'n'or, c'est en effet LA solution !

    Eh mais oui, le code qui s'exécute ne se trouve pas directement dans la feuille, mais a été déclenché par une procédure événementielle qui elle y est.

    C'est ce que j'ai dit au départ.

    Pour répondre à Godzestla :
    Je ne peux pas simplement faire un Clearcontents et copier des cellules, je perdrai trop d'informations. Il me faut vraiment la feuille entière.

    D'où la nécessité de la suppression de la version précédente.

    Un grand merci ! Super, cette temporisation !

    Ronald

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

Discussions similaires

  1. erreur d'exécution Microsoft VBScript erreur '800a01ad'
    Par fathitaouni dans le forum VBScript
    Réponses: 1
    Dernier message: 05/02/2013, 10h22
  2. erreur d'exécution (erreur d'automation)
    Par gbzmt dans le forum IHM
    Réponses: 4
    Dernier message: 06/03/2008, 11h52
  3. Erreur d'exécution '-2147417848 (80010108): Erreur Automation
    Par mardona dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/05/2007, 18h09
  4. Erreur : La classe ne gère pas Automation..
    Par Invité dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/09/2004, 10h24
  5. [Apache Perl] Erreur à l'exécution de mes cgi
    Par GLDavid dans le forum Apache
    Réponses: 4
    Dernier message: 28/08/2004, 20h23

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