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

Messages postés
377
Date d'inscription
lundi 3 avril 2006
Dernière intervention
22 août 2018
- - Dernière réponse : CerberusPau
Messages postés
377
Date d'inscription
lundi 3 avril 2006
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
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Dernière intervention
21 juillet 2013
3
Merci
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 !

Merci MarcPL 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de MarcPL
Messages postés
23588
Date d'inscription
mercredi 22 octobre 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
3
Merci
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

Merci jordane45 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de jordane45
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Dernière intervention
22 août 2018
0
Merci
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
Commenter la réponse de CerberusPau
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
0
Merci
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)
Commenter la réponse de cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
0
Merci
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
Commenter la réponse de cs_Jack
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Dernière intervention
22 août 2018
0
Merci
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
Commenter la réponse de CerberusPau
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Dernière intervention
22 août 2018
0
Merci
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
Commenter la réponse de CerberusPau
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Dernière intervention
22 août 2018
0
Merci
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
Commenter la réponse de CerberusPau
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Dernière intervention
22 août 2018
0
Merci
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
Commenter la réponse de CerberusPau
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Dernière intervention
22 août 2018
0
Merci
Re,

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

Cordialement

Rataxes64
Commenter la réponse de CerberusPau
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Dernière intervention
22 août 2018
0
Merci
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
Commenter la réponse de CerberusPau
Messages postés
377
Date d'inscription
lundi 3 avril 2006
Dernière intervention
22 août 2018
0
Merci
Bonjour,

Quel quiche je fais!!

Evidemment...


Cordialement
Rataxes64
Commenter la réponse de CerberusPau

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.