Garder le focus sur une TextBox dans VBA.

Eywa Messages postés 12 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 26 janvier 2010 - 19 janv. 2010 à 17:43
Eywa Messages postés 12 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 26 janvier 2010 - 20 janv. 2010 à 15:25
Bonjour,

Je travaille actuellement sur un projet de gestion de stock à l'aide d'un lecteur code barre.

Le principe est le suivant:

Lorsque je désire sortir un ou plusieurs articles du stock, clic droit n'importe où dans la feuille Excel, sortir du stock. À ce moment là, un UserForm apparaît avec le focus sur la TextBox. Muni du lecteur code barre, je scanne le premier article qui est directerment transféré dans une cellule et s'efface de la TextBox. Cependant, lorsque je désire scanner le deuxième article, au lieu de maintenir le focus sur la TextBox, le focus passe sur le bouton ok et me ferme le UserForm.

Pour maintenir le focus dans la TextBox j'ai essayé la fonction suivante:

[i]Private Sub Barcode_box_Exit(ByVal Cancel As MSForms.ReturnBoolean)


Program.TreatCodeReaded
If Barcode_box.Value "" Then Cancel True

End Sub/i

Le focus reste alors sur la TextBox, je peux donc scanner plusieurs articles, mais lors de la fin du scann, il est impossible de cliquer sur OK ou Annuler,les deux boutons sont bloqués.

Pourriez-vous m'aider à garder le focus puis en fin de scann à valider OK ou Annuler?

Merci de votre aide

24 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
19 janv. 2010 à 17:49
Boinjour,

Ce seraitr plutôt le code du bouton OK, qu'il faudrait nous montrer !
Et également celui qui s'exécute au scan (celui qui efface la textbox et qui écrit dans la cellule)
Modifier la cause serait plus orthodoxe que faire (toujours possible mais relevant de la bidouille) , un tour de passe-passe utilisant une booléenne


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Eywa Messages postés 12 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 26 janvier 2010
19 janv. 2010 à 17:58
Bonjour,

Voilà le détail que vous demandez, cependant, il n'y a rien de très recherché dans le bouton OK:




[i]Sub OKFromMaboite()
Unload Maboite1
End Sub/i

Concernant le code relatif au scanne, le voici:




[i]Sub TreatCodeReaded()
Dim sCodeReaded As String
Dim sGlobalCode As String

sCodeReaded Maboite1.Barcode_box.Text sGlobalCode Sheets(sSheetName4CodeBar).Range("GlobalReadedCode").Text

If sCodeReaded <> "" Then

If sGlobalCode <> "" Then

Range("GlobalReadedCode").Clear
sGlobalCode = sCodeReaded

Else

sGlobalCode = sCodeReaded

End If

Sheets(sSheetName4CodeBar).Range("GlobalReadedCode").FormulaR1C1 = sGlobalCode
Maboite1.Barcode_box.Text = ""

End If

End Sub/i

Merci pour l'aide, je débute...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 janv. 2010 à 18:08
Cela ne nous dit rien si tu ne nous montres pas où et comment sont lancées ces deux procédures (OKFromMaboite et TreatCodeReaded) !


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Eywa Messages postés 12 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 26 janvier 2010
19 janv. 2010 à 18:29
Je serai prêt à envoyer le fichier, aurais-tu une méthode pour qu'il te soit accèsible?
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
19 janv. 2010 à 18:43
Ce n'est pas du fichier (je n'ouvre d'ailleurs personnellement jamais un xls non écrit par moi) dont nous avons besoin, mais de ce que je t'ai demandé .


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Eywa Messages postés 12 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 26 janvier 2010
19 janv. 2010 à 19:37
Je vais essayer d'être plus clair.

Mon répertoire Excel contient trois onglets :

Onglet 1 : Artikel_Standardtabelle (sSheetName4Artikel)
Onglet 2 : Barcode (sSheetName4CodeBar)
Onlget 3 : EAN13 (sSheetName4EAN13)

L'onglet 2 et l'onglet 3 sont inaccessibles à l'utilisateur, il ne peut que travailler dans l'onglet 1 qui contient la description de chaque article en stock (ref, quantités etc.).

Si l'utilisateur désire sortir n pièces de son stock, clic droit n'importe ou dans l'onglet 1, Artikenl(n) herausnehmen (Sortir un ou des articles). À ce moment là le code suivant démarre :

[i]Sub Artikelherausnehmen()

Sheets(sSheetName4CodeBar).Range("A2:A1000").FormulaR1C1 = ""
Load Maboite1
Maboite1.Show 0

