Compteur VBA sous certaines conditions
Bonjour à tous,
Je me permets de solliciter votre aide car je suis bloqué depuis plusieurs jours sur une macro VBA.
Je possède actuellement un fichier excel à 5 colonnes du type:
A1: en tête colonne 1 (NOM)
A2:A4000: liste des noms des produits
B1: en tête colonne 2 (TYPE)
B2:B4000: données associées aux produits
C1: en tête colonne 3 (REFERENCE)
C2:C4000: données associées aux produits
D1: en tête colonne 4 (PRIX)
D2:D4000: prix associé a chaque produit
E1: en tête colonne 5 (NOMBRE DE JOURS SANS LE PRODUIT EN STOCK)
E2:E4000: cellules vides pour l'instant
Je souhaiterais réaliser une macro vba qui me permettrais par le biais d'un bouton de compter le nombre de jours ou le produit n'est pas en stock.
Chaque jour, je reporte le prix de chaque produit dans les cellules D2:D4000. Pour chaque produit qui n'est pas en stock j'indique "0" dans la cellule . Enfin, pour chaque produit qui n'est plus en vente j'indique "" dans la cellule .
Je souhaite remplir les valeurs E2:E4000 via un bouton que je presserais chaque jour. La macro associée au bouton serait du type:
Selectionner les cellules égales à 0 sur la plage D2:D4000
décaler la sélection d'une case vers la droite
Ajouter +1 aux valeurs des cellules sélectionnées
pour réaliser une sorte de compteur en gros
puis
Selectionner les cellules égales à un nombre différent de 0 sur la plage D2:D4000
décaler la sélection d'une case vers la droite
écrire 0 dans les cellules sélectionnées
afin de remettre la cellule a zéro
puis
Selectionner les cellules égales à "" sur la plage D2:D4000
décaler la sélection d'une case vers la droite
écrire "" dans les cellules sélectionnées
Je n'arrive pas à transformer ce processus en codage VBA. J'ai pour l'instant fait ceci pour la première étape mais ça ne marche pas
Sub compteur()
Dim ligne As Long, lifin As Long
With Sheets("stock")
lifin = .Range("d" & Rows.Count).End(xlDown).Row
For ligne = 1 To lifin
If (.Range("d" & ligne).Value) = 0 Then .Range("d" & ligne).Select
Selection.Offset(0, 1).Select
For Each cell In Selection
cell.Value = cell.Value + 1
Next cell
Next ligne
End With
End Sub
PS: Je voulais essayer de faire fonctionner la macro après les lignes 4000 (qui sont pour l'instant vides) également car quand je rajouterais à l'avenir un nouveau produit, je voulais éviter de toucher de nouveau à la macro.
J'espère avoir été assez clair, n'hésitez pas à revenir vers moi pour plus d'explications.
Désolé pour le pavé et merci par avance pour votre aide
Cordialement,
Thomas
Hello,
Il y a un point que je ne comprends pas
Pour chaque produit qui n'est pas en stock j'indique "0" dans la cellule
Tu parles de quelle cellule? Celle qui contient le prix?
Si j'ai bien compris chaque jour:
- Tu mets 0 à la place du prix dans chaque ligne pour laquelle le produit est manquant
- Tu veux compter le nombre de jour pendant lequel la cellule est à 0 pour chaque ligne.
Je pense que le mieux est de mettre des colonnes de date de début de rupture que tu effaces à la fin de chaque rupture.
Pour chaque produit manquant, quand tu passes le prix a 0 tu renseigne une date de début dans la colonne correspondante
Ensuite une fois que le produit est à nouveau en stock tu renseigne à nouveau un prix et le compteur de jours s'arrête et la date de début est supprimée.
Pendant toute la durée où tu as une date de début, tu vas incrémenter ta colonne NB jours en rupture de sa valeur initiale (avant le renseignement de la date de début) + le nombre de jours depuis la date de début.
Ex avec le classeur en piece jointe
Le code est dans Feuil1 et ThisWorkbook
Dans Feuil1:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo fin
If Target.Column = 3 Then
If Target.Value = 0 Then
Target.Offset(0, 1).Value = Date
Else
Target.Offset(0, 2).Value = Date - Target.Offset(0, 1).Value + Target.Offset(0, 2).Value
Target.Offset(0, 3).Value = Target.Offset(0, 2).Value
Target.Offset(0, 1).Value = ""
End If
End If
fin:
End SubPermet de mettre une date de début quand on passe à 0
et quand on passe à un autre chiffre, permet de calculer la différence entre la date d'aujourd'hui et la date de début et de l’additionner à la durée de rupture antrieure (colonne 5). Une fois la date supprimée, on considère que la nouvelle durée de rupture servira de base pour un prochain clacul.
Dans ThisWorkbook:
Private Sub Workbook_Open()
'Calculate nb of days
For i = 3 To Sheets(1).Cells(2, 2).End(xlDown).Row
If Sheets(1).Cells(i, 4).Value <> "" Then Sheets(1).Cells(i, 6).Value = Sheets(1).Cells(i, 5).Value + (Date - Sheets(1).Cells(i, 4).Value)
Next i
End SubS’exécute à chaque ouverture du classeur et si une date de début est renseignée calcule la différence entre la date du jour et la date de début et additionne avec la durée antérieure.
Après tu pourras masquer les colonnes de date de début et de durée antérieure car elles ne servent qu'au calcul
Salut funkyfoenky,
Merci pour ton retour rapide.
Tu parles de quelle cellule? Celle qui contient le prix?
En effet, je parle bien de la cellule qui contient le prix.
Si j'ai bien compris chaque jour:
- Tu mets 0 à la place du prix dans chaque ligne pour laquelle le produit est manquant
- Tu veux compter le nombre de jour pendant lequel la cellule est à 0 pour chaque ligne.
C'est exactement cela.
Je crois que j'ai compris l'idée. Penses-tu qu'il soit possible de réaliser toutes ces actions via une macro car cela risque de me prendre beaucoup de temps de renseigner les dates manuellement pour chaque produit?
De plus, sauf erreur de ma part, un problème se pose concernant cette solution: Il faudrait que le compteur puisse incrémenter (ou remettre à zéro) la colonne "NB de jours en rupture" qu'a certains moments de la journée (heure variable) et pas tous les jours (jours variables).
C'est pour cela que je voulais partir sur une base de bouton que j'actionnerais à chaque moment ou je voudrais actualiser les données de la colonne "NB de jours en rupture" (incrémenter/mettre à zéro/laisser la case vide).
Merci pour ton aide.
Thomas
Avec un fichier ce serait plus facile de comprendre.
Pour que le calcul du nombre de jour se lance a la demande tu peux transférer la macro de thisworkbook vers une macro classique dans un module.
Concernant la mise en rupture de plusieurs produits tu peux le faire avec un userform dans lequel tu choisis les produit à mettre en rutpure et les produits à réactiver.
Merci pour tes explications, les codes et le tableau
Voici un exemple du tableau avec les 3 configurations possibles (une configuration par ligne).
J'ai repris ton tableau et il semblerait que le code ne fasse pas de différence entre une cellule vide et une cellule égale a 0 (au niveau de la colonne prix). Est ce que tu sais comment je pourrais y remédier stp?
La colonne "Valeur nb jours de rupture" ne se remet également pas à 0 quand je rentre des prix (à la place des 0). Est ce que tu penses qu'il est possible de corriger cela avec l'ajout d'une condition SI?
Désolé par avance mais je ne suis vraiment pas très fort sur Excel...
Ta colonne nombre de j de rupture c'est le nombre de jours consecutifs? Une fois que ca revient ca doit etre reset?
Ta colonne nombre de j de rupture c'est le nombre de jours consecutifs? Une fois que ca revient ca doit etre reset?
Cette colonne représente en fait le nombre de fois consécutif ou la case prix est à zéro au moment du lancement de la macro.
Oui, quand le prix redevient différent de zéro, la valeur doit être reset.
Pour remettre dans le contexte (si ça peux t'aider), je met à jour la colonne prix de manière plus ou moins régulière (en copiant la colonne des prix que j'importe d'un logiciel dans le tableau). Je voudrais qu’après avoir copié les données à jour dans le tableau pouvoir actualiser la colonne "nombre de j de rupture" via la macro (et uniquement à ce moment la si possible).
si pas de stock -> le prix importé dans la colonne "prix" sera de 0 -> la colonne "nombre de j de rupture" attaquera donc l'incrémentation jusqu'au moment ou quand j'importerai le prix, il sera de X€, alors l'incrémentation sera reset à 0.
si produit plus vendu -> le prix importé dans la colonne "prix" sera de "" -> la colonne "nombre de j de rupture" sera égale à ""
si produit en magasin -> le prix importé dans la colonne "prix" sera de X€ -> la colonne "nombre de j de rupture" sera égale à 0
Merci
Voilà le fichier en pièce jointe devrait répondre à ton besoin.
Tu colles tes prix, tu cliques sur le bouton et pour ceux qui étaient déjà à 0 il va incrémenter 1 par rapport à la valeur existante, pour ceux qui passent à 0 il va mettre 1, pour ceux qui sont vide, il va mettre "Plus en vente" et pour ceux qui ont un prix il va mettre rien.
Edit: J'ai mis un fichier qui correspond à tes colonnes.
Merci !!!
C'est exactement ce qu'il me fallait!
Tu as fait un super travail, ça va m'être grandement utile!
Par contre, quand la macro a fini de traiter les données, le tableau excel fait une sorte de freeze et je ne peux rien sélectionner sur Excel. Du coup j'appuie sur les touches CTRL+PAUSE afin d’arrêter manuellement la macro et après ça remarche nickel. Tu penses que c'est un problème dû à mon PC?
Merci encore
Thomas
EDIT: C'est bon en fait, c'était de la faute de mon pc