Cellule avec menu déroulant

Bonjour à tous,

j'essaye de mettre en place ce code VBA dans mon fichier Excel:

Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Range("A1") = "chaine de caractère 1" Then
        Rows("60:131").Hidden = True

    ElseIf Range("A1") = "chaine de caractère 2" Then
        Rows("60:131").Hidden = True

    ElseIf Range("A1") = "chaine de caractère 3" Then
        Rows("60:131").Hidden = True

    ElseIf Range("A1") = "chaine de caractère 4" Then
        Rows("60:131").Hidden = True

    ElseIf Range("A1") = "chaine de caractère 5" Then
        Rows("60:131").Hidden = True
    Else
        Rows("60:131").Hidden = False
    End If

    If Range("A1") = "chaine de caractère 6" Then
        Rows("132:149").Hidden = True

    ElseIf Range("A1") = "chaine de caractère 7" Then
        Rows("132:149").Hidden = True

    ElseIf Range("A1") = "chaine de caractère 8" Then
        Rows("132:149").Hidden = True
    Else
        Rows("132:149").Hidden = False
    End If
End Sub

Je le trouve très lent en exécution, y-a-t-il une autre façon de faire pour que mon fichier soit rapide en exécution?

je voudrais aussi savoir comment faire pour valider la valeur de la cellule A1 sans passer par la touche Entrée du clavier, car quand je sélectionne la valeur dans A1 le code ne s’exécute que lorsque je valide avec la touche Entrée..

Merci par avance de votre aide.

Bonjour, au lieu du "SelectionChange" préférez lui le "Change" avec une surveillance de la cellule A1 :

If Not Intersect(Target,Range("A1")) Is Nothing Then

En gros, si le changement de valeur est détectée sur la cellule A1 vous faites les différents test pour masquer ou afficher vos lignes.

vbMBHB

Bonsoir Dauof,

Pour tenter d'améliorer la rapidité d'affichage, essaye d'ajouter en début de procédure:

Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.ScreenUpdating = false

et en fin de procédure de rétablir par

    Application.ScreenUpdating = true
End Sub

Bonjour et bienvenue sur le forum

Bonjour à tous

Un essai à tester.

Bye !

14classeur1.xlsm (21.40 Ko)

Voici un "des" codes possibles :

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    ' on vérifie que le changement a affecté la cellule A1
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        ' si c'est le cas on dimensionne une variable
        Dim Le_Test As String
        ' on définie cette variable comme étant égale à la valeur de la chaine A1 d'un caractère en partant de la droite
        Le_Test = Right(Target.Value, 1)
        ' si cette valeur "en numérique" est >5 et <9 alors on est dans le cas où il faut cacher 132:149 et montrer 60:131
        If Val(Le_Test) > 5 And Val(Le_Test) < 9 Then
            Rows("132:149").Hidden = True
            Rows("60:131").Hidden = False
        ' si cette valeur en numérique est >0 et <6 alors on est dans le cas où il faut cacher 60:131 et montrer 132:149
        ElseIf Val(Le_Test) > 0 And Val(Le_Test) < 6 Then
            Rows("60:131").Hidden = True
            Rows("132:149").Hidden = False
        ' si on est dans aucuns des cas "surveillés" il faut tout montrer
        Else
            Rows("60:131").Hidden = False
            Rows("132:149").Hidden = False
        End If
    End If
End Sub

vbMBHB

Bonjour, au lieu du "SelectionChange" préférez lui le "Change" avec une surveillance de la cellule A1 :

If Not Intersect(Target,Range("A1")) Is Nothing Then

En gros, si le changement de valeur est détectée sur la cellule A1 vous faites les différents test pour masquer ou afficher vos lignes.

vbMBHB

Bonsoir vbMsgBoxHelpButton,

Et merci de votre aide, cependant j'ai des chaines de caractères qui ont des tailles très différentes à vérifier dans la cellule A1 et non pas des valeurs numériques, est ce que code reste valable?

merci de votre aide

Bonsoir Dauof,

Pour tenter d'améliorer la rapidité d'affichage, essaye d'ajouter en début de procédure:

Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.ScreenUpdating = false

et en fin de procédure de rétablir par

    Application.ScreenUpdating = true
End Sub

Bonsoir GVIALLES,

votre proposition marche à merveille, merci de votre aide.

Je ne doute pas que cela fonctionne... Mais tester la valeur d'une cellule à chaque changement de sélection de cellule c'est faire "travailler" Excel pour pas grand chose... Si vous regardez la valeur d'une cellule autant ne "surveiller" que cette cellule, cela prend moins de ressources...

vbMBHB

