Bonjour le fil, bonjour le forum,
Deux macro full Comment testées sur 29863 lignes. La première est paradoxalement plus rapide :
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim VMin As Integer 'déclare la variable VMin (Valeur Minumale)
Dim VMax As Integer 'déclare la variable VMax (Valeur maximale)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 (Z)
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
O.Range("F3").Resize(D.Count, 1).Value = Application.Transpose(D.Keys) 'renvoie cette liste transposée dans F3 redimensionnée
For K = 0 To UBound(TMP) 'boucle 1 : sur tous les éléments du tableau temporaire TMP
COL = 5 'initialise la variable COL
For J = 2 To 3 'boucle 2 sur les colonne 2 à 3 (FX et FY)
VMin = 10000 'initialise la valeur minimale VMin
VMax = 0 'initialise la valeur maximale VMax
COL = COL + 2 'redéfinit la colonne COL
For I = 2 To UBound(TV) 'boucle 3 : sur toutes les ligne I du tableau des valeur TV
If TV(I, 1) = TMP(K) Then 'condition "si la donnée en colonne 1 de TV (Z) est égale à l'élément K de TMP
'si la donnée colonne J de la boucle est inférieure à VMin, VMin devient cette donnée
If TV(I, J) < VMin Then VMin = TV(I, J)
'si la donnée colonne J de la boucle est supérieure à VMax, VMax devient cette donnée
If TV(I, J) > VMax Then VMax = TV(I, J)
End If 'fin de la condition
Next I 'prochaine ligne de la boucle 3
O.Cells(K + 3, COL).Value = VMin 'renvoie dans la cellule ligne K+3, colonne COL la valeur minimale VMin
O.Cells(K + 3, COL + 1).Value = VMax 'renvoie dans la cellule ligne K+3, colonne COL+1 la valeur maximale VMax
Next J 'prochaine colonne de la boucle 2
Next K 'prochaine élément de la boucle 1
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
Sub Macro2()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim PL As Range 'déclare la variable PL (PLage)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim VMin As Integer 'déclare la variable VMin (Valeur Minumale)
Dim VMax As Integer 'déclare la variable VMax (Valeur maximale)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Worksheets("Feuil1") 'définit l'onglet O
Set PL = O.Range("A1").CurrentRegion 'définit la plage PL
TV = PL 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 (Z)
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
O.Range("F3").Resize(D.Count, 1).Value = Application.Transpose(D.Keys) 'renvoie cette liste transposée dans F3 redimensionnée
For K = 0 To UBound(TMP) 'boucle 1 : sur tous les éléments du tableau temporaire TMP
PL.AutoFilter 'annule le filtre automatique de la plage PL
PL.AutoFilter Field:=1, Criteria1:=TMP(K) 'filtre la plage PL sur la colonne 1 avec TMP(K) comme critères
O.Cells(K + 3, 7).Value = Application.WorksheetFunction.Min(O.Columns(2).SpecialCells(xlCellTypeVisible)) 'renvoie le minimum FX
O.Cells(K + 3, 8).Value = Application.WorksheetFunction.Max(O.Columns(2).SpecialCells(xlCellTypeVisible)) 'renvoie le maximum FX
O.Cells(K + 3, 9).Value = Application.WorksheetFunction.Min(O.Columns(3).SpecialCells(xlCellTypeVisible)) 'renvoie le minimum FY
O.Cells(K + 3, 10).Value = Application.WorksheetFunction.Max(O.Columns(3).SpecialCells(xlCellTypeVisible)) 'renvoie le maximum FY
Next K 'prochain élément de la boucle
PL.AutoFilter 'annule le filtre automqtique
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub