Passage entre plusieurs Dialogsheets - fermer un Dialogsheets

Résolu
Kalagane75 Messages postés 21 Date d'inscription lundi 3 septembre 2012 Statut Membre Dernière intervention 21 février 2013 - 6 févr. 2012 à 20:03
Kalagane75 Messages postés 21 Date d'inscription lundi 3 septembre 2012 Statut Membre Dernière intervention 21 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

30 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
7 févr. 2012 à 21:01
Oublie le setfocus. Oublie également le SetXindowpos. Comment et depuis quoi (puisqu'en modal, pourrais-tu le faire ?). Kif-Kif avec ShowWindow, etc ... arrête de chercher dans cette direction, puisque tu n'as pas la main pour y parvenir.
Et en admettant d'ailleurs même (bien qu'impossible pour les raison exposées) que tu "planquerais" la fenêtre là où personne ne la verrait ===>> tu n'aurais pas pour autant "la main" (puisque modale), et ce : nulle part .
Je serai là demain (je suis plus agile de bon matin).


____________________
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
0
Kalagane75 Messages postés 21 Date d'inscription lundi 3 septembre 2012 Statut Membre Dernière intervention 21 février 2013
7 févr. 2012 à 21:32
merci,
à demain
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 févr. 2012 à 22:18
et tu auras compris qu'on peut ainsi rajouter autant de boites que l'on veut à raison d'une boîte par classeur et d'une macro totox par boîte, 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
0
Kalagane75 Messages postés 21 Date d'inscription lundi 3 septembre 2012 Statut Membre Dernière intervention 21 février 2013
7 févr. 2012 à 23:36
Impressionnant,
afin de comprendre ta méthode, car la solution est une chose mais pour apprendre il faut comprendre.

Si j'ai bien capté tu as créé une boucle infini...

A l'ouverture du fichier
Tu lui demande d'ouvrir la feuil1 et 1 seconde après de lancer l'application "Allons y"

L'application "Allons y" lance toutes les secondes le dialogsheet sous le même numéro de la feuille sélectionné
Fini étant un élément extérieur, tant que je ne lui ai pas donné le statut "Faux" via la macro "Terminé" la boucle continue.

A chaque fois que je lance Toto 1 ou 2 , il me ferme le Toto en cours et ouvre à nouveau via "Allons-y" le dialogue avec le numéro de la feuille activé a travers la macro.

Effectivement tu t'es bien creusé la tête et pas qu'un peu...

Pour info:
- moins que ("00:00:01") j'imagine qu'en langage VBA ça n'existe pas?
Pour traduction:
- DialogSheets(Replace(ActiveSheet.Name, ("Feuil"), "Dialogue")).Show
Replacer quoi ? - J'ai bien capter qu'ActiveSheet.Name donné le nom de la feuil soit feuil1 par exemple mais pourquoi derrière la virgule Feuil à nouveaux et Dialogue.
- Fini est un élément préalablement défini sur VBA équivalent à End ?

Merci, merci encore
et à demain...
0

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 févr. 2012 à 07:17
Eh bien nous y voilà de bon matin. Et il fait très froid (-7 dans le pays basque !)

Ne te laisse jamais impressionner !
Le code n'est en soi rien. Il n'y a que ce qu'il traduit de la pensée qui peut étonner. La pensée elle-même, dans cette affaire, n'est pas pure car le résultat empirique de découvertes de mécanismes/barrières qui lui échappaient et auxquels elle a du s'adapter. C'est tout !

Alors :
- oui le mécanisme est grosso-modo celui que tu as décrit
- fini n'est pas un mot VB (pas plus que mes toto ). Ce n'st que le nom que j'ai donné à une variable publique booléenne, nom que tu peux, si tu le veux, changer pour bachibouzouk (si tu aimes Tintin).
- DialogSheets(Replace(ActiveSheet.Name, ("Feuil"), "Dialogue")).Show ===>>
Replace n'est qu'une fonction de VBA. Replace, en anglais, ne signifie pas replacer, mais remplacer. Nous remplaçons ici tout simplement, dans la chaine "Feuil2" par exemple, la sous-chaine "Feuil" par "Dialogue" ==>> et ainsi "Feuil1" devient "Dialogue1", qui est le nom de la boîte dialogsheet que nous devons ouvrir par Show.
- le chrono "OnRime", maintenant : sa mise en oeuvre a été nécessaire pour les deux raisons suivantes :
------ SendKeys, dont je t'ai déjà dit le mal que j'en pensais peut avoir des effets irréguliers et parfois inattendus ('notamment lorsqu'il ne sait plus vraiment qui il doit frapper).
------ Sendkeys peut ainsi "frapper" non la boîte en cours, mais celle dont on demande l'ouverture. Il convient alors (lorsque cela arrive) de remettre les choses en ordre, ce que fait Allons_y. Sans cette imperfection de Sendkeys, il aurait suffit de donner les instructions d'ouverture de la boîte suivante dans l'évènement Activate des feuilles.
------ Et Allons_y, lancé périodiquement, permet de palier la gêne qu'occasionnerait l'utilisateur en fermant lui-même la boîte. Allons_y joue donc un double rôle, dont celui d'un gendarme.*
------ l'horlohe OnTime de VBA ne peut avoir un battement de moins de 1 seconde. On peut par contre la remplacer par des fonctions de l'Api de Windows et "descendre" ainsi jusqu'à la milliseconde (mais serait-ce vraiment utile ?).
=================================================================================

