Kalagane75
Messages postés21Date d'inscriptionlundi 3 septembre 2012StatutMembreDernière intervention21 février 2013
-
6 févr. 2012 à 20:03
Kalagane75
Messages postés21Date d'inscriptionlundi 3 septembre 2012StatutMembreDernière intervention21 février 2013
-
8 févr. 2012 à 21:15
Bonjour,
Voilà quelques jours que je m'arrache les cheveux sur une chose qui peux paraitre facile, mais après de nombreuses recherches et de site différentes je n'arrive pas à trouver la solution.
J'ai concrètement besoin de votre aide...
Problématique :
Sur Excel 2003, langage VBA
Je travaille sur différents formulaires (type Boite de dialogue Microsoft Excel 5.0)
J'ai 2 boites de dialogues que l'on nommera pour l'exemple "Dialogue1" et "Dialogue2"
Représentant respectivement l'onglet "Dialogue1" et "Dialogue2"
Afin d’empêcher l'ouverture de la boite de dialogue "Dialogue1" 2 fois je lui donne la condition suivante:
- Ouverture de la boite de dialogue "Dialogue1" l'onglet actif est différent de "Dialogue1"
- Ouverture de la boite de dialogue "Dialogue2" l'onglet actif est différent de "Dialogue2"
Ainsi je n'ouvrirais pas une deuxième fois la même boite de dialogue est provoquerai une erreure
Voici les codes que j'y ai intégré:
une touche pour afficher la boite de dialogue "Dialogue1"
[i]Sub Ouvrirdialoog1()
nomOnglet = ActiveSheet.Name
If nomOnglet <> "Dialogue1" Then
DialogSheets("Dialogue1").Show
End If
End Sub/i
une touche pour afficher la boite de dialogue "Dialogue2"
[i]Sub Ouvrirdialoog2()
nomOnglet = ActiveSheet.Name
If nomOnglet <> "Dialogue2" Then
DialogSheets("Dialogue2").Show
End If
End Sub
/i
[b]A partir de la la problématique c'est que les boites de dialogues se superposes et le truc est que j'aimerai que l'un écrase l'autre.
En clair Dialogue1 ouvert => dialogue 2 fermer SI OUVERT
Dialog2 ouvert => Dialogue 1 fermer SI OUVERT/b
En bonus :
[i]Sub Fermerdialoog1()
nomOnglet = ActiveSheet.Name
If nomOnglet <> "Dialogue1" Then
Application.DialogSheets("Dialogue1").Hide
End If
End Sub
Sub Fermerdialoog2()
nomOnglet = ActiveSheet.Name
If nomOnglet <> "Dialogue2" Then
Application.DialogSheets("Dialogue2").Hide
End If
End Sub/i Bizarrement cela me ferme les deux en même temps alors que je précise bien la boite à masquer ou fermer, pourquoi?
Merci d'avance pour votre temps de lecture et vos propositions
Merci
PS: N'hésiter pas à me contacter si je n'ai pas été suffisamment clair
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 7 févr. 2012 à 22:02
A demain garanti, car j'ai terminé.
Il va par contre falloir que je rédige de quoi te permettre d'en faire rigoureusement autant de ton côté === >> exemple sur projet tout neuf
deux feuilles :
Une feuille nommée Feuil1
Une Feuille nommée Feuil2
deux boîtes dialogsheets
Une boite Dialogue1
Une boîte Dialogue2
Dans la boite Dialogue1 :
- Un bouton de commande (je me fiche de son nom) auquel tu affecte la macro toto1
- un bouton de commande (je me fiche de son nom) auquel tu affectes la macro termine
Dans la boite Dialogue2 :
- Un bouton de commande (je me fiche de son nom) auquel tu affecte la macro toto2 - un bouton de commande (je me fiche de son nom) auquel tu affectes la macro termine
Dialogue1 est pour correspondre à Feuil1
Dialogue2 est pour correspondre à Feuil2
donne à tous ces boutons le texte explicite de ton choix (en sachant que le bouton termine est là pour tout arrêter au besoin)
Dans le module des macros (Module1, donc) :
Public fini As Boolean
Sub toto1()
SendKeys "{ESC}"
Sheets("Feuil2").Activate
End Sub
Sub toto2()
SendKeys "{ESC}"
Sheets("Feuil1").Activate
End Sub
Sub termine()
fini = True
End Sub
Public Sub allonsy()
DialogSheets(Replace(ActiveSheet.Name, ("Feuil"), "Dialogue")).Show
If Not fini Then
Application.OnTime Now + TimeValue("00:00:01"), "allonsy"
End If
End Sub
Ayé ?
Bon !
Dans l'évènement WorkBook_Open :
Private Sub Workbook_Open()
toto2
Application.OnTime Now + TimeValue("00:00:01"), "allonsy"
End Sub
Du condensé acrobatique, comme tu vois
Enregistre ===>> quitte ===>> relance
Dans chaque boite (tes 2 boutons rajoutés) : un bouton bascule à la fois sur l'autre feuille et sur sa boîte associée
l'autre bouton stoppe la machine infernale et tu peux ensuite quitter le classeur
Je l'ai ainsi fait pour que tu puisses regarder. Rien n'empêche ensuite, si tu le préfères :
- tant de rendre totalement invisibles les feuilles de calcul elle-mêmes
que
- de carrément quitter le classeur (en sauvegardant ou non, selon ton choix) à partir du bouton "terminer" de l'une des deux boîtes.
Mais c'est là un aspect fort secondaire bien facile à traiter
Essaye et parle-m'en.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 6 févr. 2012 à 20:18
Bonjour,
1) un onglet n'est jamais qu'une manière de pointer vers une feuille.
Un onglet n'est pas une feuille
2) qu'entends-tu donc exactement par "écraser" ? Pour moi, si une feuille en écrase une autre, elle substitue toutes ses cellules à celles de l'autre !
2)
J'ai 2 boites de dialogues que l'on nommera pour l'exemple "Dialogue1" et "Dialogue2"
une feuille toute entière pour une seule boîte chacune ?
3) si tu ne veux pas de superposition possible : cache une pendant que tu montres l'autre (c'est évident) !
4) pour ton "bonus", encore faudrait-il savoir depuis quoi et comment tu appelles ces deux procédures !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Kalagane75
Messages postés21Date d'inscriptionlundi 3 septembre 2012StatutMembreDernière intervention21 février 2013 6 févr. 2012 à 20:51
Alors je réexplique différemment
J'ai un fichier Excel.
J'ai une feuille (ex:Feuil1)
C'est une feuille tout ce qu'il y a de plus banal J'ai deux autres feuilles (ex:Dialogue1 et Dialogue2)
On la trouve en faisant Click droit sur le nom d'une feuille et insérer Boite de dialogue Microsoft Excel 5.0
Comme je le disais les deux feuilles Dialogue1 et Dialogue2 sont utilisés comme des formulaires
afin de remplir les informations saisis dans la feuille "Feuil1"
Une macro permet de visualiser sous forme d'une boite de dialogue la feuille Dialogue1 via le code suivant:
DialogSheets("Dialogue1").Show et pour la feuille Dialogue2 DialogSheets("Dialogue2").Show
Dans chacune de ces boites de dialogue un bouton renvoie à l'autre fenêtre...
Donc à un moment donné j'ai les 2 dialogsheets.show
En résumé : Dialogue1.show et Dialogue2.show
Problématique : Lorsque je veux revenir de Dialogue2.show vers Dialogue1.show, il ne veux pas car je pense le Dialogue1 est déjà ouvert
La solution est je pense est qu'il me ferme le Dialogue actif ( car ici je reprend 2 Dialogues mais dans mon projet il y en aura 8) et ouvre le Dialogue voulue afin de ne jamais me retrouver à demander à ouvrir une boite de dialogue déjà ouverte
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 6 févr. 2012 à 21:09
Et je pense t'avoir déjà répondu.
Masque donc tes deux onglets Dialogue1 et Dialogue2
genre :
Private Sub Worksheet_Activate() ' ===>> ou l'évènement open de ton classeur, par exemple
DialogSheets("Dialogue1").Visible = False
DialogSheets("Dialogue2").Visible = False
End Sub
Private Sub CommandButton1_Click()
DialogSheets("Dialogue1").Show
End Sub
Private Sub CommandButton2_Click()
DialogSheets("Dialogue2").Show
End Sub
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Vous n’avez pas trouvé la réponse que vous recherchez ?
Kalagane75
Messages postés21Date d'inscriptionlundi 3 septembre 2012StatutMembreDernière intervention21 février 2013 6 févr. 2012 à 22:04
Je dois être trop naze...
Je n'y arrive pas,
Voici les essais que j'ai effectué :
Pour ce qui est de
"Private Sub Worksheet_Activate() ' ===>> ou l'évènement open de ton classeur, par exemple
DialogSheets("Dialogue1").Visible = False
DialogSheets("Dialogue2").Visible = False
End Sub"
Je l'ai placé dans This Workbook même s'il n'a pas l'air de fonctionner
Une précision que j'ai omis :
Les boutons ne se trouve pas dans la Feuille "Feuil1" mais dans chaque boite de dialogue
2 Boutons dans le Dialogue1 (1 qui ouvre Dialogue 2 et l'autre qui ne fait que confirmer l'ouverture de Dialogue1)
2 Boutons dans le Dialogue2 (1 qui ouvre Dialogue 1 et l'autre qui ne fait que confirmer l'ouverture de Dialogue2)
Alors lorsque je veux attribuer un code au bouton les private sub n'apparaisse pas...
De plus le code "DialogSheets("Dialogue1").Visible False" masque la Feuille Dialogue1 du classeur mais pas la boite de dialogue ouvert part Dialogue1.show
la problématique est peut être aussi lié au vocabulaire...
Donc dans DialogSheets("Dialogue1").show
on a Sheets qui veux dire fenêtre, dialoguesheets ouvre la boite de dialogue nommé "Dialogue1" qui me sert de formulaire de saisi (qui apparait devant mon fichier excel un peu comme un msgbox. Lorsque je saisi dans ma boite de dialogue il apparait en même temps dans "feuille Dialogue1".
Le truc est que "DialogSheets("Dialogue1").Visible = False" agit sur la feuille "Dialogue1" et non la boite de Dialogue "Dialogue1"
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 6 févr. 2012 à 23:54
Attends, là :
Réalises-tu qu'une boîte de dialogue est modale et ne saurait se fermer autrement que par les boutons OK ou Annuler ou la croix de fermeture ?
Ce ne saurait être un autre bouton que tu y aurais inséré qui la fermerait
Peux-tu nous exposer le but assez étrange de ces deux boites de dialogue que tu veux traiter comme des userforms non modaux, au bout du compte ?
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 7 févr. 2012 à 07:17
Pour que tout soit bien clair dans ton esprit :
Les boîtes de dialogues ont une vocation très particulière. Elles sont modales et donc assurent une contrainte
Toute boîte de dialogue doit être fermée si l'on veut accomplir d'autres tâches dans l'appli. Elle ne peut l'être que par les boutons prévus à cet effet sur la boîte (les 2 signalés dans ton cas) ou par la croix de fermeture.
Les boîtes qui t'intéressent peuvent être complétées par toi (ajout de labels, boutons, etc ...) Les contrôles ainsi ajoutés aux objets de la collection DialogSheets ne peuvent être des composants activex, mais uniquement des contrôles Excel. Ces contrôles peuvent être assortis d'une macro définie par toi (on y accède non en double-cliquant, mais par clic droit ===>> Affecter une macro), mais en aucun cas les macros qui les accompagnent peuvent recevoir du code destiné à fermer la boîte elle-même.
Il t'est possible de construire une usine à gaz et d'utiliser SendKeys pour simuler le click sur le bouton Annuler ou sur le bouton OK, ce qui aura pour effet de fermer la boîte. Je te déconseille très vivement une telle méthode. Si tu veux toutefois te lancer dans cette folle direction en dépit de ce que je te dis-là, il te suffit "d'envoyer" la touche ENTER et celui des deux boutons (OK ou Annuler) ayant le focus sera considéré comme cliqué. J'appelle à ce sujet ton attention sur le fait que les boîtes de dialogue du type qui t'intéresse te permettent, en mode création, de choisir l'ordre de tabulation des contrôles qu'elles contient, y compris de ses propres boutons.
Voilà pour ce qui est de l'essentiel.
J'attends ta réponse à la question que je t'ai posée dans mon message précédent pour éventuellement t'orienter vers une voie plus adaptée.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 7 févr. 2012 à 07:52
Pour ne rien te cacher, j'ai pensé ce matin, en prenant mon petit déjeuner, à la raison qui pouvait te conduire à la recherche d'un tel mécanisme.
Je n'en ai trouvé qu'une jusqu'à présent : assortir chaque feuille de ton classeur d'une "boîte" différente selon la feuille en cours. Et je ne serais pas étonné d'apprendre que tu as en réalité prévu plus des deux boîtes dont tu nous parles. Et cette "boite-pour-feuille x" s'afficherait spontanément à chaque activation d'une feuille x. Elle devrait pouvoir être fermée, soit sur intervention de l'utilisateur, soit au passage à une autre feuille (qui afficherait alors la sienne).
Si c'est bien là le fond de ta pensée : dis-le. Et tu n'auras besoin que d'un seul Userform, contenant toutes tes "boîtes", une seule d'entre elles (celle adaptée à la feuille en cours) n'étant affichée lors de l'activation d'une feuille. Et il s'agirait alors là d'un mécanisme très simple à mettre en oeuvre.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Kalagane75
Messages postés21Date d'inscriptionlundi 3 septembre 2012StatutMembreDernière intervention21 février 2013 7 févr. 2012 à 09:31
Bonjour,
Ce que j'ai voulu faire, c'est creé un interface pour tous les utilisateurs du fichier.
Afin d'eviter que les utilisateurs saisissent en dehors ou modifie... Je me suis dit la meilleurs solution est de creer une interface plutot que de travailler dans une feuille excel.
Les informations sont repris dans des editbox,case a cocher....
Au debut j'utilisai un userform,j'etais limité
Car je ne pouvaius y mettre des formes type cercle ou rectangle...
Alors je travaille principalement sur ces dialogsheets.
Chaque pages reprenne un certain nombre d'information(par theme) qui sont retransmis dans une feuille excel...
Puisque les dialogsheets sont en mode ".show", les utilisateurs ne voient pas le fichier excel et donc l'ensemble des feuilles qui la compose.
Pour complement,j'ai betement supprimer les touches ok et annuler qu'il me proposait sur chaque dialogsheets.
Pour finir sur mon idee:
l'utilisateur ouvre le fichier excel
Cela ouvre automatiquement la boite de dialogue numero1
L'utilisateur saisi ces donnees
L'utilisateur passe via une macro au dialoguesheets2
L'utilisateur saisi ces donnees
L'utilisateur passe via une macro au dialoguesheets3
Etc
Si toutefois il manque une info il pourrait revenir au dialogsheets2.
L'idee est dessiné,
Peut etre ouvrir toutes les boites de dialogue .show dès l'ouveture et une macro qui permettrai de basculer entre boite de dialogue. Un peu comme si on le mettais au premier plan
Ou alors provoquer la fermeture du dialogsheets en cours un peu comme la fonction annuler et ouvrir une autre boite de dialogue...
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 7 févr. 2012 à 09:43
La seule solution existante est farfelue et je te l'ai dite (fermer en utilisant sendkeys) et encore :
1) à la seule condition de ne déclencher aucune autre action ni avoir besoin de garder les données éventuellement saisies dans ta boîte !
2) ne fermera rien si l'utilisateur a donné le focus à l'un de tes contrôles à toi (insérs dans la boîte)
Mon seul conseil (mais c'est ton appli) : abandonne une telle démarche (celle de telles boîtes, qui ne sont pas destinées à cela)
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Kalagane75
Messages postés21Date d'inscriptionlundi 3 septembre 2012StatutMembreDernière intervention21 février 2013 7 févr. 2012 à 10:15
Et tu utiliserais qu'elle methode afin de créer une interface de saisie type formulaire d'access sauf que nous n'avons pas acces sur le site ou j'en ai besoin.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 7 févr. 2012 à 11:35
Je n'en vois pas d'autres que celle dont tu dis ne pas vouloir : UserForm !
Je crains que tu ne tournes en rond, à vouloir chercher l'inexistant.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 7 févr. 2012 à 12:04
Et je viens de revérifier :
Tant qu'est ouverte l'une quelconque des 2 boites (modales, je le répète) Tu n'as la main sur rien d'autre que sur cette boîte. Et tu ne peux la fermer que par son bouton OK, son bouton Annuler ou s petite croix (et d'aucune autre manière, y compris depuis son propre code, dans un bouton rajouté), sauf à simuler (sendkeys) l'appui d'une touche.
Alors je te le dis de suite :
1) je viens de voir que la touche ESCAPE permettait de quitter une boîte de dialogue
2) je pense donc avoir une solution avec l'envoi de cette touche
3) je désapprouve toutefois totalement, insiste sur ce point et ne continuerais à "mettre en oeuvre" que si tu insistes vraiment (et vraiment fortement).
Je tiens par ailleurs à te dire que Sendkeys ne fonctionnerait, au delà de XP, qu'en désactivant l'UAC !
Je te laisse donc seul responsable de la décision que tu vas prendre et de ses conséquences éventuelles.
A toi de me dire, maintenant, le degré de ton insistance et de ta motivation.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 7 févr. 2012 à 13:18
Et pour t'aider à prendre ta décision en meilleure connaissance de cause :
Je viens de commencer à me frotter à l'usine à gaz que tu veux construire ===>>
Mon idée de ESC était bonne, mais insuffisante ===>> il faut (ce que j'ai fait) y ajouter d'autres acrobaties en tous genres. Je te promets qu'une fois toutes les acrobaties bien "arrêtées", même toi n'y retrouveras plus tes petits sans un énorme mal au crâne en cas de maintenance à assurer moins d'un mois après
Alors : réfléchis mille fois, hein ...
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Kalagane75
Messages postés21Date d'inscriptionlundi 3 septembre 2012StatutMembreDernière intervention21 février 2013 7 févr. 2012 à 14:38
Je vais essaye ce soir l'idee des Userforms.
LE truc c'est que j'avais quasiment déjà fait tout mes boites de dialogue avec des dizaines et dizaines page de code par boite de dialogues,d'ou mon insistante.
Avec des dessins que je ne peux faire apparaître dans un userform puisque je n'ai pas acces a la boite outil dessin dans l'userform.
Ayant quasi fini il me redtait cette etape...
Enfin si c'est vraiment compliquê avec 2 boites de dialogue, alors avec 8 ou 10 déjà completé...et liee a ma feuille receuillant toute les saisies...
Honnetement si tu as la solution, je veux bien essyé avant de faire abstraction de toutes les heures passèes et repartir sur de nouvelles.
Kalagane75
Messages postés21Date d'inscriptionlundi 3 septembre 2012StatutMembreDernière intervention21 février 2013 7 févr. 2012 à 17:16
Au fait, une idée peux mettre au premier plan un dialoguesheet vis à vie de l'autre
Admettons que l'on ouvre l'ensemble des dialogsheets, puis on met au premier plan celui que l'on souhaite...
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 7 févr. 2012 à 17:58
Non True ne vaut pas OK ! Ce n'est que le paramètre d'attende du Sendkeys, et rien d'autre !
Où en suis-je ?
Je passe à l'aise de feuil1 (avec sa boite) à Feuil (avec sa boite)
Mais je découvre un nouvel os : impossible de revenir sur Feuil1 avec sa boite. Je peux y revenir, mais sans boîte.
Je bataille pour combattre ce nouvel obstacle inattendu !
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 7 févr. 2012 à 20:27
Je viens de voir pourquoi (lenteurs de Excel) mais le remède m'échappe encore (plus pour longtemps car je suis - c'est ma nature et je n'ai pas le choix - plus têtu que le mal).
Ce que je sais déjà faire : y parvenir dès que l'on change de cellule sélectionnée sur une feuille ===>> et ça marche, mais non élégant.
Je pense donc déjà à un autre stratagème (mais ce sera une acrobatie de plus) !)
A demain, donc.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Kalagane75
Messages postés21Date d'inscriptionlundi 3 septembre 2012StatutMembreDernière intervention21 février 2013 7 févr. 2012 à 20:49
Je continue aussi, je lâche rien...
en pas à pas ça avance mais lors de la mise en route de la macro ça marche plus voir bug du fichier. ctrl+alt+supp et on recommence autrement.
J'essai ave setFocus ou SetWindowPos.... Bon courage