Menu déroulant à l'ouverture d'Excel

freygeo Messages postés 24 Statut Membre -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  2. freygeo Messages postés 24 Statut Membre
     
    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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  3. freygeo Messages postés 24 Statut Membre
     
    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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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. freygeo Messages postés 24 Statut Membre
       
      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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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. freygeo Messages postés 24 Statut Membre
       
      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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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