Bonjour et bienvenue sur le forum

Bonjour à tous

Un essai à tester.

Bye !

Bonjour gmb, merci de votre aide, ma cellule contient un menu déroulant.

Je ne doute pas que cela fonctionne... Mais tester la valeur d'une cellule à chaque changement de sélection de cellule c'est faire "travailler" Excel pour pas grand chose... Si vous regardez la valeur d'une cellule autant ne "surveiller" que cette cellule, cela prend moins de ressources...

vbMBHB

Bonjour vbMsgBoxHelpButton, dans le cas ou mes chaines de caractère ne contiennent aucun chiffre, comment pourrais-je adapter votre code ?

Voici un exemple:

cas 1: la cellule A1 contient la chaîne de caractère Paris.

cas 2: la cellule A1 contient la chaîne de caractère province.

etc...

merci de votre aide

Bonjour, je répondrais : tout dépend.... Si comme votre premier exemple vous avez une action à faire pour une série de villes, alors un tableau contenant cette série de ville, ou bien une plage de cellules sur une feuille "système" (par exemple) et faire un test de la valeur de la cellule "menu déroulant" et ce tableau, mais sans le fichier vous savez c'est partir sur des supposition, sans compter le temps de mise en place des données, qui au bout du compte sont à modifiées car cela ne prend pas en compte d'autre informations de votre fichier... Merci d'y penser et de joindre un fichier "au plus près" du votre afin d'avoir une bonne base de travail.

vbMBHB

Bonjour, je répondrais : tout dépend.... Si comme votre premier exemple vous avez une action à faire pour une série de villes, alors un tableau contenant cette série de ville, ou bien une plage de cellules sur une feuille "système" (par exemple) et faire un test de la valeur de la cellule "menu déroulant" et ce tableau, mais sans le fichier vous savez c'est partir sur des supposition, sans compter le temps de mise en place des données, qui au bout du compte sont à modifiées car cela ne prend pas en compte d'autre informations de votre fichier... Merci d'y penser et de joindre un fichier "au plus près" du votre afin d'avoir une bonne base de travail.

vbMBHB

Merci de votre retour, voici un exemple de fichier que je souhaiterai faire fonctionner.

8test.xlsx (13.57 Ko)

D'accord j'ai bien compris le coté "liste déroulante" mais par rapport à votre première question : quelles sont les lignes à afficher ou masquer en fonction du choix de la liste ?

vbMBHB

D'accord j'ai bien compris le coté "liste déroulante" mais par rapport à votre première question : quelles sont les lignes à afficher ou masquer en fonction du choix de la liste ?

vbMBHB

Si je choisi les valeurs :

Ile-de-France

Aquitaine

Nord-Pas-de-Calais

Basse Normandie

Bourgogne

Je masque les lignes de 60 à 131 et j'affiche le reste.

Si je choisi les valeurs:

Languedoc-Roussillon

Provence-Alpes-Côte-d'Azur

Champagne-Ardenne

Je masque les lignes de 132 à 149 et j'affiche le reste.

Merci de votre aide.

Principe :

feuille 2, création d'un tableau avec le nom des régions, avec en colonne 2 le numéro de leur "groupe".

L'avantage : ajout d'une région facilité, elle est automatiquement prise en compte dans la liste de choix et la "recherche" du code VBA.

Dans le code VBA : on détecte le changement de valeur de la cellule A1, suite à ce changement, on recherche dans le tableau cette nouvelle valeur, afin de "connaître" son numéro de groupe "Référence". Un Select Case permet d'aiguillé le code VBA en fonction du numéro du groupe. Cet aiguillage permet de faire afficher ou masquer les groupes de lignes adéquates. Si "tout" est sélectionné, alors tout est affiché.

Fichier joint :

12test-vbmbhb.xlsm (19.44 Ko)

vbMBHB

Principe :

feuille 2, création d'un tableau avec le nom des régions, avec en colonne 2 le numéro de leur "groupe".

L'avantage : ajout d'une région facilité, elle est automatiquement prise en compte dans la liste de choix et la "recherche" du code VBA.

Dans le code VBA : on détecte le changement de valeur de la cellule A1, suite à ce changement, on recherche dans le tableau cette nouvelle valeur, afin de "connaître" son numéro de groupe "Référence". Un Select Case permet d'aiguillé le code VBA en fonction du numéro du groupe. Cet aiguillage permet de faire afficher ou masquer les groupes de lignes adéquates. Si "tout" est sélectionné, alors tout est affiché.

Fichier joint :Test_vbMBHB.xlsm

vbMBHB

