Erreur 9 bien curieuse...

Résolu
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 - 7 juil. 2013 à 17:32
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 - 8 juil. 2013 à 11:45
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

MarcPL Messages postés 172 Date d'inscription jeudi 8 décembre 2011 Statut Membre Dernière intervention 21 juillet 2013 2
8 juil. 2013 à 01:55
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 !
3
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
8 juil. 2013 à 08:51
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
3
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
7 juil. 2013 à 17:37
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
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 juil. 2013 à 18:01
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 juil. 2013 à 18:04
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
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
7 juil. 2013 à 18:47
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
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
7 juil. 2013 à 19:02
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 juil. 2013 à 20:15
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.
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
7 juil. 2013 à 20:22
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 juil. 2013 à 21:19
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 juil. 2013 à 21:20
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.
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
7 juil. 2013 à 21:28
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
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
7 juil. 2013 à 21:32
Re,

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

Cordialement

Rataxes64
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 juil. 2013 à 22:39
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 juil. 2013 à 22:48
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.
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
7 juil. 2013 à 23:23
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
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
8 juil. 2013 à 11:45
Bonjour,

Quel quiche je fais!!

Evidemment...


Cordialement
Rataxes64
0
Rejoignez-nous