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
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...
vbMBHB
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.
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 :
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