Il faut que tu comprennes maintenant que je n'ai mis en oeuvre (en dépit de ma réprobation) ce mécanisme que dans l'ignorance pour l'instant presque totale des tenants et aboutissants.
- Que vont contenir ces dialogsheets (en dehors des 2 boutons que nous avons créés ?)
- ces boîtes étant modales, tu ne peux cliquer valablement nulle part tant qu'elles sont actives. Dans mon code, j'ai "figé" les passages d'une feuille à l'autre pour déterminer le mécanisme à mettre en oeuvre et en tester la justesse. Il y a beaucoup mieux à faire si, dans chacune des boîtes, tu permets à l'utilisateur de choisir (dans une liste déroulante) la feuille à traiter. Mais c'est un point que j'ignore encore des tenants et aboutissants qui sont les tiens.
- parlons du bouton "terminer". Sa macro peut être écrite de manière un peu plus élargie. On pourrait par exemple très facilement l'affubler d'un mot de passe et, selon qu'il a ou non été donné, permettre d'interrompre et d'accéder aux feuilles et aux macros de l'appli, ou au contraire obligerait à quitter sans rien pouvoir faire d'autre que sauvegarder ou non.
Etc ...
Tu vois ? Les aspects possibles sont divers et variés et peuvent même inclure la protection.
Je n'irai plus finement et plus loin que lorsque je saurai tout 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
0
Kalagane75 Messages postés 21 Date d'inscription lundi 3 septembre 2012 Statut Membre Dernière intervention 21 février 2013
8 févr. 2012 à 09:08
Bonjour,

Les Dialogsheets sont constitués d'un bon nombre de case à cocher, EditBox, ListBox et image?
Tous ces éléments de saisi, ou choix de chaque boite de dialogue sont repris à travers l'interface sur une feuille Excel sous forme de base de données?

Cette interface joue le même rôle qu'un formulaire dans accès.
N'ayant pas Access, ni moi ou mes collègues, je n'ai le choix que sur VBA d'Excel.

Pour le Bouton Terminer je pourrai le nommé Administrateur avec un mot de passe afin de pourvoir travailler dessus par la suite et empêcher un utilisateur de jouer dedans.
Il faut que j'étudie la question car je ne l'ai jamais fait.

Pour l'horloge On Time de VBA, descendre à 1 milliseconde n'est pas primordiale dans l'absolue, le plus important est que ça marche?
C'était plus pour un confort visuel, ce que je veux dire c'est que je voulais que ça se rapproche de l'exemple suivant qui reflète pas mal ce que je voulais faire :
Comme l'installation d'un logiciel, je m?explique : on installe, jusque là tout va bien.
Et là la méthode m?intéresse, on click sur suivant avec tout les choix voulue, suivant etc.? et parfois précédent si nécessaire (ex : modifier le disque dur pour l'installation.)
Le cadre semble rester statique, et son contenue change à chaque click.
J'imagine bien que ce n'est pas fait à partir de VBA mais d'un truc bien plus poussé.

Où alors tout dans un Dialogsheets, sous forme de calque reprenant chaque thème, que l'on pourrait rendre visible ou invisible selon le besoin.
Visible = accès par la même occasion
Invisible = Interdit d'accès par la même occasion
Je ne sais pas, c'est une idée peut être plus simple.

Je ne sais pas si remplacer les boutons par des rectangles (dessins) aiderait ou ferait la différence?

Merci encore
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 févr. 2012 à 10:46
Mais alors : si pour passer d'une feuille/dialogsheet à l'autre il y a mieux à faire (puisque l'on connait d'avance, dans ce cas, le nom de la feuille/boite suivante ou précédente).
Et de plus : ne s'agirait-il donc, en outre, que d'afficher ces boites de dialogue sans interférence avec des feuilles de calcul de ton appli ?
Précise ces aspects, qui peuvent changer encore beaucoup de choses (et de manière plus agréable)!


____________________
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
0
Kalagane75 Messages postés 21 Date d'inscription lundi 3 septembre 2012 Statut Membre Dernière intervention 21 février 2013
8 févr. 2012 à 11:56
Oui je l'ai connais d'avance puisqu'elles sont déjà toute faite,
Pour notre exemple 3 feuille/Dialogsheets nommées respectivement :
Dialogue1
Dialogue2
Dialogue3
au delà de ça j'ai une feuille de calcule qui me sert de base de données reprenant via des macro interne à chaque élément se trouvant dans chaque feuille/Dialogsheets

Pour que les macros de chaque élément fonctionne, la feuille/Dialogsheets correspondant à l'objet doit être ouvert car j'utilise peut être à tort le code suivant :
Sheets ("XXXX").activate
Shapes ("List Box 4").Select
A1 = selection.characters.text
Si je ne sélectionnais pas la feuille, il ne me trouvait pas l'objet...

En gros: je saisi dans un EditBox une valeur par exemple, je le valide et l'info est incrémenté dans ma saisie. Et ainsi de suite dans tout les EditBox...
Ensuite je passe au Dialogsheets suivant, et rebelote...

Si ça te parais plus clair
0
Kalagane75 Messages postés 21 Date d'inscription lundi 3 septembre 2012 Statut Membre Dernière intervention 21 février 2013
8 févr. 2012 à 11:57
par saisie je veux dire Base de données
0
Kalagane75 Messages postés 21 Date d'inscription lundi 3 septembre 2012 Statut Membre Dernière intervention 21 février 2013
8 févr. 2012 à 21:15
Au fait pour rendre le truc plus réactif...

Dans le code suivant :
..."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
...
Private Sub Workbook_Open()
toto2
Application.OnTime Now + TimeValue("00:00:01"), "allonsy"
End Sub"...

J'ai modifié "...Now + TimeValue("00:00:01"), "... par "...Now + TimeValue("00:00:01")/1000, "...

Avec ça c'est pas parfait mais on y est presque dans l'instantané.
Pour ce qui est de l'Api de Windows avec Timer, je pars de Zéro, alors je continue à essayé de comprendre.

Bonne soirée
0
Rejoignez-nous