Suivi et automatisation d'un tableau


#1

Bonjour,
Je suis stagiaire et je travaille sur la création d’un outil de planification de la prod. j’ai une idée génial en tete mais le problème c’est que j’arrive pas à la traduire en VBA.
L’idée est tres simple : j’ai plusieurs pièces à fabriquer pour chaque pièce j’ai 4 ou 5 étapes de fabrication, je veux faire un Check pour les étapes de fabrication d’une pièce numéro N avec une MFC, une fois toutes les étapes sont achevées le logiciel passe à la pièce numéro N+1 automatiquement.
Je serais reconnaissants à ceux qui peuvent m’aider.

Merci beaucoup et bon dimanche.


#2

Bonjour,

Faudrait peut-être avoir un classeur de travail avec des données pour voir ce qui est possible de faire,
avec des explications claires et des exemples :wink:


#3

exemple.xlsx (10,1 Ko)
Bonjour @Mimimathy ,
Voilà un exemple dans un classeur.
Supposant que je suis entraîne de fabriquer les 3 pièces mentionnées dans l’exemple.
quand je fasse mon suivi de fabrication je check ok si la tâche et faite et je mets en cours dans la tâche suivante.
la chaise et bientot fabriquée, je veux quand je valide la tâche de finition pour la chase avec un OK, le N de pièce change automatiquement vers N+1 = 4 dans mon exemple.
Merci


#4

Bonjour,

A tester,
il suffit de taper “ok” en Maj ou Min dans les cellules de la colonne G, la ligne suivante passe à "En cours"
A la dernière “Phase”, le N° de la pièce augmente de 1 et les “Suivi” reparte à 0 sauf le premier qui passe à “En cours”

MODULE:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False 'False=Faux pour éviter que la macro tourne en boucle
  Dim Plage, i%, j%, Dl%, Dl1%, Dl2
  Dl = Range("F" & Rows.Count).End(xlUp).Row + 1 'n° de la dernière ligne non vide de la colonne F +1
  
  'Pour définir la plage par rapport à la pièce
  Dl1 = Range("D3").End(xlDown).Row 'n° de la dernière ligne non vide de la colonne D
  Dl2 = Range("D" & Dl1).End(xlDown).Row - 1 ''n° de la dernière ligne non vide de la colonne D -1
  
    If Not Intersect(Target, Range("G4:G" & Dl)) Is Nothing Then 'Si modification sur la colonne G
      
For i = 3 To Dl 'Boucle sur le tableau
      Plage = Range(Cells(Dl1, 6).Address, Cells(Dl2, 6).Address) 'Sélection de la plage de la pièce
        If LCase(Cells(Dl2, 7).Value) = "ok" Then 'Si la cellule de la derniere ligne de la pièce = ok ou OK
          Cells(Dl1, 5) = Cells(Dl1, 5) + 1 'On ajoute 1 au N° de pièce
          Range(Cells(Dl1, 7), Cells(Dl2, 7)) = "" 'on efface les "ok" dans la pièce
          Cells(Dl1, 7) = "En cours" 'on place en cours en 1ère position
        End If
      'Boucle pour le passage entre "ok" , mise "En cours" ligne suivante
      For j = 1 To Dl2
        If LCase(Target.Value) = "ok" Then
          If Target.Row = Dl - 1 Then Exit For
          Target.Offset(1, 0).Value = "En cours"
        End If
      Next j
  
      Dl1 = Dl2 + 1 'on redefinit la première ligne de la pièce suivante
      If Dl1 = Dl Then 'Si Dl1 = Dl, on sort de la procèdure
      Application.EnableEvents = True
      Exit Sub
      End If
      Dl2 = Range("D" & Dl1).End(xlDown).Row - 1 'on redefinit la Dl de la pièce
        If Dl2 > Dl Then 'si la Dl2 est sup. à la Dl on redefinit la Dl2 à Dl
          Dl2 = Dl - 1
        End If
      Next i
    End If
    
    Application.EnableEvents = True
End Sub


Exemple.xlsm (20,9 Ko)


#5

Bonjour,
le travail est parfait est très bien détaillé, je vais changer seulement le en cours que se mets à la 1ere case automatiquement parce que la prode elle est cyclique sur 2 jours et je vais adapter l’exemple sur mon vrais tableau de 1200 lignes haha.
Problématique résolu :slight_smile: grand merci.