Sub Macro1()
Dim I As Object 'déclare la variable I (onglet Init)
Dim F As Object 'déclare la variable F (onglet Feuil2)
Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim J As Integer 'déclare la variable J (incrément)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim Client As String 'déclare la variable client
Dim valeur As Variant 'déclare la variable valeur
Set I = Sheets("Init") 'définit l'onglet I
Set F = Sheets("Feuil2") 'définit l'onglet F
DL = I.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière Ligne éditée DL de la colonne 1 (=A) de l'onglet I
Set PL = I.Range("E5:E" & DL) 'définit la plage PL
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionanaire D
For Each cel In PL 'boucle sur toutes les cellules CEL de la plage PL
If cel.Value <> "" Then D(cel.Value) = cel.Row 'si la cellule n'est pas vide, récupère le numéo de la cellule
Next cel 'prochaine cellule de la boucle
TMP = D.items 'récupère la liste des lignes éditées de la colonne 5, dans le tableau temporaie TMP
For J = 0 To UBound(TMP) 'boucle sur toutes les valeurs du tableau TMP
'définit la cellule de destination DEST de l'onglet F (A1, si A1 est vide, sinon la première ligne vide de la colonne 1 (=A))
Set DEST = IIf(F.Range("A1").Value = "", F.Range("A1"), F.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0))
DEST.Value = I.Cells(TMP(J), 5) 'récupère le [prog] dans DEST
If I.Cells(TMP(J), 6).End(xlDown).Offset(1, 0).Value <> "" Then
Client = I.Cells(TMP(J), 6).End(xlDown).Value & "," & I.Cells(TMP(J), 6).End(xlDown).Offset(1, 0).Value
Else
Client = I.Cells(TMP(J), 6).End(xlDown).Value
End If
DEST.Offset(0, 1).Value = Client 'récupère le ou les [subsystems] dans DEST décalée d'une colonne à droite
If InStr(I.Cells(TMP(J), 7).End(xlDown).Value, ":") = 0 Then
valeur = I.Cells(TMP(J), 7).End(xlDown).Value
Else
valeur = "'" & I.Cells(TMP(J), 7).End(xlDown).Value
End If
DEST.Offset(0, 4).Value = valeur 'récupère la [refValue] dans DEST déclalée de quatre colonnes à droite
DEST.Offset(0, 2) = Cells(TMP(J), 9).End(xlDown) 'récupère le [name] dans DEST déclalée de neuf colonnes à droite
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la lige suivante)
If I.Cells(TMP(J), 10).End(xlDown).Row < TMP(J + 1) Then 'condition si la ligne de la première cellule non vide dans la colonne 10 (+J) est supérieure à la valeur de TMP(J+1)
'récupère la [description] dans DEST déclalée de deux colonnes à droite
DEST.Offset(0, 3).Value = I.Cells(TMP(J), 10).End(xlDown).Value
End If 'fin de la condition (cete condition génère une erreur pour la dernière valeur du tableau TMP)
If Err <> 0 Then 'condition : si une erreur a été générée
Err.Clear 'annule l'erreur
'récupère la [description] dans DEST déclalée de deux colonnes à droite
DEST.Offset(0, 3).Value = I.Cells(TMP(J), 10).End(xlDown).Value
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
Next J 'prochaine valeur du tableau TMP
F.Sort.SortFields.Clear
F.Sort.SortFields.Add Key:=Range("A1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With F.Sort
.SetRange F.Range("A1:O738")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
F.Select 'sélectionne l'onglet F
F.Range("A1").Select 'sélectionne A1 de l onglet F
End Sub