Erreur 9 bien curieuse... [Résolu]

Signaler
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
-
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018
-
Bonjour à tous,

J'ai une erreur 9 qui "s'invite" avec
ThisWorkbook.Close savechanges:=False

mais plus avec
Application.Quit

dans le code
Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Application.ScreenUpdating = False
    If Sheets("Bridge").Range("C1").Value = "" Then
        Application.DisplayAlerts = False
        Application.EnableEvents = False
        'Suppression "Units" (cachée)
        Sheets("Units").Visible = True
        Sheets("Units").Unprotect
        Sheets("Units").Delete
        'Suppression "Simpson" (cachée)
        Sheets("Simpson").Visible = True
        Sheets("Simpson").Unprotect
        Sheets("Simpson").Delete
        'Suppression "Courrier"
        Sheets("Courrier").Unprotect
        Sheets("Courrier").Delete
        'Suppression "Data"
        Sheets("Data").Unprotect
        Sheets("Data").Delete
        'Vidage "Bridge"
        Sheets("Bridge").Select
        Sheets("Bridge").Unprotect
        Sheets("Bridge").Cells.ClearContents
        Application.EnableEvents = True
        Application.DisplayAlerts = False
        ActiveWorkbook.Save
        
        'Avec cette ligne : Erreur 9 (n'appartient pas...)
        '=================================================
        ThisWorkbook.Close savechanges:=False
        
        'Avec cette ligne : OK
        Application.Quit
    Else
        'Avec cette ligne : OK
        ThisWorkbook.Close savechanges:=False
    End If

End Sub

J'ai mis volontairement tous les incréments pour voir où exactement l'erreur se produisait.

Mais bon, en fait le seul soucis que ça peut poser, c'est si un autre classeur est ouvert.

Toutefois, j'aimerais bien comprendre où je fais une bourde.

Merci.

Cordialement
Rataxes64

17 réponses

Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
Bonjour,

l'erreur 9 n'est jamais curieuse et dans ce cas elle est tout à fait logique !

En effet, cela se passe dans l'évènement du classeur juste avant sa fermeture :
soit il doit être sauvegardé par ThisWorkbook.Save
soit il ne doit pas l'être et afin d'éviter la question
son état doit être forcé par ThisWorkbook.Saved = True ...

Mais en aucun cas ThisWorkbook.Close doit y figurer
étant donné la fermeture déjà demandée s'effectuant juste après cet évènement !!
(tant que Cancel reste à False)

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
31539
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
2 mars 2021
344
Bonjour,

Vous demandez à Excel de fermer le classeur dans une sub qui se lance justement à sa fermeture .???

[b]private sub Workbook_BeforeClose(

// ...???
ThisWorkbook.Close 
...
End Sub
/b


Là Excel ne comprend plus rien..d'où l'erreur.

Enlevez cette instruction du Sub, et le classeur se fermera de toute manière à la fin.




Cordialement,
Jordane
_____________________________________________________
Règles du forum à lire avant de poster une question : ICI
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Re,

Ah oui,
j'ai oublié de corriger...

Avant
ActiveWorkbook.Save


C'est
Application.DisplayAlerts = True


J'avais testé après avec "False", ça ne change rien..

Cordialement

Rataxes64
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut

Idée comme ça :
Si tu utilises ThisWorkbook, tu parles donc du classeur actuel = celui qui est en train d'exécuter le code.
Que va-t-il se passer une fois l'instruction exécutée puisque ce classeur sera fermé ?
--> Bien que l'instruction existe, je ne pense pas qu'on puisse l'utiliser autrement qu'en dernière instruction avant le néant.

Essaye, éventuellement, de ne pas avoir recourt à l'option SaveChanges :
' Triche en déclarant le classeur sauvegardé
ThisWorkbook.Saved = True
' Fermeture qui ne devrait pas poser la question
ThisWorkbook.Close

Voir aussi s'il y a une différence entre ActiveWorkbook et ThisWorkbook

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
hummm ... Error 9
Ça semblerait quand même vouloir dire que le compilateur tente d’accéder à une variable.
Vérifie, dans ton code, si tu n'aurais pas maladroitement nommé une de tes variables ou fonction avec l'un de ces mots clé ThisWorkbook ou savechanges
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Bonjour Jack,

je n'ai que
TLwb = ThisWorkbook.Name
à l'intrieur d'une sub, Donc c'est pas ça...

J'avais déjà essayé
ThisWorkbook.Saved = True
ThisWorkbook.Close
sans succès...

Application.ThisWorkbook.Close
ne marche pas non plus.

Alors que
Application.Quit
marche!

Je sèche!

Je ne sais plus trop quoi essayer. Pourtant, on est "juste derrière"
ThisWorkbook.Save
.

En plus dans la partie
    Else
        
        ThisWorkbook.Close savechanges:=False
    
    End If
ça marche



Cordialement
Rataxes64
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Re,

J'ai essayé avec 2 "If"

Le premier
If Sheets("Bridge").Range("C1").Value <> "" Then ThisWorkbook.Close savechanges:=False


Le deuxième avec mon code (sans donc le "Else" final. Donc , à part un "End if, le n'ai plus rien après...

If Sheets("Bridge").Range("C1").Value = "" Then
     .../...
     ThisWorkbook.Close savechanges:=False
End if


Que dalle!

Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Bonjour,
cette erreur risque également de se produire si a/ont été supprimée(s) une/des feuille(s) vers lesquelles pointe(nt) une/des formule(s) Excel...

(et je sais de mémoire que CerberusPau a l'habitude de mettre un peu partout des formules Excel)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Bonjour ucfoutu,

Merci de ta visite.

Certes, et j'ai suivi tes conseils. En l'occurrence, il ne reste qu'une feuille, et vide.

Il y a aussi des malins petits SelectionChange ou Change que j'affectionnent (et qui me jouent régulièrement des tours): Raison des EnabledEvents=False

Cordialement
Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Les EnabledEvents=False n'ont aucune influence sur les formules éventuellement présentes. Ils ne font qu'inhiber les évènements (les formules ne répondent pas à des évènements et sont de surcroît traitées par Excel dans un fil (thread) totalement distinct de VBA


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Et il me semble bien te l'avoir déjà exposé il y a trois ou quatre mois .


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

re,

En fait
Private Sub Workbook_BeforeClose(Cancel As Boolean)
est relancé par
ThisWorkbook.Close savechanges:=False


Seul moyen "rude" que j'ai trouvé pour tester :
If Sheets("Bridge").Range("C3").Value = 1 Then Exit Sub
en "tête de gondole"
suivi du code :
    If Sheets("Bridge").Range("C1").Value <> "" _
    Then ThisWorkbook.Close savechanges:=False

    If Sheets("Bridge").Range("C1").Value = "" Then
    .../...
        Sheets("Bridge").Range("C3").Value = 1
        ThisWorkbook.Save
        ThisWorkbook.Close savechanges:=False
    End If

End Sub



Il faut que je fasse ça en "plus joli"...

Cordialement
Rataxes64
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Re,

Oui, oui, mais je citais les EnabledEvents par rapport aux évènements que produisent (qu'auraient pu poduire) SelectionChange et Change..

Cordialement

Rataxes64
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
Il semble que soit je me suis mal expliqué, soit tu n'as pas compris ...
Mais peu_ importe ===>> je vois de toutes manières une chose étrange entre ces deux lignes :
ActiveWorkbook.Save
ThisWorkbook.Close savechanges:=False

dans quelle circonstance, dans ton appli, le classeur de la fenêtre active est différent du classeur qui contient la macro qui contient cette instruction ?

ces deux lignes et ces deux notations n'ont en effet un intérêt que si deux classeurs distincts présents et que la macro est contenue dans un classeur qui n'est pas celui de la fenêtre active.

Essaye de t'expliquer sur cet aspect.
In va par ailleurs dee toutes manières déjà tenter d'y voir clair à ce sujet en regardant ce qu'affiche :
msgbox workbooks.count
dis-nous ...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
234
dans le même ordre d'idée :
j'aimerais que tu insères cette ligne :
MsgBox ThisWorkbook.Name & vbCrLf & ActiveWorkbook.Name

juste avant celle (ton 1rt message) disant :
ThisWorkbook.Close savechanges:=False

et que tu nous dises ce que cela affiche.
On finira bien, ainsi, par cerner la raison du problème ...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Re,

Bien vu ucfoutu. Effectivement, dans le code complet donné en premier, c'était bien
ActiveWorkbook.Save
ThisWorkbook.Close savechanges:= False


C'est corrigé depuis, comme juste au dessus :
        ThisWorkbook.Save
        ThisWorkbook.Close savechanges:=False


On reste donc bien toujours dans ThisWorkbook!

Le but est que si à la fermeture du classeur, une condition précise n'est pas remplie, toutes les feuilles sont supprimées,sauf une, bien sûr, qui est, elle, vidée.
(Je voulais aussi supprimer les macros, mais selon la version d'Excel qui sera utilisée, cela pose des problèmes. Donc, j'ai abandonné cette idée...)

Donc, après avoir vérifié ma condition, soit je ferme sans sauvegarder, soit je "détruis" le classeur: et là, je dois le sauvegarder après mes "destructions" avant de le fermer.
J'avais aussi essayé sans plus de succès la seule ligne
ThisWorkbook.Close savechanges: =True
.

Voilà.

Ce dont je suis sûr, c'est qu'il y bien un "double appel" de BeforeClose, mais je ne sais pas pourquoi. Bon, je le "contre" avec la valeur en C3 (ou une donnée mise en mémoire), mais cela me semble curieux.

Cordialement
Rataxes64
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Statut
Membre
Dernière intervention
22 août 2018

Bonjour,

Quel quiche je fais!!

Evidemment...


Cordialement
Rataxes64