Le setfocus ne fonctionne pas... [Résolu]

Signaler
Messages postés
180
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
22 novembre 2013
-
Messages postés
7
Date d'inscription
samedi 15 novembre 2003
Statut
Membre
Dernière intervention
14 avril 2009
-
Bonjour,

j'ai fait un setfocus sur une textbox, afin que l'utilisateur, lorsqu'il encode puisse rester sur cette textbox et qu'il ne doive pas prendre chaque fois sa souris pour venir se placer dans la textbox...

(donc, il encode dans la textbox, appuye sur 'Enter', cela transfere l'info dans une listbox. la textboxe se vide et il devrait pouvoir continuer à encoder dans cette textbox...

mais mon setfocus ne fonctionne pas, lorsqu'on appuye sur 'enter', le curseur se place sur un boutton de commande qui se trouve sur l'userform...

quelqu'un sait d'ou vient le probleme (parceque le preogramme ne plante pas...)

22 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
48
Re,
Je reviens sur ma premiere proposition qui est de jouer avec l'événement Exit du TextboX

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
çà semble le plus propre oui

if condition then cancel = true

Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Salut,

Tout à fait !
Testé et approuvé.

'Declarations
Dim MaBool As Boolean


Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If MaBool False Then Cancel True
End Sub


' Basculer MaBool à True pour perdre le focus du TextBox







<hr />

... Y'en a même qui disent qu'ils l'ont vu voler.



<hr />





/PRE>
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
68
Salut
La touche Entrée ne fait pas sortir le curseur d'une TextBox.
Tu as donc codé toi même cette détection.
Quel est ton programme ?

Dans le cas de la touche Entrée, si un des bouton de la forme a la propriété Default à True, c'est ce bouton qui prendra le focus et exécutera le monBouton_Click.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
ou as tu mis le SetFocus ? montres nous ton code

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
48
Salut,
Essaie en "jouant" avec l'événement Exit du TextBox cet événement te permet d'annuler la perte de focus du TextBox. en revanche il faudra savoir QUAND annuler et quand laisser faire (d'ou le therme joué)

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
48
Re,

Et bien je vais vous peu etre étonné mais il semblerait qu'en VBA le fonctionnement soit différent.
J'ai testé pour voir  (un simple Userform avec un bouton une listbox et un textbox)

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
   If KeyCode = vbKeyReturn Then
       Call ListBox1.AddItem(TextBox1.Text)
       TextBox1.Text = vbNullString
   End If
End Sub , ----
[code.aspx?ID=41455 By Renfield]
 

Et bien lors de l'appui sur entrée le focus passe à la listbox (dans mon cas)

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
180
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
22 novembre 2013

J'ai vérifié, le Default de mes commandbuttons sont tous sur false.

je te met ci-dessous le code du textbox et celui du bouton sur lequel le focus se place...

Concernant mon petit programme, je vais essayer de vous expliquer mieux à quoi il doit servir! il s'agit d'un petit progr de gestion d'une boutique.

j'ai donc dans une feuille excel les infos suivantes:

 - colonneA : contient des références (4 chiffres)
 - colonneB : contient les catégories d'articles (chaque article est lié à une catégorie, il y en a trois au total (Alimentaire, NonAlimentaire et Livres)
 - colonneC : Contient les articles à vendre
 - colonne D : Contient le prix des articles.

Dans un userform j'ai placé les objets suivants:

 - une textbox
 - 2 listbox
 - 3 optionbuttons. (correspondant chacun à une catégorie d'articles)

l'userform sert donc à encoder les articles vendus. Je souhaiterais que l'utilisateur ai deux possibilités pour lui encoder les articles:
 - 1ère possibilité:
il choisi, via un des optionbutton, une catégorie d'article (alimentaire, non alimentaire ou livres) les articles (et leurs prix) de cette catégorie sont alors affiché dans la première listbox (elle affiche donc une fois chaque article). L'utilisateur double-clique alors sur un article et celui-ci est 'copié/collé' dans la seconde listbox. Il peut ainsi encoder plusieurs fois le meme article. Au final la listbox2 lui donne l'ensemble des articles vendu.
  

- 2ème possibilité:
il encode la référence de l'article (4chiffres) dans la textbox et lorsqu'il appuye sur la touche 'Enter' l'article (et sont prix) s'affiche directement dans la seconde listbox. (comme pour l'autre possibilité, il peut encoder plusieurs fois le meme article).
 
Le commandbutton sur lequel se place le focus sert à valider la vente et à transférer la listbox dans une feuille excel afin d'en garder une trace.

Voilà j'espere avoir été  un peu plus clair...

Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
   
    If KeyCode = vbKeyReturn Then
Dim Recherche As Range
Set Recherche = Sheets("Listing des Articles").Columns("A").Find(CLng(TextBox3), LookIn:=xlValues, LookAt:=xlWhole)
If Not Recherche Is Nothing Then
    ListBox2.AddItem
    ListBox2.List(ListBox2.ListCount - 1, 0) = Sheets("Listing des Articles").Range("C" & Recherche.Row)
    ListBox2.List(ListBox2.ListCount - 1, 1) = Sheets("Listing des Articles").Range("D" & Recherche.Row)
Else
    MsgBox "Le code n'a pas été trouvé"
End If
    TextBox3.Value = ""
    TextBox3.SetFocus 'Donne le focus a la textbox1
    End If
End Sub

Private Sub CommandButton3_Click()
 
Dim i As Integer
i = Sheets("Listing des Ventes").Range("A65535").End(xlUp).Row + 2
dteNow = Format(Now(), "dd mmm yyyy")
ClockNow = Format(Now(), "hh:mm")
For j = 0 To ListBox2.ListCount - 1
    Sheets("Listing des Ventes").Cells(i, 1).Value = dteNow
    Sheets("Listing des Ventes").Cells(i, 2).Value = ClockNow
    Sheets("Listing des Ventes").Cells(i, 3).Value = ListBox2.List(j, 0)
    Sheets("Listing des Ventes").Cells(i, 4).Value = CDbl(ListBox2.List(j, 1))
    i = i + 1
Next j
ListBox2.Clear
Label6.Caption = Format(vbNull - 1, "0.00")
TextBox2.Value = Format(CDbl(vbNull - 1), "0.00")
Label11.Caption = Format(vbNull - 1, "0.00")



End Sub
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
ah... VBA...

les controles sont dessinés et ne sont pas de vraies fenetres... chacun est obligé de preter le focus aux un et aux autres pour les redessiner, les faire réagir... (faites le test avec un Spy++)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
180
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
22 novembre 2013

ce que je comprends pas c'est que lorsque le focus s'est mis sur le commandbutton, si j'appuie de nouveau sur 'enter', il lance la procédure du commandbutton (alors que logiquement elle se fait avec le click de souris...)

bizare!
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
salut,
bon c'est un peu bidouille mais çà marche ^^

Private Sub ListBox1_Change()
    TextBox1.SetFocus
End Sub

ps : RenField, on obtient tout de même des handles valides avec GetFocus ;)
Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
euh... c'est tout a fait normal ca ...

le Click se déclenche sur diverses actions

Enter (si bouton par défaut ou focus)
Espace (si focus)
Click souris
Alt + Lettre du raccourci  (exemple  "Sauvegarder &tout" ; ici Alt + T)

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
oui, GetFocus... le controle actifest une vraie fenetre, mais une fois qu'il perds le focus, ca semble ne plus en etre une.

c'est pas clair cette histoire de controles, y'a un truc, je ne sais pas quoi, mais c'est louche... ca doit avec des raisons historiques, j'imagine...

a voir, surtout que ca doit etre mentionné a peu pres partout sur le web ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
180
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
22 novembre 2013

Merci pour votre aide!

concernant le
Private Sub ListBox1_Change()
    TextBox1.SetFocus
End Sub
 
j'ai essayé mais ça ne change rien...  il se met toujours sur le bouton...
j'ai essayer de retirer ce commandbutton pour voir si c'est juste lui qui pose probleme, mais non, si je le retire le focus se place sur un autre commadbutton...

comprend pas!

je vais abandonner l'idée du focus je crois!
Messages postés
180
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
22 novembre 2013

j'ai trouvé une solution (sais pas si c'est ce qu'il y a de mieux...)

je met la propriété tabstop de mes objets en false

vous y voyez un probleme de pratiquer de cette manière?

merci pour votre aide,

si vous me dite qu'il vaut mieux les laisser en 'true', je cogiterai pour jouer avec l'evenement 'exit'...
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Pour perdre le focus, j' ai testé ceci:

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
 Static compteur As Integer If compteur 3 Then MaBool True If MaBool False Then Cancel True
  compteur = compteur + 1
 
End Sub

Au 4 ième Enter, le focus passe au CommandButton.
<hr />
... Y'en a même qui disent qu'ils l'ont vu voler.
<hr />
/PRE>
Messages postés
180
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
22 novembre 2013

Merci!!!!
Messages postés
180
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
22 novembre 2013

Je prefere ne pas perdre le focus, en effet, je ne sais pas à l'avance combien d'articles vont être encodé...

Encore merci pour votre aide!
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
le compteur, et donc le fait de compter n' est qu' à exemple.
Tu peux choisir un autre ceritère.A toi de voir quand tu estimeras que la saisie estt terminée.

Bonne continuation.

<hr />
... Y'en a même qui disent qu'ils l'ont vu voler.
<hr />
/PRE>
Messages postés
7
Date d'inscription
samedi 15 novembre 2003
Statut
Membre
Dernière intervention
14 avril 2009

Salut,

G galéré un bon petit moment car j'avais le meme pb, et j'ai fini pas trouver. Pour ceux qui songeait à un bug ... yen a pas ... C logique.

Donc le truc c juste de savoir qu'il n'est pas possible de passer le focus a qq1 qui la deja !!!

 Voila pkoi ca, ca marche !
Private Sub ListBox1_Change()
    TextBox1.SetFocus
End Sub

et pkoi ca, ca ne marche pas !

Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
   
    If KeyCode = vbKeyReturn Then
......
    TextBox3.Value = ""
    TextBox3.SetFocus 'Donne le focus a la textbox1 QUI LA DEJA DONC NEST PAS PRIS EN COMPTE !!!
    End If
End Sub
=> et par consequent passe le focus au lindice tab suivant à la sortie de levenement du controle.

Des fois que qq1 galere encore la dessus.

BYE