userform en focus [RESOLU] (encore) - VB/VBA/VBS - Programmation
Marsh Posté le 27-02-2013 à 16:01:35
ça pue à la base d'avoir un userform en permanence ouvert pour afficher des résultats...
Je n'ai jamais vraiment bossé avec et encore moins été confronté aux problèmes de focus, je me demande même s'il est possible de faire ce que tu souhaite
Je vois plusieurs options néanmoins:
-Appeler le userform quand tu as besoin d'afficher les résultats (ne pas avoir le userform chargé en permanence)
Pros: appelable de n'importe quelle feuille
Cons: capilotractage pour pas grand choses
-Construire un tableau d'affichage dans le tableur excel directement (sans userform)
Pros: le focus reste sur excel et tu affiche des résultats dans des cellules, fonction naturelle de cet objet
Cons: si tu souhaite afficher ces résultats sur plusieurs feuilles, eh bah va falloir reconstruire le tableau sur chaque feuille...
Marsh Posté le 27-02-2013 à 17:54:56
Encore une fois, la solution est dans l'aide en ligne de VBA, en l'occurrence, voir l'option d'appel de la méthode Show ‼
Marsh Posté le 27-02-2013 à 18:07:53
Ah ouais
Je ne connaissais pas la notion de modal/non modal
Citation : Pour que les feuilles de calcul restent accessibles, vous devez passer la boite de dialogue en mode non modal. |
source: http://silkyroad.developpez.com/VBA/UserForm/
Marsh Posté le 27-02-2013 à 18:30:48
Merci pour vos réponses.
Pour ce qui est de l'etat modal/non modal, cet l'une des première chose sur lequel je suis tombé.
Mais dans mon code, j'ai mis:
«le nom de mon userform».show 0
Ce qui correspond a false si je ne me trompe pas.
Mais peut-être ne l'ai-je pas mis au bon endroit?
Marsh Posté le 27-02-2013 à 18:51:15
Non c'est bon, je viens de vérifier via l'Explorateur d'objets, vbModeless = 0
Il faudrait p't'être aussi vérifier la propriété ShowModal via la fenêtre Propriétés de l'UserForm …
Après si cela ne va toujours pas, si cela ne vient pas d'un Excel en mode piloté, je ne vois rien d'autre …
Marsh Posté le 27-02-2013 à 19:00:47
Un excel en mode piloté? Cest quoi cette chose?
Le fait d'être en session citrix avec les application sur serveur xen , peut il être source de problème(s)
Par contre, je ne pourrai vérifier que demain matin pour la propriété ShowModval . Je suis chez moi, la.
Marsh Posté le 28-02-2013 à 09:03:30
Merci Marc L
J'ai effectivement changé la propriété ShowModal en false et cela fonctionne!
Mais pourquoi on ne peut pas passer par une instruction dans la routine? Bref. Ca marche. Je peux modifier ma feuille.
Si je peux abuser, est il possible (je n'ai pas encore cherché) que mon userform se mette à jour en même temps que j'ajoute des données?
Marsh Posté le 28-02-2013 à 09:22:06
rsuinux a écrit : Merci Marc L |
Les explications que je trouve sur le net ne sont pas assez clair
J'ai l'impression que c'est une propriété qui ne peut pas être modifiée pendant l’exécution.
Mais cela est il vraiment gênant? As tu besoin de passer d'un mode à l'autre pendant l’exécution de ton code?
rsuinux a écrit : Si je peux abuser, est il possible (je n'ai pas encore cherché) que mon userform se mette à jour en même temps que j'ajoute des données? |
Oui, en vba, il y a ce qu'on appelle des macros évènementielles, autrement dit, elles se déclenchent (s’exécutent) lorsqu'un évènement se produit.
Dans ton cas, il s'agit de modification d'une feuille (ajout de données)
Dans ton explorateur de projet, double clique sur une feuille, sur les deux listes déroulantes, tu auras à gauche (général) à passer sur worksheet, et à droite, sélectionne "change), tu auras alors une nouvelle macro:
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
Celle ci s'exécutera donc à chaque changement opéré sur la feuille concernées.
Dans ce sub, tu dois appeler la procédure qui met à jour ton userform.
Attention, cette procédure ne s’exécutera que si la feuille est changée, pas une autre.
Si tu veux que tout changement dans le classeur exécute ta macro, essaye en double cliquant sur thisworkbook de l'explorateur, puis sur la liste déroulante de gauche, SheetChange, je ne sais pas si ça marche, mais ça pourrait
Marsh Posté le 28-02-2013 à 09:30:24
hush hush a écrit : |
Non non, ce n'est pas gènant, juste je me posais la question
hush hush a écrit : |
ok, je me lance , je teste et je fais un retour.
Merci de ta rapidité!
Rémi.
Marsh Posté le 28-02-2013 à 10:52:33
bon, je viens de tester, mais j'ai un blocquage tout c.. je suis sur.
J'ai créer une procédure suivante:
Code :
|
qui me servira à réafficher dans le champ texte le contenu de ma cellule.
Ensuite, comme tu me l'as suggéré, j'ai créé
Code :
|
Mais j'ai beau tourner dans tous les sens, à chaque fois j'ai une erreur "sub ou fonction non définie"!!!
je me suis dit, je vais ruser, je vais mettre ma Sub au même endroit que Worksheet_Change mais là, c'est Temps.Enabled qu'il ne connait plus! pourtant, elle fait partie de mon userform.
Je pense que c'est un problème de déclaration, mais je n'arrive pas à trouver comment. Mes tests avec une déclaration dans un module non pas fonctionné.
Je m'a gourré ou, là?
Marsh Posté le 28-02-2013 à 12:10:09
Essaye:
Call affichage_valeur
(dans le même temps, je vais faire un test, si ça ne marche pas, reviens voir ici)
Edit: première méthode ne fonctionne pas
Il faut faire: nomUserForm.affichage_valeur
Marsh Posté le 28-02-2013 à 12:35:14
Non, cela ne fonctionne pas:
Call affichage_valeur
en tout cas, je te le confirme.
La seconde méthode me génère une erreur aussi. La même.
Donc, on va se mettre d'accord:
Dans mon code 'Worksheet':
Code :
|
et dans mon code 'général'
Code :
|
De plus, dans ma feuille, j'ai ceci:
Code :
|
Ce qui fait que quand je remplie C11 j'ai une erreur en E11 tant que D11 n'est pas remplie (logique, je travaille en heures)
Et cette erreur ne peut elle pas engendrer un problème plus haut dans mon code ?
Marsh Posté le 28-02-2013 à 12:47:21
Private Sub UserForm_Initialize() doit être dans le code du userform (accessible en double cliquant sur le userform dans l'explorateur de projet)
Edit: et oui, l'erreur pourra générer un bug, mais chaque chose en son temps
Marsh Posté le 28-02-2013 à 13:25:47
Mon code UserForm_Initialize() se retrouve dans la fenêtre (general) (Declarations) mais aussi dans Userform - click
En fait, j'ai dans la fenêtre de code, en haut à gauche:
(Générale) et en menu: Frame1 Temps UserForm
Et à l'affichage, j'ai: l'userform, dedans, une frame, et encore dedans mon texbox appelé Temps
Marsh Posté le 28-02-2013 à 14:05:36
Dble clicke sur le userform (quand tu le vois pour pouvoir le modifier)
Tu arrive sur son module,
Là, il faut selectionner initialise dans la listbox à droite (celle a gauche passe en userform automatiquement)
Et là, tu colle ta procédure d'initialisation.
Ce code n'a rien à faire dans général
Marsh Posté le 28-02-2013 à 16:28:52
hush hush a écrit : Dble clicke sur le userform (quand tu le vois pour pouvoir le modifier) |
hush hush a écrit : Dble clicke sur le userform (quand tu le vois pour pouvoir le modifier) |
Je dois être "un peu" boulet, mais là, c'est niet.
Je cromprend bien ta manoeuvre, mais ça ne fonctionne pas.
Je crois que je vais poster mon fichier ce sera plus parlant. j'ai virer les données perso dedans.
Dès que je rentre chez moi, je le met sur mon serveur. En attendant, voila ce que j'ai tenté de faire:
Code :
|
Mais quand tu dis "selectionner initialise dans la listbox à droite (celle a gauche passe en userform automatiquement)
" en fait, j'ai toujours tout le code qui est affiché, c'est pour ça que je ne comprends pas Quelque soit ce que je selectionne:
Userform / Initialize ou Frame1 / Click ou même (Générale) / (Déclarations)
Cela change le curseur de place, mais c'est tout!
Marsh Posté le 28-02-2013 à 16:44:42
Bon, ça veut dire que ton code _initialize est au bon endroit
Sinon:
Private Sub UserForm_Click()
Formation1.Show 0
End Sub
Se déclenche quand tu clique sur le userform? Une fois en show?
Si je comprends bien ton code, UserForm_Initialize() est la procédure qui met à jour le contenu de ton userform
Dans ce cas, c'est cette procédure que tu dois appeler à partir de worksheet_onchange
Et pour l'appeler, essaye: userform.UserForm_Initialize
Sinon oui, avec le fichier, ce sera plus simple, sauf que chez moi, je suis sous mac
Je peux te passer mon mail par mp si ça peut te dépanner
Marsh Posté le 28-02-2013 à 17:08:10
et moi sous linux à la maison!
Merci pour ton aide. Je vais tester avant de partir du taf quand même
Pour ta première question, non, je voudrais que mon
Code :
|
se déclanche de suite!
Marsh Posté le 28-02-2013 à 17:18:02
Ca marche!!!! J'ai mis
Code :
|
Dans Worksheet / Calculate
et ça réaffiche uniquement que quand la feuille recalcule!
L'erreur générée par une entrée type 14:00-(rien) n'amène pas de bug!
Mais comme tu me l'as fait remarqué, je pense que le formation1.show 0 n'est pas au bon endroit. L'userform à le focus, mais j'ai la main sur la feuille en cliquant dedans, c'est le principale
Vraiment un grand grand merci!!!
Marsh Posté le 28-02-2013 à 17:30:12
ReplyMarsh Posté le 28-02-2013 à 20:23:58
hush hush a écrit : Bon ben si ça marche! |
certes, mais j'ai l'habitude de partager mes sources. Quand je n'y arrive pas je demande, et quand j'ai trouvé ou quand on m'a aidé à trouver la solution, je marque 'résolu' à la fin, et je partage les sources.
Donc, voila ma feuille excel avec l'UserForm (évidemment, j'ai enlevé les données sensibles)
http://remi.suinot.org/IMG/feuille [...] s-demo.xls
Grand merci à tous pour vos avis éclairés
Rémi.
Marsh Posté le 01-03-2013 à 09:16:05
J'ai essayer de charger ton fichier pour voir, mais ça ne marche pas
Bonne chance pour la suite en tous cas!
Marsh Posté le 01-03-2013 à 09:43:15
ah?
Je pense savoir pourquoi, j'héberge chez moi, et depuis hier, edf me fait des coupures ... tout le quartier! Peut être qu'il y a de ça, car je l'avais testé après l'avoir placé sur le disque.
Me reste juste le problème du focus (apres je vous embète plus). Faut il que je mette UserForm1.Show False dans l'Initialisation?
Marsh Posté le 01-03-2013 à 20:50:12
ca y est ça remarche!! Edf a redémarré!
Mon serveur aussi
Marsh Posté le 27-02-2013 à 15:40:51
Bonjour,
suite à ma question sur le format d'affichage dans un userform, j'avais dit que je reviendrais avec un autre soucis mais beaucoup plus lié à l'affichage de l'userform lui même cette fois ci.
Je m'explique.
Ma session windows de travail est dans un environnement citrix, avec toutes les applications distantes.
Dans mon fichier excel, j'ai mes cellules affichées, et par dessus, en haut à gauche, un userform qui donne le résultat d'un calcul. Bon, jusque là j'ai su me débrouiller. Ma première feuille s'ouvre, m'on userform aussi, et prend le focus, et ne rend pas la main bien sur. Ca tout le monde a le même problème apparement. Je suis tombé sur la solution
Sauf que celle ci ne fonctionne pas.
Je ne sais pas trop comment m'en sortir. J'ai réussi à désactiver la croix de fermeture de la fenêtre de l'userform, mais je ne peux pas récupérer la main sur ma feuille excel derrière (ni sur les autres d'ailleurs)
Je sais que beaucoup de monde pose cette question. Mon userform ne demande pas de valeur, ni n'a de bouton. Aucune interaction. C'est juste informatif. C'est pour cela qu'elle n'a pas à être en focus!
Auriez vous une piste, s'il vous plait? Je met mon code ci dessous (si vous avez des amélioration à proposer, n'hésitez pas! je ne suis pas un connaisseur de vba)
Et dans workbook:
Merci de vos suggestions.
Rémi.
Message édité par rsuinux le 01-03-2013 à 08:51:55