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 :
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!
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
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.
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
=>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
J'ai regardé les liens de @soan notamment en supprimant excel.box, mais ça n'a rien changé :..
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.
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 ! )
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 :
je clique sur le bouton bleu depuis le NEW classeur
j'exécute un code qui est dans le classeur d'origine
ce code commence à s'éxecuter (activeworkbook.close ou workbook(NEWclasseur).close
alors pourquoi diable fermer un classeur qui ne contient pas le code en cours d'exécution met fin à ce même code?
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é ! )
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!