Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1495 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [RESOLU] (encore) userform en focus

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] (encore) userform en focus

n°2177775
rsuinux
Si tu sais, partage. Si tu ne
Posté le 27-02-2013 à 15:40:51  profilanswer
 

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
mood
Publicité
Posté le 27-02-2013 à 15:40:51  profilanswer
 

n°2177779
hush hush
je savais que ça te plairait
Posté le 27-02-2013 à 16:01:35  profilanswer
 

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

n°2177832
Marc L
Posté le 27-02-2013 à 17:54:56  profilanswer
 

 
           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
 

n°2177835
hush hush
je savais que ça te plairait
Posté le 27-02-2013 à 18:07:53  profilanswer
 

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/

n°2177840
rsuinux
Si tu sais, partage. Si tu ne
Posté le 27-02-2013 à 18:30:48  profilanswer
 

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?

n°2177843
Marc L
Posté le 27-02-2013 à 18:51:15  profilanswer
 

 
           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 …
 

n°2177845
rsuinux
Si tu sais, partage. Si tu ne
Posté le 27-02-2013 à 19:00:47  profilanswer
 

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
n°2177907
rsuinux
Si tu sais, partage. Si tu ne
Posté le 28-02-2013 à 09:03:30  profilanswer
 

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?

n°2177910
hush hush
je savais que ça te plairait
Posté le 28-02-2013 à 09:22:06  profilanswer
 

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

n°2177912
rsuinux
Si tu sais, partage. Si tu ne
Posté le 28-02-2013 à 09:30:24  profilanswer
 

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.

mood
Publicité
Posté le 28-02-2013 à 09:30:24  profilanswer
 

n°2177927
rsuinux
Si tu sais, partage. Si tu ne
Posté le 28-02-2013 à 10:52:33  profilanswer
 

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

n°2177946
hush hush
je savais que ça te plairait
Posté le 28-02-2013 à 12:10:09  profilanswer
 

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
n°2177952
rsuinux
Si tu sais, partage. Si tu ne
Posté le 28-02-2013 à 12:35:14  profilanswer
 

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 ?

n°2177954
hush hush
je savais que ça te plairait
Posté le 28-02-2013 à 12:47:21  profilanswer
 

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
n°2177959
rsuinux
Si tu sais, partage. Si tu ne
Posté le 28-02-2013 à 13:25:47  profilanswer
 

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

n°2177966
hush hush
je savais que ça te plairait
Posté le 28-02-2013 à 14:05:36  profilanswer
 

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

n°2178011
rsuinux
Si tu sais, partage. Si tu ne
Posté le 28-02-2013 à 16:28:52  profilanswer
 

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!

n°2178018
hush hush
je savais que ça te plairait
Posté le 28-02-2013 à 16:44:42  profilanswer
 

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

n°2178023
rsuinux
Si tu sais, partage. Si tu ne
Posté le 28-02-2013 à 17:08:10  profilanswer
 

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
n°2178028
rsuinux
Si tu sais, partage. Si tu ne
Posté le 28-02-2013 à 17:18:02  profilanswer
 

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

n°2178033
hush hush
je savais que ça te plairait
Posté le 28-02-2013 à 17:30:12  profilanswer
 

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

n°2178061
rsuinux
Si tu sais, partage. Si tu ne
Posté le 28-02-2013 à 20:23:58  profilanswer
 

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.

n°2178086
hush hush
je savais que ça te plairait
Posté le 01-03-2013 à 09:16:05  profilanswer
 

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

n°2178094
rsuinux
Si tu sais, partage. Si tu ne
Posté le 01-03-2013 à 09:43:15  profilanswer
 

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?

n°2178226
rsuinux
Si tu sais, partage. Si tu ne
Posté le 01-03-2013 à 20:50:12  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [RESOLU] (encore) userform en focus

 

Sujets relatifs
LIER UN CONTROLE IMAGE USERFORM A UNE PHOTOProblèmes avec combobox et userform
comment tester perte de focus de mon application VBNETfocus au demarrage sur une carte google maps
macro avec userform,commandbutton...Afficher une UserForm en fonction de la valeur de "Listindex"
testé en focus gained et reagire dans focus lostSupprimer résultats d'un Userform vba
Nom du UserForm qui a le focus 
Plus de sujets relatifs à : [RESOLU] (encore) userform en focus


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR