Menu déroulant à l'ouverture d'Excel

Bonjour,

J'ai un classeur Excel avec 2 colonnes :

(colonneA) (colonneB)
Entreprise Date_miseajour
ent_1 24/03/2010
ent_2 21/06/2009
ent_2 18/04/2010
ent_3 24/08/2010

Je souhaiterai qu'à l'ouverture du classeur Excel, un menu déroulant, que l'utilisateur doit obligatoirement compléter, apparaisse avec comme choix "ent_1", "ent_2" et ent_3 (il n'y a pas de possibilité d'ajouter de nouvelles entreprises, elles sont toutes fixes)

Si l'utilisateur choisit la modalité "ent_2", une macro devra supprimer toute les entreprises de la colonne A qui ne sont pas égal à"ent_2".

Le résultat sera donc :

(colonneA) (colonneB)
Entreprise Date_miseajour
ent_2 21/06/2009
ent_2 18/04/2010

merci d'avance :)

3 réponses

  1. Modérateur
    Bonjour,
    Ce que tu demandes n'est pas très compliqué. Attention toutefois, es tu sur de vouloir SUPPRIMER toutes les lignes ne correspondants pas au choix de l'utilisateur? Pour info, une suppression par macro ne peux pas être annulée par : Editions/Annuler...
    Je te conseille de penser à "Masquer" les lignes correspondantes, plutôt que supprimer...
    Pour l'instant, je te propose de commencer ton travail par la création d'un petit UserForm qui te permettra cela.
    1- Ouvre ton classeur Excel,
    2- Tape ALT+F11, une fenêtre Visual Basic s'ouvre alors,
    3- Insertion/Userform
    3 bis - Sur la gauche de l'écran, tu dois avoir 2 "sous-fenêtres" : "Projet" & "Propriétés". S'il en manque une des deux voir dans Affichage (Explorateur de projet et fenêtre propriétés)
    3 ter- Si la "Boîte à outils" ne s'ouvre pas par défaut : Affichage/Boîte à outils
    4- Mise en forme de l'UserForm :
    Tu peux en régler la taille avec la souris, pour le reste : la couleur de fond etc... c'est dans la fenêtre "propriétés" :
    - Name (attention propriété importante... Il s'agit du nom que tu utiliseras dans les macros)
    - backcolor
    - caption (titre)
    - etc...
    5- dessines dans ton userform une Combobox : Boîte à outils "contrôles" Zone de liste modifiable.
    6- Double clic dans le fond de l'UserForm, apparait alors ce code (dans une nouvelle fenêtre) :
    Private Sub UserForm_Click()
    
    End Sub

    7- En haut de cette fenêtre : 2 menus déroulants. Dans celui de droite choisir : Initialize. Apparait alors :
    Private Sub UserForm_Click()
    
    End Sub
    _________________________________________
    Private Sub UserForm_Initialize()
    
    End Sub

    8- Sous la ligne : Private Sub UserForm_Initialize() et au dessus de "End Sub", écrire ce code :
    ComboBox1.AddItem "Ent_1"
    ComboBox1.AddItem "Ent_2"
    ComboBox1.AddItem "Ent_3"

    Tu obtiens alors :

    Private Sub UserForm_Click()
    
    End Sub
    __________________________________________
    Private Sub UserForm_Initialize()
    ComboBox1.AddItem "Ent_1"
    ComboBox1.AddItem "Ent_2"
    ComboBox1.AddItem "Ent_3"
    End Sub

    9- Vers le haut à gauche de l'écran, fenêtre "projet", double clic sur "This WorkBook", une nouvelle fenêtre s'ouvre,
    10- En haut de fenêtre, Menu déroulant de gauche (Général), choisir : Workbook, dans celui de droite (Déclarations) choisir "Open" si ce n'est pas fait par défaut... On obtient :
    Private Sub Workbook_Open()
    
    End Sub

    11- Entre ces deux lignes écrire : (attention, si tu as changé la propriété "name" de l'userform, il faut remplacer UserForm1 par le nom choisit)
    Load UserForm1
    UserForm1.Show

    On obtient alors :
    Private Sub Workbook_Open()
    Load UserForm1
    UserForm1.Show
    End Sub

    12- fermer la fenêtre Visual Basic, Enregistrer le classeur (sous un autre nom pour ne pas "abimer" l'original) , fermer puis ouvrir à nouveau.
    2
    1. Merci beaucoup pour cette réponse, la fenêtre s'ouvre bien à l'ouverture du classeur avec la liste déroulante. :)

      Maintenant si tu connais une solution, il faut juste que quand je clique sur une entreprise dans la liste déroulante, exemple ent_2, je dois masquer ou supprimer les lignes des entreprises 1 et 3.

      Après je pense pouvoir m'en sortir seul

      D'avance merci
      0
      1. Modérateur
        Alors "Masquer" ou "Supprimer"?
        Bon choisissons "masquer"...

        1- Tu ouvres à nouveau ton classeur, en activant les macros. Fermes l'userform avec la croix.
        2- tape ALT + F11 et affiches à nouveau ton UserForm (fenêtre projet, cliques sur Feuilles puis double clic sur le nom de ton userform)
        3- Dessines un Commandbutton dans ton userform : boite à outils "Bouton de commande"
        3 bis- dans la propriété "caption" du bouton remplace : CommandButton1 par : VALIDER
        4- Double clic sur le bouton VALIDER, tu vois :
        Private Sub CommandButton1_Click() 
        
        End Sub 
        ________________________________________ 
        Private Sub UserForm_Click() 
        
        End Sub 
        _________________________________________ 
        Private Sub UserForm_Initialize() 
        ComboBox1.AddItem "Ent_1" 
        ComboBox1.AddItem "Ent_2" 
        ComboBox1.AddItem "Ent_3" 
        End Sub

        5- Entre les lignes Private Sub CommandButton1_Click() et End Sub copie / colle ce code :
        Private Sub CommandButton1_Click() 
        Dim ValeurChoisie As String 
        Dim DerniereLigne As Integer, lign As Integer, Col As Integer 
        If ComboBox1.Value = "" Then 
            MsgBox "Merci de sélectionner une entreprise" 
            Exit Sub 
        End If 
        Col = 1 'ici place le numéro de la colonne contenant les "Ent_1" "Ent_2" 1= A, 2=B etc... 
        ValeurChoisie = ComboBox1.Value 
        With Sheets("Feuil1").Columns(Col) 'adapter le nom de la feuille, ici "Feuil1" 
            DerniereLigne = .Cells(65536, Col).End(xlUp).Row 
            For lign = 2 To DerniereLigne 
                If .Cells(lign, Col).Value <> ValeurChoisie Then 
                    .Cells(lign, Col).EntireRow.Hidden = True 
                End If 
            Next 
        End With 
        Unload UserForm1 
        UserForm1.Hide 
        End Sub

        6- Une petite modification, pour éviter des fausses manipulations... Dans le code du : WorkBook_Open (double clic fenêtre projet sur "ThisWorkBook") :
        Private Sub Workbook_Open() 
        With Sheets("Feuil1") ' adapter le nom de la feuille 
            .Range("A1:A10000")..EntireRow.Hidden = False 'adapter le numéro de dernière ligne 10000 
        End With 
        Load UserForm1 
        UserForm1.Show 
        End Sub 
        

        7- Fermes Visual Basic, enregistre et ferme ton classeur et teste en ouvrant à nouveau...
        0
    2. Ok ça fonctionne nickel je te remercie :)

      J'ai essayé naïvement de changer le Hidden en Delete afin de cette fois supprimer les lignes dont je ne veux pas.

      Mais ça ne fonctionne pas...
      0
      1. Modérateur
        Je viens de voir une erreur..; Il y a un double point (..) au lieu d'un seul(.) ici :
        Private Sub Workbook_Open() 
        With Sheets("Feuil1") ' adapter le nom de la feuille 
            .Range("A1:A10000")..EntireRow.Hidden = False 'adapter le numéro de dernière ligne 10000 
        End With 
        Load UserForm1 
        UserForm1.Show 
        End Sub 

        Pour supprimer :
        Remplacer dans le code du CommandButton :
            For lign = 2 To DerniereLigne 
                If .Cells(lign, Col).Value <> ValeurChoisie Then 
                    .Cells(lign, Col).EntireRow.Hidden = True 
                End If 
            Next

        par :
            For lign = 2 To DerniereLigne 
                If .Cells(lign, Col).Value <> ValeurChoisie Then 
                    .Cells(lign, Col).EntireRow.Delete
                End If 
            Next
        0
      2. Bonjour,

        La suppression des lignes ne fonctionne pas. Le programme conserve bien les lignes souhaitées mais ne supprime qu'une partie des mauvaises lignes.

        Autre soucis, dans thisworkbook où se trouve les instructions suivantes :

        Private Sub Workbook_Open()

        With Sheets("PSST") ' adapter le nom de la feuille
        .Range("A1:A65536")..EntireRow.Hidden = False 'adapter le numéro de dernière ligne 10000
        End With

        Load liste
        liste.Show

        End Sub


        La zone en gras apparait en rouge et la fenêtre suivante apparait :

        Erreur de compilation :
        Erreur de syntaxe


        Si tu as besoin d'y voir plus clair, je peux te transmettre le fichier par mail

        D'avance merci et bonne journée
        0
      3. Modérateur
        La zone apparait en rouge???

        Ben oui, je te l'ai dit juste au dessus il y a une erreur dans cette ligne... Change :
        .Range("A1:A65536")..EntireRow.Hidden = False 'adapter le numéro de dernière ligne 10000

        Par :
        .Range("A1:A65536").EntireRow.Hidden = False 'adapter le numéro de dernière ligne 10000 

        Un seul point (.), pas deux (..)
        0
      4. Ok pour le thisworkbook ,

        Mais le programme n'efface toujours qu'une partie des lignes que je souhaite supprimées.

        Le programme est le suivant :

        Private Sub bouton1_Click()
        Dim ValeurChoisie As String
        Dim DerniereLigne As Integer, lign As Integer, Col As Integer
        If ComboBox1.Value = "" Then
        MsgBox "Merci de sélectionner une entreprise"
        Exit Sub
        End If
        Col = 1 'ici place le numéro de la colonne contenant les "terrain1" "terrain2" 1= A, 2=B etc...
        ValeurChoisie = ComboBox1.Value
        With Sheets("PSST").Columns(Col) 'adapter le nom de la feuille, ici "PSST"
        DerniereLigne = .Cells(65536, Col).End(xlUp).Row
        For lign = 4 To DerniereLigne
        If .Cells(lign, Col).Value <> ValeurChoisie Then
        .Cells(lign, Col).EntireRow.Delete
        End If
        Next
        End With
        Unload liste
        liste.Hide

        End Sub


        sachant qu'il semble bien comprendre ValeurChoisie car il la conserve systématiquement...
        0
      5. Modérateur
        yesss!!!!!
        Quel cruche ce "Pijaku"...
        Effectivement, je t'avais donnée un code pour "masquer" les lignes, pour les "deleter" je n'ai pas réfléchit...
        Lorsque l'on supprime des lignes, il faut toujours commencer par la dernière et remonter... Pourquoi? Parce que lorsque tu supprimes la ligne 6 par exemple, la 7ème remonte et devient donc la ligne 6 qui ne sera plus testée...
        Donc remplace :

        For lign = 4 To DerniereLigne
        par :

        For lign = DerniereLigne To 4 Step -1 
        0