VBA - saisie d'une zone de texte via un scan (douchette)

Résolu
damedom41 Messages postés 79 Date d'inscription mercredi 14 avril 2010 Statut Membre Dernière intervention 2 août 2014 - 20 avril 2012 à 19:04
damedom41 Messages postés 79 Date d'inscription mercredi 14 avril 2010 Statut Membre Dernière intervention 2 août 2014 - 22 avril 2012 à 20:37
Bonjour,
Je fais sur Access en VBA une sorte de "caisse enregistreuse" pour une épicerie solidaire.
Ils veulent scanner les codes barre en caisse.
Mon formulaire de saisie fonctionne parfaitement si j'utilise une liste déroulante avec Click (pour test existence fichiers etc)
Lorsque je scanne le produit (ou que je fais un copier coller) la zone s'affiche, mais je n'arrive pas à passer à l'enregistrement suivant de façon automatique (sans toucher au clavier ni à la souris). Ca marche si je fais un clic, ou un tab, mais je voudrais qu'ils puissent scanner les produits "à la suite" sans intervention. Peut-on envoyer un code qui simulerait le "click" et renverrait à la procédure évènementielle du OnClick, ou du LostFocus ?

Faut-il que j'abandonne l'idée de liste déroulante (mais pour l'instant j'ai le même problème avec les zones de texte) ?

Ca fait deux jours que je cherche, ils sont pressés de pouvoir utiliser leur logiciel, et je ne trouve pas!!!!!!!!!!!!!!!!


Damedom Sologne

9 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
20 avril 2012 à 19:33
Bonjour,

Je n'y connais pas vraiment grand-chose dans ce domaine, mais je crois savoir que les douchettes agissent comme un clavier et que leur lecture se termine par un retour-charriot.
Il me semble alors que le plus judicieux est de passer par une textbox et son évènement change ===>> lorsque signal retour-charriot reçu ===>> alimentation de la listbox (additem) et effacement du contenu de la textbox (en vue de la prochaine saisie par lecture de la douchette).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 avril 2012 à 19:40
Simulation à partir d'un commanbutton pour simuler comme la douchette
le static n n'est là que pour "créer" différentes lectures et s'y repérer dans la listbox (rien d'autre). La douchette, elle, envoie SA lecture différente seule.
Private Sub CommandButton1_Click()
  Static n As Integer
  n = n + 1
  TextBox1.Text = "lecture " & n
End Sub


Private Sub TextBox1_Change()
 If TextBox1.Text <> "" Then
   ListBox1.AddItem TextBox1.Text
 End If
 TextBox1.Text = ""
End Sub

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
3
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 avril 2012 à 19:15
Bonjour,

As-tu essayé de voir si la touche Entrée est appuyée ?
Événement KeyPress ou approchant.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
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 avril 2012 à 19:49
Et (je viens de tester) :
Si le message de la douchette se termine par un retour chariot ===>>
Private Sub CommandButton1_Click()
  Static n As Integer
  n = n + 1
  TextBox1.Text = "lecture " & n & vbCr
End Sub

Private Sub TextBox1_Change()
 If TextBox1.Text <> "" Then
   ListBox1.AddItem Left(TextBox1.Text, InStr(TextBox1.Text, vbCr) - 1)
 End If
 TextBox1.Text = ""
End Sub


Marche bien.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
damedom41 Messages postés 79 Date d'inscription mercredi 14 avril 2010 Statut Membre Dernière intervention 2 août 2014
22 avril 2012 à 16:04
Merci à vous. Contrairement au copier-coller (avec lequel je faisais mes essais pensant que ça fonctionnait pareil) la douchette envoie un "enter". Comme je saisis le scan dans une liste déroulante, j'ai ajouté un sendkeys ("{tab}") et, si mon produit est testé ok, je passe maintenant directement à l'enregistrement suivant. Ouf. Et merci encore.

Damedom Sologne
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 avril 2012 à 18:04
Bien
Mais toutefois le SendKeys te jouera des tours si tu installes ton produit sur Win 7 !
Vaut mieux donner le focus à une textbox et utiliser le code que je t'ai montré.
(car alors pas de sendkeys nécessaire).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
damedom41 Messages postés 79 Date d'inscription mercredi 14 avril 2010 Statut Membre Dernière intervention 2 août 2014
22 avril 2012 à 19:14
Merci, je ne savais pas.
Je suis bien ennuyée car je ne veux pas alimenter une list box, mais une zone de formulaire en mode feuille de données, et je veux qu'il aille (si tout va bien) à l'enregistrement suivant, et je ne veux pas que le code aille alimenter ma liste déroulante, mais directement le fichier sous-jacent.
Je vais essayer ta solution dans ma configuration. Elle fonctionne dans ton exemple (j'ai essayé, bien sûr, pour m'en souvenir ensuite) mais là, c'est dimanche d'élections, et je me sens plus citoyenne qu'informaticienne. Mais dès demain, j'essaie d'adapter ta solution à mon problème, et reviens vers toi pour te dire si ça marche, ou si j'ai besoin d'une aide supplémentaire.
Je croyais que sendkeys était une idée géniale ... j'avais tort ! Heureusement que vous êtes là !


Damedom Sologne
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 avril 2012 à 20:05
Mais rien ne t'empêche d'alimenter directement une feuille Excel au lieu de la listbox !
Il te suffit de faire l'ajout systématiquement au-dessous de la dernière ligne remplie. Appelons-la derlig.
La N° de la dernière ligne remplie de la colonne A est, par exemple :
derlig = Range("A" & rows.count).End(xlup).row
en conséquence, tu dois faire l'ajout en :
Range("A" & derlig + 1)
au lieu d'écrire dans la listbox par AddItem.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
damedom41 Messages postés 79 Date d'inscription mercredi 14 avril 2010 Statut Membre Dernière intervention 2 août 2014
22 avril 2012 à 20:37
Non je suis sous Access en VBA. J'ai deux tables sur ce formulaire :
une table VENTES qui contient l'entête de la "facture", gérée via un formulaire avec des contrôles indépendants
une table VNTDET qui contient n lignes de produits, gérée via un sous-formulaire qui se branche directement sur la table VNTDET, via un affichage "feuille de données".
Le formulaire VENTES possède les champs pères qui renseignent certaines zones du sous-formulaires (champs fils).
Ce sous-formulaire était alimenté, au niveau du produit, par une liste déroulante qui pointe vers un fichier PRODUI ; mais il existe aussi des "produits de remplacement" non commandés mais parfois livrés, qui ne doivent pas être gérés en stock (c'est une épicerie solidaire).
Sur choix du produit : si le produit n'existe pas dans la table produit, alors voir s'il n'existe pas dans la table "remplacement" (si oui aller chercher la référence 'normale" du code de remplacement) ; on force la quantité à 1, on va chercher le prix de vente unitaire dans le fichier PRODUI, on calcule le montant de la ligne et le montant total au fur et à mesure, car les "acheteurs" ne peuvent dépasser un plafond lié au produit.
Ca marchait très bien avec une liste déroulante et l'évènement sur clic.
Maintenant je dois remplacer ce clic sur une liste déroulante par un scan, et faire la même chose, et je n'arrive pas à passer automatiquement à la ligne suivante si les tests le permettent.
Je pense que, ayant l'habitude de fonctionner directement en VBA où je décide, ou non, de faire un addnew, un update ou un delete, je patauge un peu entre les différents évènements on change, before update, etc ... des contrôles et ceux des formulaires.
Dès demain je reprends mes bouquins, et ne vous sollicite que si je n'y arrive pas.

Merci

Damedom Sologne
0
Rejoignez-nous