Pour ma boite, j'ai besoin, depuis une le scan d'un code barre, d’attribuer des documents de production.
Par contre, pour éviter les erreurs, l'utilisation du lecteur est impérative. Ils n'ont, malheureusement pas tarder à saisir directement le code au clavier...
Format du code barre exemple : DR1111
Par une fonction OnKey, j'inhibe bien des touches, mais je ne trouve pas de solution pour faire la même chose avec les lettres "D ou R", qui me semblai une bonne idée versus le format obtenu par le lecteur, toujours le préfixe DR...
J'ai trouvé aussi un tuto sur l'utilisation d'un timer/macro lancé au début de la saisi, si on utilise un lecteur code barre = ~instantané, au clavier c'est bien plus long = effacement, mais je me suis perdu dans les explications
Merci pour vos solutions, attention, merci d'être explicite, je suis loin d'être un pro !!!
Le pb c'est que ta chaine n'est pas de longueur constante.
Une tentative en ajoutant une tempo timerS pour laisser le temps à d'autres caractères d'arriver, et je récupère le nouveau Texbox1.Text.
Je supprime tous les espaces et la chaine doit respecter DR0000*
Si ça varie de 6 à 7 car. ça doit être jouable. Si c'est 6 à 15 ça risque d'être plus scabreux, si tu allonges trop timerS les saisies au clavier risquent de passer.
Ca dépend donc de la réactivité du scanner. Je pense que ça doit être hyper rapide mais bon...
Pour les tests au clavier j'ai du rallonger t clavier à 1s, et j'ai mis timerS à 0.5
Je pense que tu peux baisser timerS à 0.15 s, voire moins. Régler les 2 tempos avec le scanner.
Par curiosité tu pourras...
Bonjour Phil,
Je verrais tout simplement protéger l'onglet que seul la macro du scan pourrait débloquer.
Sans l'exemple du fichier difficile de faire plus.
Bruno
J'ai trouvé aussi un tuto sur l'utilisation d'un timer/macro lancé au début de la saisi, si on utilise un lecteur code barre = ~instantané, au clavier c'est bien plus long = effacement, mais je me suis perdu dans les explications
Ca peut être intéressant comme technique, tu pourrais mettre le lien et expliquer où tu coinces
Autre idée : donner un code barre assez long à scanner avant le vrai qui lui sera pris en compte.
La fainéantise fera qu'ils en auront marre de devoir saisir 2 codes barre ou même de devoir faire un copié-collé du 1er ;-)
(copié-collé que l'on peut éventuellement bloquer s'ils n'en ont pas besoin par ailleurs)
eric
Le code barre utilisé est généré par notre système, & correspond au nom donné à nos Données de Réglages (DR), depuis bien longtemps. Aucun changement possible.
Pour la solution timer, voici le lien ► Timer. Il s'agit du message N°5 de Graffito.
Ces explications sont bien trop laconiques pour moi.
A noter, je n'utilise pas de TextBox...
J'ai ajouté une version allégée de mon fichier, si besoin...
Merci
Philippe
l'idée n'était pas de modifier tes codes barres, mais leur en donner un sur plaquette style mot de passe bien compliqué à saisir, à scanner avant le vrai. S'ils ont le scanner en main peu de chance qu'ils s’embêtent à saisir le 2nd.
Tant qu'il n'ont pas scanné la plaquette tu n'enregistres pas le scan suivant.
eric
Je vais proposer cette idée, mais, j'appel avec ce fichier des documents pour réaliser une production conforme, & avec un suivi qualité sur des documents dédiés au produit, laisser une faible chance à la production de saisir une information au clavier, donc avec un risque d'erreur, je pense que mon boss me demandera de gratter encore.
Philippe
Un essai basé sur timer.
Il faut saisir un code barre de 6 caractères commençant par "DR" en moins de 0.5 s entre chaque caractère.
J'ai mis 0.5 s que ce soit réalisable avec le clavier. A baisser en testant avec le scanner.
VB:
Private Sub TextBox1_Change()
Static t As Single, noEvents As Boolean
If noEvents Then Exit Sub
If Len(TextBox1.Text) = 1 Then
t = Timer
ElseIf codeBarreOk(TextBox1.Text) Then
'traitement du code barre ok
MsgBox "code barre " & TextBox1.Text & " ok"
noEvents = True
TextBox1.Text = ""
noEvents = False
' suite...
ElseIf Len(TextBox1.Text) > 1 Then
' à partir du 2nd caractère
If Timer - t < 0.5 Then
' temps ok
t = Timer
Else
' trop lent
noEvents = True
TextBox1.Text = ""
noEvents = False
MsgBox "Utiliser le scanner"
End If
End If
End Sub
Private Function codeBarreOk(cb As String) As Boolean
' controle (bidon) du cb
codeBarreOk = Left(cb, 2) = "DR" And (Len(cb) = 6)
End Function
Eric,
Ta solution fonction très bien, par contre, depuis ce code barre, je génère deux liens vers les bons documents, et :
1 - j'ai besoin qu'il reste un temps affiché, pour laisser le temps des deux clics des liens vers les fichiers, pour cela, j'ai masqué les conditions qui vont bien dans ta proposition.
2 - Si possible, recopier le texte obtenu vers ma cellule (E3 onglet "code barre")
3 - Que la zone de texte soit effacée après un temps. Pour l'instant, je laisse 45 secondes avant effacement de la cellule E3, puis, je masque toute la zone... L'outil est utilisé par plusieurs personne, forcer les opérateurs à utiliser "son bon code barre" = bonne production, pas les infos du copain !
4 - Plus simple encore, est-il envisageable d'obtenir la même gymnastique/macro, en utilisant directement la cellule E3 de mon fichier ?
Vite fait sans trop de contrôle, ma fille venant d'accoucher ;-)
Reste affiché jusqu'au prochain clic dessus ou à la sélection de E7 (à voir si ça ne gène pas l'ouverture du lien)
eric
Edit : erreur de fichier (supprimé), voir plus bas
Je regarde rapidement, toutes mes félicitations, laisse tomber l'âne que je suis & passe une bonne soirée avec ta petite famille qui s'agrandit. ☺
Philippe
Merci pour ton temps, la macro marche parfaitement, mais...
Sur la bonne centaine de code barre en stock, j'ai un os sur la condition "codeBarreOk", je souhaiterai la rendre plus "plastique", car j'ai une population très hétérogène de code barre, exemple : DR1234, DR 1234, DR12345, DR 12345, & parfois des espaces devant DR !!!
Es-t'il possible d’écrire simplement "codeBarreOk = plus de trois caractères quelconques" ?
Ou une autre astuce de ton cru.
Si je laisse la condition actuelle, je tronque l'écriture du code barre.
VB:
codeBarreOk = Left(cb, 2) = "DR" And (Len(cb) = 6)
J'obtiens "DR 123", pour "DR 12345"
Je ne parviendrai pas à faire bouger le responsable de cette base, de plus, je ne suis pas à l’abri d'une coquille de sa part.
Le pb c'est que ta chaine n'est pas de longueur constante.
Une tentative en ajoutant une tempo timerS pour laisser le temps à d'autres caractères d'arriver, et je récupère le nouveau Texbox1.Text.
Je supprime tous les espaces et la chaine doit respecter DR0000*
Si ça varie de 6 à 7 car. ça doit être jouable. Si c'est 6 à 15 ça risque d'être plus scabreux, si tu allonges trop timerS les saisies au clavier risquent de passer.
Ca dépend donc de la réactivité du scanner. Je pense que ça doit être hyper rapide mais bon...
Pour les tests au clavier j'ai du rallonger t clavier à 1s, et j'ai mis timerS à 0.5
Je pense que tu peux baisser timerS à 0.15 s, voire moins. Régler les 2 tempos avec le scanner.
Par curiosité tu pourras communiquer les valeurs qui vont bien ?
VB:
Private Function codeBarreOk(ByVal cb As String) As Boolean
' controle (bidon) du cb
timerS 0.5 ' laisse le temps à d'autres caractères d'arriver
cb = Replace(TextBox1.Text, " ", "")
codeBarreOk = cb Like "DR####*"
End Function
Sub timerS(t As Double)
Dim s As Double
s = Timer: Do While Timer < s + t: DoEvents: Loop
End Sub
Pour les essais & retour :
Je ne connais pas la vitesse de rafraîchissement minimale possible pour les deux timers, je suis passé 0.05, ça fonctionne encore avec 20 caractères !
Je pense que c'est le traitement du lecteur + l'ancienne condition "codeBarreOk" qui entraînaient des problèmes, car un "copier/coller", que j'ai tenté avant la dernière version, fonctionnait parfaitement.
xUpsilon, merci pour ta proposition, mais avec le traitement mystérieux du lecteur de code barre, avec ">3", seulement quatre caractères apparaissaient...