Gestion de stock avec douchette (multiples commandes)

Bonjour, Je viens de commencer en VBA sur excel, et je n'arrive pas à me dépatouiller.

Je fais une gestion de stock par excel avec douchette. (sujet mainte fois posté, mais pas adaptés à mon fonctionnement)

Je veux gérer des doubles clics (scans) avec la douchette, mais je ne trouve pas la bonne solution. pouvez vous m'aider?

Fonctionnement.

J'ai un tableau magasin, et un mouvement (bdd)

Lorsque je scan une ref:

1 clic --> -1 sur la référence scannée dans bdd, (répercussion dans le magasin)

2 clics --> ouverture d'un userform pour remplissage manuel en fonction de la ref scannée

3 clics (si possible) --> suppression de la ligne précédente

(ça fonctionne pour le 1 clic, pas pour le reste)

Au niveau des double commande, j'aimerais capter le nombre de fois ou la douchette scan une référence en un certain temps : Délai = 0,5s si 1 scan --> 1 clic, 2 scans-->2, etc.

Cela me permettrait d'être très autonome avec la douchette.

Fichier en pj

Cordialement

Bonjour,

c'est quoi 3 clics, 3 fois le même code article ?

Avec Ontime() qui ne connait que la seconde il faudra séparer tes scans d'au moins 2 secondes en marche normale.

Ca va te ralentir sans compter les erreurs à reprendre si tu es trop rapide.

Tu ne peux pas te créer 2 codes spéciaux collés sur un carton pour embrayer vers tes traitements particuliers pour le dernier scan enregistré ?

eric

Bonjour,

En effet, 3 clics correspondent à 3 scans d'un même code article dans le délai imparti.

Si je fonctionne avec des codes spécifiques (remplissage manuel / suppression de la dernière ligne), le code article ne sera rempli automatiquement dans mon userform.

Si j'ai bien compris, vous me conseillez de faire le système suivant?

1//

>Je scan le code "rempm" (en code 128)

>A cette action, la ligne userform.show 0 m'affiche le userform

>Saisi scan du code article ciblé (dois je coder la cellule label "code" du userform?)

>Affichage de la désignation article

>Incrémentation de la quantité en mouvement (via le spin button), ou en saisi manuelle dans la cellule (est-ce possible)

>Bouton valider qui créer la ligne de mouvement dans la bdd et ferme le userform

2//

>Je scan le code "suppr" (en code 128)

>suppression de la dernière ligne

De cette manière là?

Merci pour votre aide, et votre réactivité!

Si je fonctionne avec des codes spécifiques (remplissage manuel / suppression de la dernière ligne), le code article ne sera rempli automatiquement dans mon userform.

je te propose de t'imprimer 2 codes barre, un 'supprimer' et un autre 'manuel'

Tu scannes ton code article et si ensuite tu scannes 'supprimer' tu supprimes la dernière entrée.

Même principe pour 'manuel', ton dernier code est en dernière ligne, tu ouvres ton UF avec ce code.

Tous les autres tu les traites normalement

Ok, merci

Je reviens vers vous (toi?) une fois effectué.

Il y a t-il une erreur?

Mes conditions ne fonctionnent pas

If Not Intersect(Target, [Douchette]) Is Nothing Then    ' saisie douchette
           derlig = Cells(Rows.Count, 1).End(xlUp).Row

            Cells(derlig + 1, "B") = [Douchette]  ' copie du code barre en fin de colonne A
            Cells(derlig + 1, "C") = -1    ' Décrémentation stock 1 un
            Cells(derlig + 1, "A") = Now
            Application.Wait Now + TimeValue("0:00:01")
            [Douchette].Select    ' sélectionner saisie douchette
            [Douchette].ClearContents    ' vider cellule douchette

         If Cells(derlig, "B") = "Rempm" Then
            Rempm.Show 0
            Rows(derlig).Delete ' supression de la dernière ligne du tableau
            [Douchette].Select    ' sélectionner saisie douchette
            [Douchette].ClearContents    ' vider cellule douchette

         ElseIf Cells(derlig, "B") = "Suppr" Then
            Rows(derlig).Delete ' supression de la dernière ligne du tableau
            Rows(derlig).Delete ' supression de la dernière ligne du tableau
            [Douchette].Select    ' sélectionner saisie douchette
            [Douchette].ClearContents    ' vider cellule douchette
         End If
    End If

Ca ne sert à rien de l'inscrire pour l'effacer ensuite.

J'aurais plutôt fait un truc de ce style :

    If Not Intersect(Target, [Douchette]) Is Nothing Then    ' saisie douchette
        derlig = Cells(Rows.Count, 1).End(xlUp).Row
        Select Case [Douchette].Value
        Case "Suppr"
            Rows(derlig).Delete    ' supression de la dernière ligne du tableau
        Case "Rempm"
            Rempm.Show 0
        Case Else
            Cells(derlig + 1, "B") = [Douchette]  ' copie du code barre en fin de colonne A
            Cells(derlig + 1, "C") = -1   ' Décrémentation stock 1 un
            Cells(derlig + 1, "A") = Now
        End Select
        [Douchette].Select       ' sélectionner saisie douchette
        [Douchette].ClearContents       ' vider cellule douchette
    End If

