Microsoft 365 VBA

omarghatrif

XLDnaute Nouveau
Bonjour,

je suis débutant en vba, je n'arrive pas créer un programme qui me permet de:

- isoler les emplacements cédants càd commencer par les empl céd où il y a un tiret (-) par exemple i21-41

et après les empl céd sans tiret par exemple 2252.

Vous trouverez le fichier ci-joint et je vous remercie d'avance.
 

Pièces jointes

  • fichier1.xlsm
    230.7 KB · Affichages: 11

Robert

XLDnaute Barbatruc
Repose en paix
Bonsoir omar, bonsoir le forum,

En pièce jointe ton fichier modifié. Clic du bouton droit dans n'importe quelle cellule de la colonne P. Choisit l'option dans la ComboBox1...
Le code du composant Sheet1 qui permet d'ouvir l'Userform1 :

VB:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 'au clic droit dans l'onglet
If Target.Column <> 16 Then Exit Sub 'si le clic droit a lieu aillerus qu'en colonne 16 (=> colonne P), sort de la procédure
Cancel = True 'évite le menu contextuel lié au clic droit
UserForm1.Show 'affiche l'UserForm 1
End Sub
Le code de L'UserForm1 :
Code:
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
le fichier :
 

Pièces jointes

  • OmarGathrief_ED_v01.xlsm
    255.9 KB · Affichages: 12

Discussions similaires

Statistiques des forums

Discussions
312 400
Messages
2 088 087
Membres
103 712
dernier inscrit
Charles authentique