[RESOLU] (encore) userform en focus

userform en focus [RESOLU] (encore) - VB/VBA/VBS - Programmation

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  

Code :
  1. AppActivate "Microsoft Excel"


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)
 

Code :
  1. Option Explicit
  2. Private Sub Frame1_Click()
  3. End Sub
  4. Private Sub Temps_Change()
  5. End Sub
  6. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  7.   If CloseMode = vbFormControlMenu Then Cancel = True
  8. End Sub
  9. Private Sub UserForm_Click()
  10.   Formation1.Show False
  11. End Sub
  12. Private Sub UserForm_Initialize()
  13.   With Formation1
  14.     .startUpPosition = 3
  15.     .Left = Application.Width - Formation1.Width - 10
  16.   End With
  17.  
  18.   Temps.Enabled = False
  19.   Temps = Sheets("Formations 2013" ).[A2].Text
  20. End Sub


Et dans workbook:  

Code :
  1. Private Sub Workbook_Open()
  2.     Formation1.Show
  3. End Sub


 
Merci de vos suggestions.
Rémi.


Message édité par rsuinux le 01-03-2013 à 08:51:55
Reply

Marsh Posté le 27-02-2013 à 15:40:51   

Reply

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...

Reply

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
 

Reply

Marsh Posté le 27-02-2013 à 18:07:53    

Ah ouais :)
Je ne connaissais pas la notion de modal/non modal :o
 

Citation :

Pour que les feuilles de calcul restent accessibles, vous devez passer la boite de dialogue en mode non modal.
La propriété ShowModal doit être égale à False.  


source: http://silkyroad.developpez.com/VBA/UserForm/

Reply

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?

Reply

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 …
 

Reply

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.


Message édité par rsuinux le 27-02-2013 à 19:04:59
Reply

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?

Reply

Marsh Posté le 28-02-2013 à 09:22:06    

rsuinux a écrit :

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.


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 :)

Reply

Marsh Posté le 28-02-2013 à 09:30:24    

hush hush a écrit :


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?


 
Non non, ce n'est pas gènant, juste je me posais la question :)
 

hush hush a écrit :


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 :)


 
ok, je me lance , je teste et je fais un retour.
Merci de ta rapidité!
Rémi.

Reply

Marsh Posté le 28-02-2013 à 09:30:24   

Reply

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 :
  1. Sub affichage_valeur()
  2.   Temps.Enabled = False
  3.   Temps = Sheets("Formations 2013" ).[A2].Text
  4. End Sub


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 :
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.   affichage_valeur
  3. End Sub


 
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à?

Reply

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 :o
Il faut faire: nomUserForm.affichage_valeur


Message édité par hush hush le 28-02-2013 à 12:15:11
Reply

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 :
  1. Option Explicit
  2. Private Sub Worksheet_Calculate()
  3.         Formations1.affichage_valeur
  4. End Sub


et dans mon code 'général'

Code :
  1. .../...
  2. Private Sub UserForm_Initialize()
  3.   With Formation1
  4.     .startUpPosition = 3
  5.     .Left = Application.Width - Formation1.Width - 10
  6.   End With
  7.   affichage_valeur
  8. End Sub
  9. Sub affichage_valeur()
  10.   Temps.Enabled = False
  11.   Temps = Sheets("Formations 2013" ).[A2].Text
  12. End Sub


De plus, dans ma feuille, j'ai ceci:

Code :
  1. [C10]=10:30 | [D10]=17:45 | [E10]= somme(d10-c10)
  2. [A2]=(somme de toutes la colonne D2 à....)


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 ?

Reply

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 :p


Message édité par hush hush le 28-02-2013 à 12:48:25
Reply

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

Reply

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 :)

Reply

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)
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 :)


 

hush hush a écrit :

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 :)


 
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 :
  1. Option Explicit
  2. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  3.   If CloseMode = vbFormControlMenu Then Cancel = True
  4. End Sub
  5. Private Sub UserForm_Click()
  6.   Formation1.Show 0
  7. End Sub
  8. Sub UserForm_Initialize()
  9.   Temps.Enabled = False
  10.   Temps = Sheets("Formations 2013" ).[A2].Text
  11.   With Formation1
  12.     Formation1.StartUpPosition = 3
  13.     .Top = 40
  14.     .Left = Application.Width - Formation1.Width - 10
  15.   End With
  16.  
  17. End Sub


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!

Reply

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 :o
 
Je peux te passer mon mail par mp si ça peut te dépanner

Reply

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 :
  1. Private Sub UserForm_Click()
  2.   Formation1.Show 0
  3. End Sub


se déclanche de suite!


Message édité par rsuinux le 28-02-2013 à 17:09:36
Reply

Marsh Posté le 28-02-2013 à 17:18:02    

Ca marche!!!! J'ai mis

Code :
  1. Private Sub Worksheet_Calculate()
  2.      Formation1.UserForm_Initialize
  3. End Sub


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!!!

Reply

Marsh Posté le 28-02-2013 à 17:30:12    

Bon ben si ça marche!
C'est l'essentiel :)

Reply

Marsh Posté le 28-02-2013 à 20:23:58    

hush hush a écrit :

Bon ben si ça marche!
C'est l'essentiel :)


 
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.

Reply

Marsh Posté le 01-03-2013 à 09:16:05    

:hello:  
J'ai essayer de charger ton fichier pour voir, mais ça ne marche pas :)
 
Bonne chance pour la suite en tous cas!

Reply

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?

Reply

Marsh Posté le 01-03-2013 à 20:50:12    

ca y est ça remarche!! Edf a redémarré!
Mon serveur aussi

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed