Bonjour à tous,

Je suis apprenti ingénieur et j'ai un léger soucis avec VBA.

Mise en situation :
Le service production est constitué de trois ateliers : Collecteur - Ailetage - Montage.
Chaque atelier possède un planning de production dans lequel sont répertoriées les différentes charges et capacités pour chaque affaire. (fichier joint : Planning Montage)
Le but étant de récupérer les dates de début et de fin pour chaque affaire et les insérer dans un autre classeur (fichier joint : Gantt) pour avoir une vision globale de la durée de fabrication.

Cahier des charges :
Notre "rêve" serait de noter le numéro d'affaire dans le fichier Gantt et qu'à partir de là et automatiquement les autres cellules (Début et Fin) se remplissent et mettent en forme le gantt associé.

J'arrive avec le code ci-dessous à aller chercher des données dans un classeur "Planning Montage" mais je n'arrive pas à réaliser la même chose pour les deux autres classeurs : "Planning Collecteurs" et "Planning Ailetage".

En espérant que quelqu'un vienne à mon aide.

Merci!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Target.Column = 1 Then Exit Sub  ' Ne réagir que si elle est située dans la première colonne
    If IsEmpty(Target) Then Exit Sub  ' Ne pas lancer la procédure lorsqu'on efface une cellule
    If Not IsNumeric(Target) Then Exit Sub  ' Ne réagir qu'à la saisie d'un numéro d'affaire
    Debug.Print Target
 
    ' On dispose donc ici du numéro d'affaire
    ' Il reste à parcourir le document "Planning Montage.xls" pour trouver les données relatives à cette affaire et à les reporter en face
    Dim w, planning As Workbook
    For Each w In Application.Workbooks
        If w.Name = "Planning Montage.xls" Then Set planning = w
    Next w
    If planning Is Nothing Then
        'Le document n'était pas ouvert, donc il faut l'ouvrir
        Application.Workbooks.Open Application.ActiveWorkbook.Path & "\" & "Planning Montage.xls"
        Set planning = Workbooks("Planning Montage.xls")
    End If
    Dim planningSheet As Worksheet, r As Range, c As Range, premièreLigne As Integer, dernièreLigne As Integer
    Dim semaineDébut As Integer, semaineFin As Integer
    Set planningSheet = planning.Sheets("Planning")
    Set r = planningSheet.Columns("A:A")
 
    Set c = r.Find(What:=Target.Value, LookIn:=xlValues)
    If c Is Nothing Then Exit Sub
 
    ' On ne travaille que si on a trouvé le n° d'affaire
    ' On va rechercher toutes les lignes qui comporte ce numéro d'affaire en colonne 1
    premièreLigne = c.Row
    Do
        TrouverBornes c, semaineDébut, semaineFin
        dernièreLigne = c.Row
        Set c = r.FindNext(c)
    Loop While Not c Is Nothing And c.Row <> premièreLigne
 
    ' On dispose maintenant des numéros de colonne dans lesquelles l'affaire commence (semaineDébut)
    ' et finit (semaineFin). Il reste à aller récupérer les numéros de semaine corresondants
    ' Ceux-ci se trouvent sur la ligne 1 du planning
 
    semaineDébut = planningSheet.Cells(1, semaineDébut + 1)
    semaineFin = planningSheet.Cells(1, semaineFin + 1)
    Debug.Print semaineDébut, semaineFin
 
    ' Il ne reste plus qu'à les reporter à côté de la cellule dans laquelle on a tapé le numéro d'affaire
    Target.Offset(0, 2) = semaineDébut
    Target.Offset(0, 3) = semaineFin
    ' Attention : si on commence en semaine 4 et qu'on finit en semaine 8, il me semble que la durée est de 5 semaines
    ' et non de 4 comme vous l'avez indiqué dans votre document
    ' D'où le +1 final
    ' On ajoute 52 à tout cela pour permettre les calculs de durée avec un début en semaine 51 et la fin en semaine 2 par exemple
    Target.Offset(0, 4) = (52 + semaineFin - semaineDébut + 1) Mod 52
End Sub
 
 
 
Private Sub TrouverBornes(c As Range, ByRef semaineDébut As Integer, ByRef semaineFin As Integer)
    Dim sem1 As Integer, sem2 As Integer
    Dim i As Integer
    i = 10
    Do While i < 62
        If IsNumeric(c.Offset(0, i)) And c.Offset(0, i) > 0 Then
            If semaineDébut = 0 Or i < semaineDébut Then semaineDébut = i
            If i > semaineFin Then semaineFin = i
        End If
        i = i + 1
    Loop
End Sub