Macro pour fichier de stock

Fermé
Matt 666 Messages postés 38 Date d'inscription jeudi 7 mars 2013 Statut Membre Dernière intervention 28 octobre 2020 - 19 mai 2020 à 17:48
Matt 666 Messages postés 38 Date d'inscription jeudi 7 mars 2013 Statut Membre Dernière intervention 28 octobre 2020 - 20 mai 2020 à 09:06
Bonjour à tous,

Je me permets de revenir vers vous (ça faisait longtemps !), j'ai un problème sur une macro Excel de fichier de stock courant. Il fonctionne très bien en soi, mais c'est plutôt la fonction de suppression de ligne ou de colonne qui merde si la macro est en route. En gros si j'essaie de supprimer une ligne, Excel supprime cette ligne ET celle d'en dessous, systématiquement.

Vous me direz, ya qu'à mettre la macro en pause et supprimer les lignes ou colonnes, mais ça peut devenir très vite chronophage, et j'aimerais bien savoir d'où vient ce maudit problème !!


A propos : Lorsque le magasinier reçoit des panneaux (l'exemple en PJ), admettons la ligne 4 : Méla 8mm, Il rentre la quantité de panneaux dans la colonne F et la macro ajoute cette quantité à la colonne H et M. S'il sort une matière c'est pareil, sauf que c'est une soustraction et un décalage de colonne. Colonne I K et M.

Voici la salve de questions :
1- La macro est insérée dans chaque feuille. Je ne sais pas si c'est une bonne idée, en tout cas ça fonctionne. C'est exactement la même macro pour toutes les feuilles.


2- J'ai mis en place une gestion des erreurs pour éviter que Excel plante si on supprime un ligne ou colonne. Ca a le mérite de ne plus planter mais ça apporte le bug décrit plus haut : Supprimer la ligne et celle d'en dessous pour le cas d'une suppression de ligne.

3- Voici la macro en question. Dites-moi si j'ai merdé qqpart. C'est complètement possible vu mon maigre niveau en Vbe.
Sub Worksheet_Change(ByVal Target As Range)

On Error Resume Next

'gestion des erreurs
Application.EnableEvents = False
Application.Calculation = xlCalculationManual

'cellule remplie dans la colonne E ou H
If Not Intersect(Target, Range("F:F, I:I")) Is Nothing Then

Dim Total As Single

'enregistrer la valeur
Total = Target(1, 3).Value

'valeur différente de 0 et numérique
If IsNumeric(Target) _
And Not Target.Value = 0 Then
'Remplir la cellule stock
Target(1, 3).Value = Total + Target.Value
'Remplir la cellule date
Target(1, 2) = Now
'Effacer la valeur rentrée
Target.Value = ""
End If

End If

'gestion des erreurs
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic

End Sub


Le fichier est en PJ ici, pour vous faire une idée.
https://www.cjoint.com/c/JEtpV0dQgCf

Tous les conseils sont bons, n'hésitez pas.
Merci !
Matt.

Configuration: Windows / Firefox 77.0
A voir également:

3 réponses

ALS35 Messages postés 1033 Date d'inscription jeudi 18 juillet 2019 Statut Membre Dernière intervention 9 janvier 2024 139
19 mai 2020 à 21:43
Bonjour,

Le problème vient du fait que lorsque tu supprimes une ligne, la suivante est sélectionnée et ta procédure telle quelle est faite efface les données de la sélection.

Remplace
Target.Value = ""

par
If Target.Count = 1 Then Target.Value = ""

Cela peut solutionner ton problème

Cordialement
0
Matt 666 Messages postés 38 Date d'inscription jeudi 7 mars 2013 Statut Membre Dernière intervention 28 octobre 2020
20 mai 2020 à 08:56
Bonjour ALS35,
Déjà gros merci pour avoir répondu si rapidement.

Super ça fonctionne... Presque !

La suppression d'une ligne complète n'entraine plus de suppression de la ligne d'en dessous en plus de la ligne à supprimer, c'est déjà super.

Maintenant la suppression de la ligne entraine le remplacement ou l'insertion de la date dans la cellule de la ligne d'en dessous, en colonne B.
Par exemple je compte supprimer la ligne 31. Pour info la cellule sélectionnée dans l'image "Noir" est en colonne B. C'est celle qui va être remplacée par la date.

Voici ce que ça donne après la suppression :

La ligne a bien été supprimée, celle d'en dessous n'a pas été supprimée aussi, mais la cellul B31 a été modifiée par la date.

Alors je me doute bien que c'est la ligne
Target(1, 2) = Now
qui est mise en cause. J'ai essayé 2 ou 3 trucs mais ça ne fonctionne pas. Des idées ?
0
ALS35 Messages postés 1033 Date d'inscription jeudi 18 juillet 2019 Statut Membre Dernière intervention 9 janvier 2024 139
20 mai 2020 à 09:05
Bonjour,

C'est toujours le même problème, alors modifie ton code comme ceci pour ne faire les actions que si une seule cellule est sélectionnée (au lieu de la ligne entière)

    'Si la sélection ne comporte qu'une seule cellule
    If Target.Count = 1 Then
        'valeur différente de 0 et numérique
        If IsNumeric(Target) _
        And Not Target.Value = 0 Then
          'Remplir la cellule stock
          Target(1, 3).Value = Total + Target.Value
          'Remplir la cellule date
          Target(1, 2) = Now
          'Effacer la valeur rentrée
          Target.Value = ""
        End If
    End If


Cordialement
0
Matt 666 Messages postés 38 Date d'inscription jeudi 7 mars 2013 Statut Membre Dernière intervention 28 octobre 2020
20 mai 2020 à 09:06
Bon en fait j'ai trouvé (enfin je pense) !
J'ai enlevé la condition
Not Target.Value = 0
en début de code, et ça fonctionne.
Merci à vous, ça me sauve la vie !
0