End Sub/i
Le UserForm Maboite1 s'affiche. Il contient :

- Un bouton Ok (OKFromMaboite)

[i]Sub OKFromMaboite()
Unload Maboite1
MsgBox "Vous avez scanné un total de & sRowPos "
End Sub/i
- Un bouton Annuler (CancelFromMaboite)

[i]Sub CancelFromMaboite()
Unload Maboite1
Sheets(sSheetName4CodeBar).Range("A2:A1000").FormulaR1C1 = ""
End Sub/i
- Une TextBox (Barcode_box)

Les pièces à sortir du stock sont prêtes à être scannées. À l'aide du lecteur code barre on scanne. Dès que le code barre est lu, la procédure TreatCodeReaded démarre.

Le code barre lu est transféré dans la TextBox puis directement dans une cellule excel nommé GlobalReadedCode. Après le scann du premier code barre, la TextBox se vide et est prête à recevoir un nouveau code barre.

On répète le scann suivant le nombre d'article désiré.

Le Focus est maintenu sur la TextBox grâce au booléen, mais les boutons Ok et Annuler sont inaccesibles. Comment faire pour qu'il redevienne accessible tout en supprimant le bouléen ?

Merci?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 janv. 2010 à 20:13
Désolé, mais tu nous dis là ce que tu constates, non ce qui déclenche et comment ...
nous ne pouvons rien faire avec cela !
- Comment (par quel code exact) est déclenchée la procédure TreatCodeReaded ?
- l'examen de la procédure concernée (TreatCodeReaded) montre que la variable booléenne (alors que définie en String !) sCodeReaded prend une valeur True ou False, selon le cas
pour mémoire :
sCodeReaded Maboite1.Barcode_box.Text sGlobalCode Sheets(sSheetName4CodeBar).Range("GlobalReadedCode").Text 

fait que sCodeReaded ne peut retourner que True ou False
or (ligne suivante) : on lit ensuite :
If sCodeReaded <> "" Then ' quésako, puisque forcément True ou False ?

If sGlobalCode <> "" Then ' (tiens ! et d'où cette variable tiendrait-elle une valeur ? du néant ? comme elle est de type string, elle est donc forcément = "" et on passe donc forcément au as Else !)

- nous voilà donc à tous coup dans le else, qui dit :
sGlobalCode = sCodeReaded 

Or sCodeReaded ne peut qu'être True ou False (booléenne) !
comment alors sGlobalCode (une string) pourrait-elle être une booléenne ?>> mystère !
Nous lisons ensuite :
Sheets(sSheetName4CodeBar).Range("Globalement").FormulaR1C1 = sGlobalCode
Maboite1.Barcode_box.Text = ""

qui veut dire ceci : on confère à la plage nommée Globalement une formule qui serait sGlobalCode (une string qui, comme nous l'avons vu plus haut, est égale à ... une booléenne - sCodeReaded - ... faut le faire !)
etc... etc...
Et nous ne voyons nulle part ton mécanisme, ni de pensée, ni autre ... et encore moins ce qui provoquerait le click sur ton bouton OK !
Conclusion : c'est vraiment du n'importe quoi, là ...
Impossible de t'aider valablement dans de telles conditions, même avec la meilleure volonté du monde
Désolé, mais je compatyis et ... fuis ...
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 janv. 2010 à 20:30
sans compter que cette seule ligne
sCodeReaded Maboite1.Barcode_box.Text sGlobalCode Sheets(sSheetName4CodeBar).Range("GlobalReadedCode").Text 

déclenche forcément (dès l'éditeur) une erreur immédiatement dénoncée !
Je veux alors supposer que tu n'as même pas pris le soin de faire un copier/coller de ton vrai code ...
Ce n'est pas sérieux !
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 janv. 2010 à 20:34
Il y a probablement un : qui manque ... un :, ce n'est rien ? Ah... !
Reviens avec ton vrai code et les vraies réponses aux vraies questions, s'il te plait ...


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
19 janv. 2010 à 23:44
Salut,
Gardes ta booléenne.Il faudra juste savoir cpmment l' exploiter.
Au départ elle est à False.

Dans l' événement Barcode_box_GotFocus elle est à False.
Dans l' evenement OKFromMaboite_MouseMove et
CancelFromMaboite_MouseMove, elle devienne True.
Dans l' évenement Barcode_box_LostFocus, tu testes :
Si elle est false, tu restes sur le Barcode_box, sinon ,
Sub CancelFromMaboite() et Sub OKFromMaboite
s' éxécuteront sans aucun problème puisque avant même que le Barcode_box ne perde le focus, la booléeenne est mise à true suite au survole de l' un ou de l' autre des 2 bouttons.

Mais ça, c' est juste de la théorie.Je ne sais pas ce que cela donnera en pratique.
A toi de tester.


[] Ce qui va sans dire. va mieux en le disant.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 janv. 2010 à 09:33
Bon...
On reprend tout et on essaye de voir ce qui se passe (ce qui est fait) :
1)
Lorsque je désire sortir un ou plusieurs articles du stock, clic droit n'importe où dans la feuille Excel, sortir du stock. À ce moment là, un UserForm apparaît avec le focus sur la TextBox


Si l�utilisateur désire sortir n pièces de son stock, clic droit n�importe ou dans l�onglet 1, Artikenl(n) herausnehmen (Sortir un ou des articles). À ce moment là le code suivant démarre :


Sub Artikelherausnehmen()

  Sheets(sSheetName4CodeBar).Range("A2:A1000").FormulaR1C1 = ""
  Load Maboite1
  Maboite1.Show 0

End Sub 


ce qu'il nous faut savoir dans un premier temps, c'est très quel code estr exécuté à ce fameux click droit, autrement dit : où est le code qui appelle Artikelherausnehmen lors du clic droit ?

2)
Les pièces à sortir du stock sont prêtes à être scannées. À l�aide du lecteur code barre on scanne. Dès que le code barre est lu, la procédure TreatCodeReaded démarre.

Le code barre lu est transféré dans la TextBox puis directement dans une cellule excel nommé GlobalReadedCode. Après le scann du premier code barre, la TextBox se vide et est prête à recevoir un nouveau code barre.

je suppose qu'intervient alors l'évènement
Private Sub Barcode_box_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Program.TreatCodeReaded
  If Barcode_box.Value "" Then Cancel True
End Sub 

qui exécute :
Sub TreatCodeReaded()
  Dim sCodeReaded As String
  Dim sGlobalCode As String
  sCodeReaded Maboite1.Barcode_box.Text sGlobalCode Sheets(sSheetName4CodeBar).Range("GlobalReadedCode").Text 'oùil doit mpanque un : entre .Text et sGlobalCode :
  If sCodeReaded <> "" Then
    If sGlobalCode <> "" Then
       Range("GlobalReadedCode").Clear
       sGlobalCode = sCodeReaded
    Else
      sGlobalCode = sCodeReaded
    End If 
    Sheets(sSheetName4CodeBar).Range("GlobalReadedCode").FormulaR1C1 = sGlobalCode
    Maboite1.Barcode_box.Text = ""
  End If
End Sub 

Qui/quoi décide de lancer Barcode_box_Exit ? (on ne le voit pas...) Est-ce ton lecteur qui le fait spontanément ? ou est-ce un évènement généré par l'utilisateur, qui sort de la textbox
pour se placer ailleurs (et sur quoi) ?

Voilà ! commence par répondre, dans l'ordre, à ces deux questions, s'il te plait, de sorte à ce que nous ayons une meilleure vision du mécanisme présent
__________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Eywa Messages postés 12 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 26 janvier 2010
20 janv. 2010 à 10:15
Merci de prendre de ton temps pour essayer de ma dépanner. Je te rapelle que je débute, c'est le premier programme que j'écris, merci d'être compréhensif...

1. Le code exécuté lors du clic droit est le suivant:

Sub CreateNewRightClicMenus()
Dim z As Integer

'Efface tous les boutons de la souris
For z =  1 To CommandBars("Cell").Controls.Count
    With CommandBars("Cell")
        .Controls(z).Visible = False
    End With
Next

'Créer un bouton Sortir article(s)
With Application.CommandBars("Cell").Controls.Add(msoControlButton)
    .Caption = "Artikel(n) herausnehmen"
    .BeginGroup = True
    .OnAction =  "Artikelherausnehmen" 
End With

End sub


Après ce clic, tu le cites bien, le partie de code suivante se lance:

Sub Artikelherausnehmen()

  Sheets(sSheetName4CodeBar).Range("A2:A1000").FormulaR1C1  = ""
  Load Maboite1
  Maboite1.Show 0

End Sub 


2. Pour répondre à cette question, c'est effectivement un appui sur la gachette du lecteur code barre qui lance Barcode_box_Exit.

Private Sub Barcode_box_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Program.TreatCodeReaded
  If Barcode_box.Value "" Then Cancel True
End Sub 


qui exécute :

