Option Explicit 'oblige à déclarer toutes les variables
Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Set O = Worksheets("Sheet1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Me.ComboBox1.AddItem "Tous" 'alimente la ComboBox1
Me.ComboBox1.AddItem "Avec tiret" 'alimente la ComboBox1
Me.ComboBox1.AddItem "Sans tiret" 'alimente la ComboBox1
End Sub
Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Dim I As Long 'déclare la variable I (Incrément)
Dim PL As Range 'déclare la variable PL (PLage)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
O.Rows.Hidden = False 'affiche toutes les lignes de l'onglet O
Set PL = O.Range("A1") 'initialise la plage PL
Select Case Me.ComboBox1.Value 'agit en fonction de la valeur de la ComboBox1
Case "Tous" 'cas "Tous"
GoTo fin 'va à l'étiquette "fin"
Case "Avec tiret" 'cas "Avec tiret"
For I = UBound(TV, 1) To 2 Step -1 'boucle inversée de la dernière ligne la ligne 2
If InStr(1, TV(I, 16), "-", vbTextCompare) = 0 Then 'condition : si il n'y a pas de tiret dans la donnée ligne I colonne 16 de TV
'redéfinit la plage PL (la ligne I si PL ne contient qu'une seule cellule, sinon, l'union de la plage PL et de la ligne I)
Set PL = IIf(PL.Cells.Count = 1, O.Rows(I), Application.Union(PL, O.Rows(I)))
End If 'fin de la condition
Next I 'prochaine ligne de la boucle
Case "Sans tiret" 'cas "Sans tiret"
For I = UBound(TV, 1) To 2 Step -1 'boucle inversée de la dernière ligne la ligne 2
If InStr(1, TV(I, 16), "-", vbTextCompare) <> 0 Then 'condition : si il y a un tiret dans la donnée ligne I colonne 16 de TV
'redéfinit la plage PL (la ligne I si PL ne contient qu'une seule cellule, sinon, l'union de la plage PL et de la ligne I)
Set PL = IIf(PL.Cells.Count = 1, O.Rows(I), Application.Union(PL, O.Rows(I)))
End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Select 'fin de l'action en fontion de la valeur de la ComboBox1
PL.Rows.Hidden = True 'masque toutes les lignes de la plage PL
fin: 'étiquette
Unload Me 'vide et ferme l'UserForm en cours
Range("P1").Select 'sélectionne la cellule P1
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub