Bonjour,
ayant tourné en rond depuis un moment, je me permets de repasser sur le forum pour avoir vos avis de spécialistes.
Je possède un feuille Excel comprenant plus de 7000 lignes et une quinzaine de colonnes.
La feuille porte sur un grand nombre de licenciés Hommes ou Femmes faisant partie de N clubs (N > 80).
Pour chaque club, j'ai besoin de créer dans cette feuille 3 noms (ActiveWorkbook.Names.Add ....) qui me permettront ensuite de faire des listes de sélection ou des choix de recherche de tableaux automatiques.
Ma première idée a été de faire un filtre général et une seule fois sur le nom de club, puis sur le sexe et enfin sur le nom du licencié.
Ensuite, en descendant tout le tableau ligne à ligne je regarde si le nom du club change ou si le sexe change.
J'enregistre alors les N° de lignes correspondant, et à chaque détection d'un nouveau club je crée mes 3 noms Si je fais ça il me faut environ 30 à 40s, pas de gain de temps à scanner les cellules Excel ou à passer par un Variant.
Ma 2° idée a été de me créer la liste des clubs (pour gagner du temps : c'est très rapide avec les filtres avancés en éliminant les doublons), de faire ensuite pour les N club un filtrage sur leur nom et de recherche les première/dernière femmes et premiers/derniers hommes.
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 For i = 3 To NbLig + 1 If Montab(i - 1, 2) = "F" And Montab(i, 2) = "H" Then Rang_F_Stop = i - 1 Rang_H_Start = i End If Club2 = Montab(i, 9) If Club2 <> Club1 And Club2 <> "" Then NomsClub(j) = Club1 j = j + 1 Rang_H_Stop = i - 1 Joueurs_F = "J_" & Club1 & "_F" Joueurs_H = "J_" & Club1 & "_H" Licencies = "L_" & Club1 'Affectation des noms des listes et zones Joueurs et Licence/Classements 'Note il faut passer par ReferToR1C1 sinon décalage... If Rang_F_Start <= Rang_F_Stop Then ActiveWorkbook.Names.Add name:=Joueurs_F, RefersToR1C1:="=" & Nomfeuille & "!R" & Rang_F_Start & "C1:R" & Rang_F_Stop & "C1" End If If Rang_H_Start <= Rang_H_Stop Then ActiveWorkbook.Names.Add name:=Joueurs_H, RefersToR1C1:="=" & Nomfeuille & "!R" & Rang_H_Start & "C1:R" & Rang_H_Stop & "C1" End If ActiveWorkbook.Names.Add name:=Licencies, RefersToR1C1:="=" & Nomfeuille & "!R" & Rang_F_Start & "C1:R" & Rang_H_Stop & "C13" If Montab(i, 2) = "F" Then Rang_F_Start = i End If Club1 = Club2 End If Next
Là c'est pire, car à chaque filtre Excel fait son raffraichissement d'écran, et comme j'en ai à peu plus de 80 là aussi c'est long.
Je me posais donc la question de savoir si on pouvait faire des filtres sur un Variant qui contiendrait le contenu de la feuille ?
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 For i = 1 To NbClub 'Rows("1:1").Select ActiveSheet.Range("A1:M" & NbLig).AutoFilter Field:=12, Criteria1:=Sheets("LISTE_CLUBS").Range("A" & 50 + i).Value Set Trouve = ActiveSheet.Columns(2).Cells.Find(what:="F", LookAt:=xlWhole) Rang_F_Start = Trouve.Row Set Trouve = ActiveSheet.Columns(2).Cells.Find(what:="H", LookAt:=xlWhole) Rang_H_Start = Trouve.Row Rang_F_Stop = Rang_H_Start - 1 Rang_H_Stop = Rang_H_Start - 1 + [SUBTOTAL(3,A:A)] - (Rang_F_Stop - Rang_F_Start + 1) Joueurs_F = "J_" & Club1 & "_F" Joueurs_H = "J_" & Club1 & "_H" Licencies = "L_" & Club1 'Affectation des noms des listes et zones Joueurs et Licence/Classements 'Note il faut passer par ReferToR1C1 sinon décalage... 'If Rang_F_Start <= Rang_F_Stop Then ActiveWorkbook.Names.Add name:=Joueurs_F, RefersToR1C1:="=" & Nomfeuille & "!R" & Rang_F_Start & "C1:R" & Rang_F_Stop & "C1" 'End If 'If Rang_H_Start <= Rang_H_Stop Then ActiveWorkbook.Names.Add name:=Joueurs_H, RefersToR1C1:="=" & Nomfeuille & "!R" & Rang_H_Start & "C1:R" & Rang_H_Stop & "C1" 'End If ActiveWorkbook.Names.Add name:=Licencies, RefersToR1C1:="=" & Nomfeuille & "!R" & Rang_F_Start & "C1:R" & Rang_H_Stop & "C13" Next
Mes capacités à utiliser les tableaux de Variant pour faire autre chose que du calcul simple ou de la manipulation de chaines de caractères s'arrêtent là, merci de votre support et de vos idées géniales
Partager