Sub TreatCodeReaded()

  Dim sCodeReaded As String
  Dim sGlobalCode As String

  sCodeReaded = Maboite1.Barcode_box.Text 
  sGlobalCode = Sheets(sSheetName4CodeBar).Range("GlobalReadedCode").Text 

  If sCodeReaded <> "" Then
    If sGlobalCode <> "" Then
       Range("GlobalReadedCode").Clear
       sGlobalCode = sCodeReaded
    Else
      sGlobalCode = sCodeReaded
    End If 
    Sheets(sSheetName4CodeBar).Range("GlobalReadedCode").FormulaR1C1 = sGlobalCode
    Maboite1.Barcode_box.Text = ""
  End If
End Sub 


Merci...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 janv. 2010 à 11:31
c'est effectivement un appui sur la gachette du lecteur code barre qui lance Barcode_box_Exit


Que voilà ,une mauvaise nouvelle ! Tu es donc intégralement dépendant de ce que décide ton lecteur !

Bon ! on va alors essayer de bidouiller :

Sub TreatCodeReaded()

  Dim sCodeReaded As String
  Dim sGlobalCode As String

  sCodeReaded = Maboite1.Barcode_box.Text 
  sGlobalCode = Sheets(sSheetName4CodeBar).Range("GlobalReadedCode").Text 

  If sCodeReaded <> "" Then
    If sGlobalCode <> "" Then
       Range("GlobalReadedCode").Clear
       sGlobalCode = sCodeReaded
    Else
      sGlobalCode = sCodeReaded
    End If 
    Sheets(sSheetName4CodeBar).Range("GlobalReadedCode").FormulaR1C1 = sGlobalCode
    repo = MsgBox("veux-tu continuer à scannber ?", vbYesNo)
    If repo vbYes Then  Maboite1.Barcode_box.Text ""
  End If
End Sub


Mais cela va t(obliger à cliquer ouyi ou non sur ta msgbox entre chaque article, bien sur
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Eywa Messages postés 12 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 26 janvier 2010
20 janv. 2010 à 11:42
Mais cela va t'obliger à cliquer oui ou non sur ta msgbox entre chaque article

C'est justement ce que je ne veux pas. Une fois que la procédure de scann est lancée, l'utilisateur se ballade dans le stock et scanne tous les articles qu'il veut sortir. De plus, intégrer une Vbyesno n'arrange rien au bouton OK et Annuler du UserForm qui sont encore bloqués. Finalement intégrer la MsgBox me fait carrément perdre le focus après avoir cliquer sur Yes, contrairement à avant où le focus restait dans la TextBox tout en bloquant les deux boutons.

Comment faire?
0
Eywa Messages postés 12 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 26 janvier 2010
20 janv. 2010 à 11:43
Un appui sur la gachette du lecteur code barre est similaire à une pression sur la touche entrer du clavier.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 janv. 2010 à 11:48
Dur dur ...
Dids-moi : arrives-tu présentement (essaye) à écrire dans la textbox manuellement ? Si oui : on a une chance...


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Eywa Messages postés 12 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 26 janvier 2010
20 janv. 2010 à 12:52
Oui j'y arrive, je peux soit utiliser le lecteur code barre, soit entrer un nombre manuellement et taper entrer pour qu'il soit transféré dans la cellule excel et effacé de la TextBox.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 janv. 2010 à 14:06
Alors quand tu veux quitter et avoir accès à ton boyutonb OK :
Frappes simplement un " " (un espace)
et modifie ainsi :

Private Sub Barcode_box_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  if Barcode_box.value <> " " then Program.TreatCodeReaded
  If Barcode_box.Value "" Then Cancel True
End Sub 

C'est du rafistolage, mais je pense que cela fonctionnera ...
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 janv. 2010 à 14:54
Ou encore mieux : à essayer si répond à l'évènement KeyPress (on ne sait pas vraiment ce qu'est en effet ta "textbox") :
Private Sub Barcode_box_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  if Barcode_box.value <> " " then Program.TreatCodeReaded
  If Barcode_box.Value "" Then Cancel True
End Sub

Private Sub Barcode_box_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If KeyAscii 27 Then Barcode_box " " : OKFromMaboite.SetFocus
End Sub

Et il devrait alors te suffire de frapper la touche escape dans ta textbox pour atteindre ton bouton OK. Essaye ! on ne sait jamais ...

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Eywa Messages postés 12 Date d'inscription mardi 19 janvier 2010 Statut Membre Dernière intervention 26 janvier 2010
20 janv. 2010 à 15:00
Rien ne se passe, toujours le même résultat.
0
Rejoignez-nous