XL 2019 workbook.close fait sortir de visual basic

Manu67

XLDnaute Nouveau
Bonjour,

J'ai un assez gros code avec des userforms .. (qui me permet de générer la facturation de ma boite avec des notions de récurrences) et où que ce soit, dès que je met des lignes du type :

Application.DisplayAlerts = False
ActiveWorkbook.Close
Application.DisplayAlerts = True

Le classeur se ferme MAIS, mon l'éxecution du code s'arrête (complètement), l'userform ouverte se ferme. Aucun message d'alerte évidemment.

Si quelqu'un a une idée, car pour moi, là, c'est le brouillard..

Merci par avance
 

Fred0o

XLDnaute Barbatruc
Bonjour Manu67

Sans le classeur en question sans données confidentielles, difficile de savoir exactement d'ou vient le problème. Cependant, je suppose que ta macro se trouve dans le classeur que tu fermes par le code
VB:
Application.DisplayAlerts = False
ActiveWorkbook.Close
Application.DisplayAlerts = True

Si c'est le cas, c'est normal. Ton code ne devrait fermer qu'un autre classeur qui lui, ne contient pas le code en cours d'execution.
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Si votre 'ActiveWorkbook.Close' est dans le même classeur que le userForm, c'est normal.

Ce n'est qu'une supputation puisque nous n'avons rien (classeur avec les macros idoines) pour préciser les choses.

Bonne fin de matinée
 

juvaxe

XLDnaute Occasionnel
Bonjour

Un exemple qui ne me pose pas de problème :

Sub quit_Gbnq_I()

On Error Resume Next

Application.ThisWorkbook.Close SaveChanges:=False

End Sub

Ci dessus une "Sub" qui figure dans plusieurs classeurs que j'utilise régulièrement, sans problème particulier.
En fait elle figure en double exemplaire (I comme immédiat et UPDT comme update) avec l'option True/ False pour sortir avec sauvegarde ou pas des modifications faites dans le classeur.
Ces "sub" se trouvent dans un module standard du classeur dont elles demandent la fermeture. Je ne sais pas dire si le fait que ce type d'instruction soit dans un UserForm est un problème ou pas.

Elles sont appelées à partir de deux boutons d'une barre de menu personnalisée associée au classeur; je ne pense pas que ton problème soit à ce niveau. Dans ce que j'ai fait je sors toujours du classeur par un bouton de la barre de menu.

Dans ce que tu nous dis :

Application.DisplayAlerts = False : d'accord
ActiveWorkbook.Close : d'accord
Application.DisplayAlerts = True : cette instruction et celles qui suivent ne vont pas être exécutées puisque la fermeture du classeur a été demandée ! N'y a-t-il pas un problème de compréhension quelque part ?

Peut-être que quelqu'un pourra compléter.

Bonne recherche; il est vrai que sans une réduction de ton classeur il est difficile de t'aider davantage.

Cdt
 

Manu67

XLDnaute Nouveau
Bonjour @juvaxe
Merci pour ton aide.

Malheureusement après vérification, je ferme bien un classeur qui ne porte pas le code encours d'exécution.

Pour autant systématiquement, je sors du code au moment de l'éxecution d'un code type workbook.close

Si quelqu'un a une idée..

De manière résumée, mon code fait ceci :
(L'objectif est d'éditer des factures)

Dans le classeur principal :
Il lance un userforme multipages pour saisir 1/ le client 2/ le produit et les couts 3/ les informations de paiement

Puis il duplique la feuille modèle de facture et la complète avec les infos saisies dans l'UF
Cette feuille est extraite (move) vers un nouveau classeur.

Là l'utilisateur dispose de 2 boutons VALIDER & ANNULER qui renvoient vers 2 macros dans le classeur créé. Ces macros renvoient vers des procédures du classeur principal. Depuis ces procédures, je cherche à ferme le classeur d'origne lorsqu'il a été cliqué sur ANNULER avec cette procédure qui sort à la première ligne, après avoir fermé effectivement le classeur (nommé automatiquement "classeur x" (x=1,2,3..)

