Bonjour Arturo,
Encore merci pour le temps passé à m'aider.
J'ai lancé la macro sur un fichier réduit et cela ne donne pas les bons résultats. J'ai mis un exemplaire du résultat en fichier.
Je l'avais d'abord essayer sur le fichier massif 40000 LIGNES et il bloque avec le passage suivant en rouge
Sub Reduire()
'Déclaration des variables
Dim DerLig As Long, i As Long, j As Long, Lig_Dest As Long, DerCol As Long
Dim Total As Double
Application.ScreenUpdating = False 'pour éviter les rafraîchissemnts de l'écran et augmenter la vitesse d'exécution
debut = Timer 'enregistre l'heure de début de l'exécution du code
DerLig = Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne du tableau de données
DerCol = Range("A1").End(xlToRight).Column 'dernière colonne du tableau de données
Range(Cells(2, "U"), Cells(DerLig, "AM")).Clear ' on efface la totalité des précédents résultats
Range("T2").FormulaArray = "=IF(AND(RC1=R[-1]C1,(R[-1]C4:R[-1]C18)=(RC4:RC18)),0,1)" 'formule matricielle validée en excel avec CTRL + SHIFT + ENTREE
Range("T2").AutoFill Destination:=Range("T2:T" & DerLig) 'on recopie la formule jusquà la dernière ligne
Range("T2:T" & DerLig).Value = Range("T2:T" & DerLig).Value 'on remplace les formules par les valeurs
Lig_Dest = 2 'première ligne vide du tableau de destination du résultat
For i = 2 To DerLig 'de la première ligne à la dernière ligne du tableau de données
If Cells(i, "T") = 1 Then 'si la valeur=1 alors,
j = i 'on applique la valeur de i à la variable j
Total = Cells(j, "S") 'on met le nombre d'heures dans la variable "Total"
Range(Cells(Lig_Dest, "U"), Cells(Lig_Dest, "AM")).Value = Range(Cells(i, "A"), Cells(i, "S")).Value 'on copie la ligne du tableau des valeurs dans dans la ligne du tableau de destination
Do While Cells(j + 1, "T") <> 1 And j + 1 <= DerLig ' tant que les lignes suivantes de la colonne T seront égales à 0
Total = Total + Cells(j + 1, "Q") 'alors on ajoute au total le nombre d'heures de chaque ligne dont la cellule en colonne T = 0
j = j + 1 'on incrénete j pour tester la ligne suivante
Loop ' on recommence le test jusq'à ce que la cellule en colonne "T" soit égale à 1 ou vide
Cells(Lig_Dest, "V") = Format(Cells(i, "B"), "m/d/yyyy") 'on applique le format "Dtae" sur les dates de début et de fin
Cells(Lig_Dest, "W") = Format(Cells(j, "C"), "m/d/yyyy")
Cells(Lig_Dest, "AM") = Total 'on recopie le total
i = j 'on applique la valeur de J à i
Lig_Dest = Lig_Dest + 1 ' on incrémente la ligne de destination
End If
Next i 'on recommence le cycle avec les lignes suivantes
With Range(Cells(1, "U"), Cells(1, "AM")) 'sur la ligne d'entête du tableau de destination
.Value = Range(Cells(1, "A"), Cells(1, "S")).Value 'on y recopie les titres du tableau de données
.Interior.Color = RGB(55, 96, 145) 'on y applique la couleur bleue foncée
.Font.Color = RGB(255, 255, 255) 'avec la police en blanc
End With
Range("U1:AM" & Range("A" & Rows.Count).End(xlUp).Row).Borders().Weight = xlThin 'on applique un quadrillage
Columns("T").ClearContents 'on efface la colonne T
MsgBox "Durée d'exécution; " & Timer - debut & " sec" ' affiche le temps d'exécution
End Sub