Ah, je ne connaissais pas encore : case.

En effet, c'est plus épuré, cependant la macro ne répond toujours pas. Si j’enlève toutes les conditions, c'est à dire :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim derlig As Long
    Dim douche As Integer
    Dim s, p As Variant
    If Target.Cells.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    If Not Intersect(Target, [Douchette]) Is Nothing Then    ' saisie douchette

        derlig = Cells(Rows.Count, 1).End(xlUp).Row
        Cells(derlig + 1, "B") = [Douchette]    ' copie du code barre en fin de colonne A
        Cells(derlig + 1, "C") = -1    ' Décrémentation stock 1 un
        Cells(derlig + 1, "A") = Now
        [Douchette].Select    ' sélectionner saisie douchette
        [Douchette].ClearContents    ' vider cellule douchette

    End If
    Application.EnableEvents = True
End Sub

La macro répond

Par contre pour ce code :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim derlig As Long
    Dim douche As Integer
    Dim s, p As Variant
    If Target.Cells.Count > 1 Then Exit Sub
    Application.EnableEvents = False
       If Not Intersect(Target, [Douchette]) Is Nothing Then    ' saisie douchette

       derlig = Cells(Rows.Count, 1).End(xlUp).Row
        Select Case [Douchette].Value
        Case "Suppr"
            Rows(derlig).Delete    ' supression de la dernière ligne du tableau
        Case "rempm"
            Rempm.Show 0
        Case Else
            Cells(derlig + 1, "B") = [Douchette]  ' copie du code barre en fin de colonne A
            Cells(derlig + 1, "C") = -1   ' Décrémentation stock 1 un
            Cells(derlig + 1, "A") = Now
        End Select
        [Douchette].Select       ' sélectionner saisie douchette
        [Douchette].ClearContents       ' vider cellule douchette
   End If
    Application.EnableEvents = True
End Sub

La macro ne répond pas : le scan dépose la référence scannée en B1, et passe à la ligne.

tu mets un Stop en début de macro et tu fais en pas à pas avec F8 en contrôlant tes variables au fur et à mesure (amener le curseur dessus pour voir leur valeur ou utiliser la fenêtre Espion) pour voir le pourquoi.

Ou bien tu as planté au cours de tes tests et tu n'as pas emmené le curseur en bas de ta macro pour rétablir les événements.

Rajoute-toi une petite macro pour ça :

Sub reinit()
    Application.EnableEvents = True
End Sub

tu peux aussi utiliser une variable pour effectuer ou non la suite de la macro sans désactiver les événements

Dim noEvents As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ceci_cela As Long
    If noEvents Then Exit Sub ' si on ne veut pas traiter on sort tout de suite
    ' blablabla
    noEvents = True ' on ne veux pas traiter les événements Change qui vont arriver
    Cells(derlig + 1, "B") = [Douchette]
    Cells(derlig + 1, "C") = -1
    noEvents = False ' on les traite à nouveau
End Sub

normalement on met Public noEvents As Boolean dans un module Standard mais comme là tu restes toujours dans le même module

Tu avais raison, j'ai redémarré mon PC et ça fonctionne, merci.

Maintenant je m’attelle au Userform et reviens vers toi.

Redémarre un nouveau topic si tu veux que plus de personnes lisent, je ne suis pas toujours là.

Et tu peux mettre celui-ci en résolu.

J'ai l'erreur 1004, lors de l’exécution de Private sub valider_click.

Je me suis renseigné, c'est un souci d'initialisation, mais je ne trouve pas comment faire...

Private Sub Rempm_Initialize()
    Me.codeart = Range(B1)   'charge valeur de B1 dans la tb codeart
    Me.un = Range(D1)        'charge valeur de D1 dans la tb un
    Me.Quantité = Cells(derlig, "C")  'charge valeur de la ligne de la colonne C dans la tb codeart
    Me.Quantité_stocké = Range(C1) 'charge valeur de B1 dans la tb Quantité_stocké
    Me.desart = Range(E1) 'charge valeur de E1 dans la tb desart

End Sub

Private Sub Valider_Click()
 Cells(derlig, "C") = [Quantité]
 Unload Me
End Sub

Je ne sais pas si c'est lié, mais rien ne s’affiche dans mes textbox.

Rempm_Initialize() n'existe pas.

C'est toujours UserForm_Initialize()

Pour les proc événement prend l'habitude de toujours les choisir dans les liste déroulante du haut.

A gauche l'objet, à droite les événements de cet objet.

Tu seras sûr de la déclaration avec en prime les paramètres passés.

Merci beaucoup pour ton aide, ça devrait le faire maintenant.

Rechercher des sujets similaires à "gestion stock douchette multiples commandes"