VB:
Sub facture_annulee() 's'éxecute après INvalidation de la facture générée par l'utilisateur
   '(si la facture n'est pas confirmée  '  on incrémente pas le numéro de facture )
  ActiveWorkbook.Close savechanges:=False ' on ferme le classeur de la facture 'VERFIER QUE LA SUITE DE LA PROCEDURE s'EXECUTE
   Workbooks("Ulysse.xlsm").Activate
    If Range("Derligcontr") <> "" And Range("i") <> "" Then 'si contrat récurrent
        Sheets("Base contrats").Range("Derligcontr,i").Clear     'on efface les numéros de facture inscrits dans base contrat (le logiciel pourra ainsi emettre une "nouvelle" facture pour la même période
        Range("dernier_num_contrat") = Range("dernier_num_contrat") - 1 'on revient en arrière le dernier numéro de contrat
    Else 'si pas récurrent (=oneshot)
        Range("dernier_num_commande") = Range("dernier_num_commande") - 1 'on revient en arrière le dernier numéro de commande
    End If

If isuserformloaded("CLIENT") Then Unload CLIENT  's'il est ouvert, CLIENT est fermé (le test isuserunloade évite une erreur

End Sub
 

Manu67

XLDnaute Nouveau
Je précise que :

=>je n'ai aucun message d'erreur (le code s'arrête .|)
=> j'ai activé dans options/général/ "Arrêt sur toutes les erreurs" et que rien ne se passe
=> j'ai ajouté une commande on error goto ERREUR qui n'a pas été éxécutée (le code n'est pas allé au label ERREUR)
=> j'ai modifié le code en :
Dim nomclass As String
nomclass = ActiveWorkbook.Name
Workbooks("Ulysse.xlsm").Activate
Workbooks(nomclass).Close

Après le close (sans savechanges défini) j'ai bien un prompt ("Enregistrer vos modifications dans ce fichier"), et après avoir cliquer sur "ne pas enregistrer" je sors du code o_O

J'ai regardé les liens de @soan notamment en supprimant excel.box, mais ça n'a rien changé :..
 

soan

XLDnaute Barbatruc
Inactif
@Manu67

ce que tu as écrit me fait penser à ceci :

1) peut-être que tes événements Excel sont désactivés ? si oui, utilises cette sub :

VB:
Sub Essai()
  Application.EnableEvents = True
End Sub

à placer dans un module standard tel que Module1 ; attention : lors de l'exécution de cette sub, et juste après son exécution, tu ne verras aucun changement ; mais les événements auront bien été réactivés, et peut-être que ça pourra régler ton problème actuel ?

2) imagine que tu as utilisé Application.DisplayAlerts = False mais que tu as oublié de le remettre à True ; il me semble que j'avais lu dans l'Aide VBA que ça peut entraîner des erreurs aléatoires ; mais peut-être que je me trompe dans ce sens : c'était pas pour .DisplayAlerts mais pour une autre option du même genre ; j'me rappelle plus laquelle, mais c'est sûr que c'était une option à 2 valeurs booléennes : False ou True.​

soan
 

Manu67

XLDnaute Nouveau
Bonsoir @soan Merci mille fois pour ton aide.

J'ai testé l'incidence de
VB:
Application.EnableEvents = True
. J'ai eu l'impression (enfin je crois que) ça a fonctionné une fois avec = False; mais plus après.

J'ai fait un fichier hyper léger avec uniquement ce qui pose problème et ... ça pose problème !! En tous les cas chez moi.

Si tu peux tester chez toi et me confirmer que ça sort aussi sans l'affichage de la msgbox
Code:
"L'aplication est bien passée à l'instutrction suivante")

Déroulement du test :

1/ CLICK sur le COMMANDBUTTON ROUGE
2/ CLICK (sur la nouvelle feuille) sur le COMMANDEBUTTON BLEU

MERCI ENCORE
 

Pièces jointes

  • Classeur3.xlsm
    28.3 KB · Affichages: 10

soan

XLDnaute Barbatruc
Inactif
Bonjour Manu,

ton fichier en retour ; fais 5 fois cette manip (donc y'aura 10 clics en tout) : clique sur le bouton rouge, puis clique sur le bouton bleu ; ensuite, va lire le code VBA, qui est avec de nombreux commentaires : tu comprendras pourquoi je t'ai demandé de faire la manip 5 fois, et ça t'expliquera en détail pourquoi ta demande ne peut pas être réalisée.

peut-être que patricktoulon (salut) ou un autre intervenant auront une solution-miracle ? (moi je sèche ! 😭)

soan
 

Pièces jointes

  • Classeur3.xlsm
    28.7 KB · Affichages: 5

Manu67

XLDnaute Nouveau
Bonjour @soan bonjour @Bernard_XLD et merci à tous les deux

Je résume mon problème pour @Bernard_XLD :

Je souhaite copier (bouton rouge) la feuille dans un nouveau classeur puis bouton bleu fermer ce nouveau classeur qui vient d'être créer (jusque là tout va bien) ET QUE LE CODE CONTINUE A S'EXECUTER : c'est là que le bas blesse!

(les noms de classeurs sont une erreur de fichier test, mon fichier complet d'origine ne s'appelle pas du tout classeur3 )

Je n'ai pas bien compris tes explications @soan car :
  1. je clique sur le bouton bleu depuis le NEW classeur
  2. j'exécute un code qui est dans le classeur d'origine
  3. ce code commence à s'éxecuter (activeworkbook.close ou workbook(NEWclasseur).close
  4. alors pourquoi diable fermer un classeur qui ne contient pas le code en cours d'exécution met fin à ce même code?
Avis aux amateurs ;)
 

soan

XLDnaute Barbatruc
Inactif
@Manu67 (salut Bernard_XLD)

non, ce n'est pas ça : quand on copie la feuille dans un nouveau classeur :

* ce classeur contient toutes les macros, et il devient le classeur actif : ActiveWorkbook.

* il n'est pas encore enregistré sur le disque dur.

* il n'a pas encore d'extension .xlsm ou .xlsx définie, car c'est lors de l'enregistrement qu'on fait ce choix ; or pour ton exo, on n'enregistre pas le classeur sur disque dur.

en conséquence : le nouveau classeur contient bien toutes les macros, mais c'est quand même la sub facture_annulee() du Module1 de Classeur3.xlsm qui est appelée.

quand on ferme le classeur avec ActiveWorkbook.Close False j'ai bien indiqué en commentaire que c'est le 2ème classeur qui est fermé, donc le nouveau classeur où tu as copié la feuille.

le problème, c'est qu'on a changé de classeur pour le 2ème nouveau classeur ; puis sur ce 2ème classeur, l'utilisateur clique sur le bouton bleu qui ferme le classeur en cours ; donc le 2ème classeur est fermé ➯ il reste alors affiché le tout 1er classeur, qui n'avait pas été fermé ; MAIS à ce stade, c'est fini : le code VBA de ce 1er classeur s'est arrêté ! 😭

moi j'ai pas d'solution pour ça, alors essaye les 2 fichiers de Bernard_XLD, post #12 et post #13 ; en c'moment, j'travaille sur d'autres exos, et j'ai pas eu l'temps d'voir les 2 fichiers de Bernard_XLD ; mais j'lui fait confiance : en principe, une solution venant de lui marche toujours. 😜



edit : Bernard_XLD, qui est vraiment très prolifique, t'as même proposé un 3ème fichier dans son post #16 ; il semblerait que ce soit LA solution-miracle à ce que tu attends. (merci Bernard_XLD, moi j'étais complètement largué ! 🤣)

soan
 
Dernière édition:

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Je souhaite copier (bouton rouge) la feuille dans un nouveau classeur puis bouton bleu fermer ce nouveau classeur qui vient d'être créer (jusque là tout va bien) ET QUE LE CODE CONTINUE A S'EXECUTER : c'est là que le bas blesse!
Alors il faut changer de méthode, Manu67

Bien cordialement, @+
 

Pièces jointes

  • Classeur_Test.xlsm
    30.3 KB · Affichages: 18
Dernière édition:

Statistiques des forums

Discussions
312 299
Messages
2 086 991
Membres
103 420
dernier inscrit
eric.wallet46