Merci beaucoup, ça fonctionne très bien, bravo vbMsgBoxHelpButton.

Principe :

feuille 2, création d'un tableau avec le nom des régions, avec en colonne 2 le numéro de leur "groupe".

L'avantage : ajout d'une région facilité, elle est automatiquement prise en compte dans la liste de choix et la "recherche" du code VBA.

Dans le code VBA : on détecte le changement de valeur de la cellule A1, suite à ce changement, on recherche dans le tableau cette nouvelle valeur, afin de "connaître" son numéro de groupe "Référence". Un Select Case permet d'aiguillé le code VBA en fonction du numéro du groupe. Cet aiguillage permet de faire afficher ou masquer les groupes de lignes adéquates. Si "tout" est sélectionné, alors tout est affiché.

Fichier joint :Test_vbMBHB.xlsm

vbMBHB

Merci beaucoup, ça fonctionne très bien, bravo vbMsgBoxHelpButton.

J'ai une autre question, comment éviter que la cellule A1 soit vide ou qu'on l'on puisse la vider?

Car, j'ai remarqué que lorsque je supprime son contenu le code bug.

merci pour votre aide.

Bonsoir, pour empêcher que ce soit vide il suffit de faire le test de la valeur de la cellule est si c'est égal à rien alors on fait un UNDO de l'application afin de "revenir en arrière".

Il reste toujours le "tout" pour tout afficher...

Pour cela remplacez le code du fichier avec celui-ci :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    ' si cellule vide alors on force un "Undo" de l'application
    If Target.Value = "" Then
        Application.Undo
        Exit Sub
    End If
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        Dim Cel_Trouvée As Range, Plage_de_Recherche As Range, Référence As Integer
        Set Plage_de_Recherche = [Test]
        Set Cel_Trouvée = Plage_de_Recherche.Cells.Find(what:=Target.Value, LookAt:=xlWhole)
        Référence = Cel_Trouvée.Offset(, 1).Value
        Select Case Référence
            Case 1
                ActiveSheet.Rows("60:131").Hidden = True
                ActiveSheet.Rows("132:149").Hidden = False
            Case 2
                ActiveSheet.Rows("60:131").Hidden = False
                ActiveSheet.Rows("132:149").Hidden = True
            Case Else
                ActiveSheet.Rows("60:131").Hidden = False
                ActiveSheet.Rows("132:149").Hidden = False
        End Select
    End If
End Sub

Attention ! La cellule peut-être vide si elle est effacée en même temps qu'une autre cellule, mais dans ce cas il n'y a pas de bug...

vbMBHB

Bonsoir, pour empêcher que ce soit vide il suffit de faire le test de la valeur de la cellule est si c'est égal à rien alors on fait un UNDO de l'application afin de "revenir en arrière".

Il reste toujours le "tout" pour tout afficher...

Pour cela remplacez le code du fichier avec celui-ci :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    ' si cellule vide alors on force un "Undo" de l'application
    If Target.Value = "" Then
        Application.Undo
        Exit Sub
    End If
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        Dim Cel_Trouvée As Range, Plage_de_Recherche As Range, Référence As Integer
        Set Plage_de_Recherche = [Test]
        Set Cel_Trouvée = Plage_de_Recherche.Cells.Find(what:=Target.Value, LookAt:=xlWhole)
        Référence = Cel_Trouvée.Offset(, 1).Value
        Select Case Référence
            Case 1
                ActiveSheet.Rows("60:131").Hidden = True
                ActiveSheet.Rows("132:149").Hidden = False
            Case 2
                ActiveSheet.Rows("60:131").Hidden = False
                ActiveSheet.Rows("132:149").Hidden = True
            Case Else
                ActiveSheet.Rows("60:131").Hidden = False
                ActiveSheet.Rows("132:149").Hidden = False
        End Select
    End If
End Sub

Attention ! La cellule peut-être vide si elle est effacée en même temps qu'une autre cellule, mais dans ce cas il n'y a pas de bug...

vbMBHB

Merci vbMsgBoxHelpButton, comment puis-je alerter l'utilisateur à l'ouverture du fichier excel de la valeur que contenait la cellule A1 juste avant sa fermeture?

Merci de votre aide.

Bonjour, en théorie, la valeur à l'ouverture est égale à celle de la fermeture, non ? Il suffit alors dans le module "ThisWorkBook" en VBA de définir la sub "Open" est de mettre un msgbox avec la valeur de A1 :

Private Sub Workbook_Open()
    MsgBox (Sheets("Feuil1").Range("A1").Value)
End Sub

vbMBHB

Rechercher des sujets similaires à "menu deroulant"