Excel - Masquer certaines lignes en fonction d'une cellule
Résolu/Fermé
A voir également:
- Excel - Masquer certaines lignes en fonction d'une cellule
- Aller à la ligne dans une cellule excel - Guide
- Excel fonction si et - Guide
- Excel cellule couleur si condition texte - Guide
- Liste déroulante excel - Guide
- Verrouiller cellule excel - Guide
18 réponses
Mike-31
Messages postés
18352
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
21 décembre 2024
5 110
21 mai 2014 à 17:11
21 mai 2014 à 17:11
Bonjour,
Clic droit sur l'onglet de ta feuille/Visualiser le code et colle ce code
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, [L151]) Is Nothing Then
Cells.EntireRow.Hidden = False
If Target = "Cas1" Then Rows("181:201").EntireRow.Hidden = True
If Target = "Cas2" Or Target = "Cas2" Then Range("169:180,192:201").EntireRow.Hidden = True
If Target = "Cas4" Then Rows("169:201").EntireRow.Hidden = True
End If
End Sub
En cellule L151 crée une liste de validation à part que la cellule soit renseignée par formule dans ce cas il faudra modifier le code
A+
Mike-31
Une période d'échec est un moment rêvé pour semer les graines du savoir.
Clic droit sur l'onglet de ta feuille/Visualiser le code et colle ce code
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, [L151]) Is Nothing Then
Cells.EntireRow.Hidden = False
If Target = "Cas1" Then Rows("181:201").EntireRow.Hidden = True
If Target = "Cas2" Or Target = "Cas2" Then Range("169:180,192:201").EntireRow.Hidden = True
If Target = "Cas4" Then Rows("169:201").EntireRow.Hidden = True
End If
End Sub
En cellule L151 crée une liste de validation à part que la cellule soit renseignée par formule dans ce cas il faudra modifier le code
A+
Mike-31
Une période d'échec est un moment rêvé pour semer les graines du savoir.
ccm81
Messages postés
10904
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
24 décembre 2024
2 428
21 mai 2014 à 17:17
21 mai 2014 à 17:17
Bonjour
Un début
Cdlmnt
Un début
Const cel = "L151"
Const LaM1 = "181:191"
Const LaM2 = "192:201"
Const LaM3 = "169:180"
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cas As String
If Not Intersect(Target, Range(cel)) Is Nothing Then
Cas = Target.Value
Rows("1:" & Rows.Count).Hidden = False
Select Case Cas
Case "Cas 1": Rows(LaM1).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 2": Rows(LaM3).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 3": Rows(LaM3).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 4": Rows(LaM3).Hidden = True: Rows(LaM1).Hidden = True
End Select
End If
End Sub
Cdlmnt
merci à vous deux ! Pour vos réponse et leur rapidité, je n'attendais rien avant demain... voire plus tard
J'essaie ça demain matin.
Je vous redirai laquelle me convient le mieux, sauf si elle font exactement la même chose ! Enfin je vous redirai tout de même si ça fonctionne et si grâce à ça je peux faire les autres cas dont j'ai besoin dans ce fichier.
Bonne soirée
J'essaie ça demain matin.
Je vous redirai laquelle me convient le mieux, sauf si elle font exactement la même chose ! Enfin je vous redirai tout de même si ça fonctionne et si grâce à ça je peux faire les autres cas dont j'ai besoin dans ce fichier.
Bonne soirée
Mike-31
Messages postés
18352
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
21 décembre 2024
5 110
21 mai 2014 à 21:39
21 mai 2014 à 21:39
Re,
Que crois tu, nous sommes sur Comment ça marche, le forum ou le soleil ne se couche jamais
Que crois tu, nous sommes sur Comment ça marche, le forum ou le soleil ne se couche jamais
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Les 2 versions de mlacro répondent à mon besoin.
Merci à vous 2 : Mike-31 et ccm81 !
Comme expliqué dans ma demande initiale je vais dupliquer la macro utilisée au moins 2 fois en changeant la cellule pilote (et donc les valeurs contenues dans celle-ci) ainsi que les cellules pilotées.
Il me semble avoir compris d'après les recherches d'hier que lorsqu'on utilise plusieurs fois la même "formule" dans plusieurs macros différentes sur le même onglet ça peut planter et qu'il faut donner un nom à chaque macro.
Comment faut-il procéder pour ce faire ?
Si j'ai des soucis pour remplacer les cellules pilote et pilotées je me permettrai de vous poster la macro modifiée pour avis... j'espère ne pas avoir besoin ce qui voudrait dire que j'ai compris (du moins un minimum)
Bon appétit
Merci à vous 2 : Mike-31 et ccm81 !
Comme expliqué dans ma demande initiale je vais dupliquer la macro utilisée au moins 2 fois en changeant la cellule pilote (et donc les valeurs contenues dans celle-ci) ainsi que les cellules pilotées.
Il me semble avoir compris d'après les recherches d'hier que lorsqu'on utilise plusieurs fois la même "formule" dans plusieurs macros différentes sur le même onglet ça peut planter et qu'il faut donner un nom à chaque macro.
Comment faut-il procéder pour ce faire ?
Si j'ai des soucis pour remplacer les cellules pilote et pilotées je me permettrai de vous poster la macro modifiée pour avis... j'espère ne pas avoir besoin ce qui voudrait dire que j'ai compris (du moins un minimum)
Bon appétit
Mike-31
Messages postés
18352
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
21 décembre 2024
5 110
22 mai 2014 à 13:37
22 mai 2014 à 13:37
Re,
Pas de problème, tu précisera quel code tu as retenu de sorte à t'apporter le support nécessaire.
Pour le code de ccm (salut) il suffit de changer les valeurs dans les variables en début de code
Pour mon code il faut changer les adresses dans le code mais il est possible d'utiliser les variables en début de code peut être plus facile à modifier.
Dans un premier temps je mets le statut en résolu ce qui n'empêche pas de revenir sur la discussion
Pas de problème, tu précisera quel code tu as retenu de sorte à t'apporter le support nécessaire.
Pour le code de ccm (salut) il suffit de changer les valeurs dans les variables en début de code
Pour mon code il faut changer les adresses dans le code mais il est possible d'utiliser les variables en début de code peut être plus facile à modifier.
Dans un premier temps je mets le statut en résolu ce qui n'empêche pas de revenir sur la discussion
J'ai pu modifier la macro de Mike-31 pour arriver à mes fins... mais sur 4 fichiers différents.
Lorsque je regroupe les 4 macros dans un même fichier et que je change n'iimporte laquelle des valeurs pilotes, j'obtiens une boîte de dialogue :
"Erreur de Compilation:
Nom ambigu détecté : Worksheet_Change"
ci-dessous les 4 macros utilisées sur la même feuille :
Private Sub Worksheet_Change(ByVal Target As Range)
'Masque les lignes des opérateurs non utilisés
On Error Resume Next
If Not Intersect(Target, [k13]) Is Nothing Then
Cells.EntireRow.Hidden = False
If Target = "2" Then Rows("43:78").EntireRow.Hidden = True
If Target = "3" Then Rows("55:78").EntireRow.Hidden = True
If Target = "4" Then Rows("67:78").EntireRow.Hidden = True
End If
End Sub
-------------
Private Sub Worksheet_Change(ByVal Target As Range)
'Masque les lignes des essais/opérateur non utilisés
On Error Resume Next
If Not Intersect(Target, [k14]) Is Nothing Then
Cells.EntireRow.Hidden = False
If Target = "2" Then Range("21:28,33:40,45:52,57:64,69:76").EntireRow.Hidden = True
If Target = "3" Then Range("22:28,34:40,46:52,58:64,70:76").EntireRow.Hidden = True
If Target = "4" Then Range("23:28,35:40,47:52,59:64,71:76").EntireRow.Hidden = True
If Target = "5" Then Range("24:28,36:41,48:52,60:64,72:76").EntireRow.Hidden = True
If Target = "6" Then Range("25:28,37:41,49:52,61:64,73:76").EntireRow.Hidden = True
If Target = "7" Then Range("26:28,38:41,50:52,62:64,74:76").EntireRow.Hidden = True
If Target = "8" Then Range("27:28,39:41,51:52,63:64,75:76").EntireRow.Hidden = True
If Target = "9" Then Range("28:28,40:41,52:52,64:64,76:76").EntireRow.Hidden = True
End If
End Sub
--------------
Private Sub Worksheet_Change(ByVal Target As Range)
'Masque les colonnes des pièces non utilisées
On Error Resume Next
If Not Intersect(Target, [k12]) Is Nothing Then
Cells.EntireColumn.Hidden = False
If Target = "10" Then Range("N:W").EntireColumn.Hidden = True
If Target = "11" Then Range("O:W").EntireColumn.Hidden = True
If Target = "12" Then Range("P:W").EntireColumn.Hidden = True
If Target = "13" Then Range("Q:W").EntireColumn.Hidden = True
If Target = "14" Then Range("R:W").EntireColumn.Hidden = True
If Target = "15" Then Range("S:W").EntireColumn.Hidden = True
If Target = "16" Then Range("T:W").EntireColumn.Hidden = True
If Target = "17" Then Range("U:W").EntireColumn.Hidden = True
If Target = "18" Then Range("V:W").EntireColumn.Hidden = True
If Target = "19" Then Range("W:W").EntireColumn.Hidden = True
End If
End Sub
--------------
Const cel = "L151"
Const LaM1 = "181:192"
Const LaM2 = "193:204"
Const LaM3 = "169:180"
'Masque les Cas non utilisés (Calcul PV et TV)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cas As String
If Not Intersect(Target, Range(cel)) Is Nothing Then
Cas = Target.Value
Rows("1:" & Rows.Count).Hidden = False
Select Case Cas
Case "Cas 1": Rows(LaM1).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 2 ou 3": Rows(LaM3).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 4": Rows(LaM3).Hidden = True: Rows(LaM1).Hidden = True
End Select
End If
End Sub
---------------
Je présuppose que c'est parceque les 3 macros utilisent la même "formule".
Comment faire pour remédier à cela ?
Lorsque je regroupe les 4 macros dans un même fichier et que je change n'iimporte laquelle des valeurs pilotes, j'obtiens une boîte de dialogue :
"Erreur de Compilation:
Nom ambigu détecté : Worksheet_Change"
ci-dessous les 4 macros utilisées sur la même feuille :
Private Sub Worksheet_Change(ByVal Target As Range)
'Masque les lignes des opérateurs non utilisés
On Error Resume Next
If Not Intersect(Target, [k13]) Is Nothing Then
Cells.EntireRow.Hidden = False
If Target = "2" Then Rows("43:78").EntireRow.Hidden = True
If Target = "3" Then Rows("55:78").EntireRow.Hidden = True
If Target = "4" Then Rows("67:78").EntireRow.Hidden = True
End If
End Sub
-------------
Private Sub Worksheet_Change(ByVal Target As Range)
'Masque les lignes des essais/opérateur non utilisés
On Error Resume Next
If Not Intersect(Target, [k14]) Is Nothing Then
Cells.EntireRow.Hidden = False
If Target = "2" Then Range("21:28,33:40,45:52,57:64,69:76").EntireRow.Hidden = True
If Target = "3" Then Range("22:28,34:40,46:52,58:64,70:76").EntireRow.Hidden = True
If Target = "4" Then Range("23:28,35:40,47:52,59:64,71:76").EntireRow.Hidden = True
If Target = "5" Then Range("24:28,36:41,48:52,60:64,72:76").EntireRow.Hidden = True
If Target = "6" Then Range("25:28,37:41,49:52,61:64,73:76").EntireRow.Hidden = True
If Target = "7" Then Range("26:28,38:41,50:52,62:64,74:76").EntireRow.Hidden = True
If Target = "8" Then Range("27:28,39:41,51:52,63:64,75:76").EntireRow.Hidden = True
If Target = "9" Then Range("28:28,40:41,52:52,64:64,76:76").EntireRow.Hidden = True
End If
End Sub
--------------
Private Sub Worksheet_Change(ByVal Target As Range)
'Masque les colonnes des pièces non utilisées
On Error Resume Next
If Not Intersect(Target, [k12]) Is Nothing Then
Cells.EntireColumn.Hidden = False
If Target = "10" Then Range("N:W").EntireColumn.Hidden = True
If Target = "11" Then Range("O:W").EntireColumn.Hidden = True
If Target = "12" Then Range("P:W").EntireColumn.Hidden = True
If Target = "13" Then Range("Q:W").EntireColumn.Hidden = True
If Target = "14" Then Range("R:W").EntireColumn.Hidden = True
If Target = "15" Then Range("S:W").EntireColumn.Hidden = True
If Target = "16" Then Range("T:W").EntireColumn.Hidden = True
If Target = "17" Then Range("U:W").EntireColumn.Hidden = True
If Target = "18" Then Range("V:W").EntireColumn.Hidden = True
If Target = "19" Then Range("W:W").EntireColumn.Hidden = True
End If
End Sub
--------------
Const cel = "L151"
Const LaM1 = "181:192"
Const LaM2 = "193:204"
Const LaM3 = "169:180"
'Masque les Cas non utilisés (Calcul PV et TV)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cas As String
If Not Intersect(Target, Range(cel)) Is Nothing Then
Cas = Target.Value
Rows("1:" & Rows.Count).Hidden = False
Select Case Cas
Case "Cas 1": Rows(LaM1).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 2 ou 3": Rows(LaM3).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 4": Rows(LaM3).Hidden = True: Rows(LaM1).Hidden = True
End Select
End If
End Sub
---------------
Je présuppose que c'est parceque les 3 macros utilisent la même "formule".
Comment faire pour remédier à cela ?
Mike-31
Messages postés
18352
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
21 décembre 2024
5 110
Modifié par Mike-31 le 22/05/2014 à 13:54
Modifié par Mike-31 le 22/05/2014 à 13:54
Re,
oui tout à fait, tu ne peux utiliser qu'un seul argument Private Sub Worksheet_Change(ByVal Target As Range)
il faut donc empiler les codes à la suite, et placer les variable soit en début de procédure ou au dessus de la procédure comme ci dessous (JE N'AI PAS TESTE CES CODES, JUSTE POUR T'EXPLIQUER)
Const cel = "L151"
Const LaM1 = "181:192"
Const LaM2 = "193:204"
Const LaM3 = "169:180"
Dim Cas As String
Private Sub Worksheet_Change(ByVal Target As Range)
'Masque les lignes des opérateurs non utilisés
On Error Resume Next
If Not Intersect(Target, [k13]) Is Nothing Then
Cells.EntireRow.Hidden = False
If Target = "2" Then Rows("43:78").EntireRow.Hidden = True
If Target = "3" Then Rows("55:78").EntireRow.Hidden = True
If Target = "4" Then Rows("67:78").EntireRow.Hidden = True
End If
If Not Intersect(Target, Range(cel)) Is Nothing Then
Cas = Target.Value
Rows("1:" & Rows.Count).Hidden = False
Select Case Cas
Case "Cas 1": Rows(LaM1).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 2 ou 3": Rows(LaM3).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 4": Rows(LaM3).Hidden = True: Rows(LaM1).Hidden = True
End Select
End If
If Not Intersect(Target, Range(cel)) Is Nothing Then
Cas = Target.Value
Rows("1:" & Rows.Count).Hidden = False
Select Case Cas
Case "Cas 1": Rows(LaM1).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 2 ou 3": Rows(LaM3).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 4": Rows(LaM3).Hidden = True: Rows(LaM1).Hidden = True
End Select
End If
End Sub
A+
Mike-31
Une période d'échec est un moment rêvé pour semer les graines du savoir.
oui tout à fait, tu ne peux utiliser qu'un seul argument Private Sub Worksheet_Change(ByVal Target As Range)
il faut donc empiler les codes à la suite, et placer les variable soit en début de procédure ou au dessus de la procédure comme ci dessous (JE N'AI PAS TESTE CES CODES, JUSTE POUR T'EXPLIQUER)
Const cel = "L151"
Const LaM1 = "181:192"
Const LaM2 = "193:204"
Const LaM3 = "169:180"
Dim Cas As String
Private Sub Worksheet_Change(ByVal Target As Range)
'Masque les lignes des opérateurs non utilisés
On Error Resume Next
If Not Intersect(Target, [k13]) Is Nothing Then
Cells.EntireRow.Hidden = False
If Target = "2" Then Rows("43:78").EntireRow.Hidden = True
If Target = "3" Then Rows("55:78").EntireRow.Hidden = True
If Target = "4" Then Rows("67:78").EntireRow.Hidden = True
End If
If Not Intersect(Target, Range(cel)) Is Nothing Then
Cas = Target.Value
Rows("1:" & Rows.Count).Hidden = False
Select Case Cas
Case "Cas 1": Rows(LaM1).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 2 ou 3": Rows(LaM3).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 4": Rows(LaM3).Hidden = True: Rows(LaM1).Hidden = True
End Select
End If
If Not Intersect(Target, Range(cel)) Is Nothing Then
Cas = Target.Value
Rows("1:" & Rows.Count).Hidden = False
Select Case Cas
Case "Cas 1": Rows(LaM1).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 2 ou 3": Rows(LaM3).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 4": Rows(LaM3).Hidden = True: Rows(LaM1).Hidden = True
End Select
End If
End Sub
A+
Mike-31
Une période d'échec est un moment rêvé pour semer les graines du savoir.
ccm81
Messages postés
10904
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
24 décembre 2024
2 428
22 mai 2014 à 16:26
22 mai 2014 à 16:26
Salut Mike
Avec un exit sub à la fin de chaque if not intersect .... on devrait gagner un ou deux millièmes de seconde ;-)
Avec un exit sub à la fin de chaque if not intersect .... on devrait gagner un ou deux millièmes de seconde ;-)
Mike-31
Messages postés
18352
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
21 décembre 2024
5 110
22 mai 2014 à 16:37
22 mai 2014 à 16:37
Salut ccm,
Oui certainement mais comme je le disais au début du post c'était un exemple d'empilement et je n'ai ni testé ni interprété le code qu'il faudrait, soit poursuivre ta proposition avec Select Case ou avec la cellule active Target.
Mais bon on va laisser travailler dans son intérêt d'apprendre, notre ami Kevin
Bonne après midi à toi
Mike-31
Oui certainement mais comme je le disais au début du post c'était un exemple d'empilement et je n'ai ni testé ni interprété le code qu'il faudrait, soit poursuivre ta proposition avec Select Case ou avec la cellule active Target.
Mais bon on va laisser travailler dans son intérêt d'apprendre, notre ami Kevin
Bonne après midi à toi
Mike-31
J'ai pris sur moi d'essayer pendant ma pause,... conscience professionnelle (sans compter l'envie d'apprendre et comprendre) quand tu nous tiens...
Bref voici le code complet :
Const cel = "k150"
Const LaM1 = "180:191"
Const LaM2 = "192:203"
Const LaM3 = "169:179"
Dim Cas As String
Private Sub Worksheet_Change(ByVal Target As Range)
'Masque les colonnes des pièces non utilisées
On Error Resume Next
If Not Intersect(Target, [k12]) Is Nothing Then
Cells.EntireColumn.Hidden = False
If Target = "10" Then Range("N:W").EntireColumn.Hidden = True
If Target = "11" Then Range("O:W").EntireColumn.Hidden = True
If Target = "12" Then Range("P:W").EntireColumn.Hidden = True
If Target = "13" Then Range("Q:W").EntireColumn.Hidden = True
If Target = "14" Then Range("R:W").EntireColumn.Hidden = True
If Target = "15" Then Range("S:W").EntireColumn.Hidden = True
If Target = "16" Then Range("T:W").EntireColumn.Hidden = True
If Target = "17" Then Range("U:W").EntireColumn.Hidden = True
If Target = "18" Then Range("V:W").EntireColumn.Hidden = True
If Target = "19" Then Range("W:W").EntireColumn.Hidden = True
End If
'---------------------------------------------------
'Masque les lignes des opérateurs non utilisés
On Error Resume Next
If Not Intersect(Target, [k13]) Is Nothing Then
Rows("18:80").Hidden = False
If Target = "2" Then Rows("43:78").EntireRow.Hidden = True
If Target = "3" Then Rows("55:78").EntireRow.Hidden = True
If Target = "4" Then Rows("67:78").EntireRow.Hidden = True
End If
'---------------------------------------------------
'Masque les lignes des essais/opérateur non utilisés
On Error Resume Next
If Not Intersect(Target, [k14]) Is Nothing Then
'Cells.EntireRow.Hidden = False en commentaire ou supprimé car démasque toutes les lignes
If Target = "2" Then Range("21:28,33:40,45:52,57:64,69:76").EntireRow.Hidden = True
If Target = "3" Then Range("22:28,34:40,46:52,58:64,70:76").EntireRow.Hidden = True
If Target = "4" Then Range("23:28,35:40,47:52,59:64,71:76").EntireRow.Hidden = True
If Target = "5" Then Range("24:28,36:41,48:52,60:64,72:76").EntireRow.Hidden = True
If Target = "6" Then Range("25:28,37:41,49:52,61:64,73:76").EntireRow.Hidden = True
If Target = "7" Then Range("26:28,38:41,50:52,62:64,74:76").EntireRow.Hidden = True
If Target = "8" Then Range("27:28,39:41,51:52,63:64,75:76").EntireRow.Hidden = True
If Target = "9" Then Range("28:28,40:41,52:52,64:64,76:76").EntireRow.Hidden = True
End If
'---------------------------------------------------
'Masque les Cas non utilisés (Calcul PV et TV)
If Not Intersect(Target, Range(cel)) Is Nothing Then
Cas = Target.Value
Rows("151:204").Hidden = False
Select Case Cas
Case "Cas 1": Rows(LaM1).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 2 ou 3": Rows(LaM3).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 4": Rows(LaM3).Hidden = True: Rows(LaM1).Hidden = True
End Select
End If
'---------------------------------------------------
End Sub
Grâce à vous et en décryptant à ma manière le principe j'y suis arrivé, en peu de temps.
Seul "hic" dans ce code la macro "nb d'essai / opérateur" est prioritaire par rapport à "nb opérateur" du coup j'ai du passer en commentaire la ligne de commande qui démasque toutes les lignes au début de "nb d'essais / opérateur".
Bref ça fonctionne comme je le souhaitais à la base !
Un grand merci à Mike-31 et ccm81 pour leur aide et explications !
A moins qu'il existe une solution pour éviter que l'une des macro soit prioritaire sur l'autre (sans rentrer les nombreux cas, de mixage des 2, possibles un par un) sinon pour moi le sujet est clos.
Bonne fin de semaine à tous.
Kevin
Bref voici le code complet :
Const cel = "k150"
Const LaM1 = "180:191"
Const LaM2 = "192:203"
Const LaM3 = "169:179"
Dim Cas As String
Private Sub Worksheet_Change(ByVal Target As Range)
'Masque les colonnes des pièces non utilisées
On Error Resume Next
If Not Intersect(Target, [k12]) Is Nothing Then
Cells.EntireColumn.Hidden = False
If Target = "10" Then Range("N:W").EntireColumn.Hidden = True
If Target = "11" Then Range("O:W").EntireColumn.Hidden = True
If Target = "12" Then Range("P:W").EntireColumn.Hidden = True
If Target = "13" Then Range("Q:W").EntireColumn.Hidden = True
If Target = "14" Then Range("R:W").EntireColumn.Hidden = True
If Target = "15" Then Range("S:W").EntireColumn.Hidden = True
If Target = "16" Then Range("T:W").EntireColumn.Hidden = True
If Target = "17" Then Range("U:W").EntireColumn.Hidden = True
If Target = "18" Then Range("V:W").EntireColumn.Hidden = True
If Target = "19" Then Range("W:W").EntireColumn.Hidden = True
End If
'---------------------------------------------------
'Masque les lignes des opérateurs non utilisés
On Error Resume Next
If Not Intersect(Target, [k13]) Is Nothing Then
Rows("18:80").Hidden = False
If Target = "2" Then Rows("43:78").EntireRow.Hidden = True
If Target = "3" Then Rows("55:78").EntireRow.Hidden = True
If Target = "4" Then Rows("67:78").EntireRow.Hidden = True
End If
'---------------------------------------------------
'Masque les lignes des essais/opérateur non utilisés
On Error Resume Next
If Not Intersect(Target, [k14]) Is Nothing Then
'Cells.EntireRow.Hidden = False en commentaire ou supprimé car démasque toutes les lignes
If Target = "2" Then Range("21:28,33:40,45:52,57:64,69:76").EntireRow.Hidden = True
If Target = "3" Then Range("22:28,34:40,46:52,58:64,70:76").EntireRow.Hidden = True
If Target = "4" Then Range("23:28,35:40,47:52,59:64,71:76").EntireRow.Hidden = True
If Target = "5" Then Range("24:28,36:41,48:52,60:64,72:76").EntireRow.Hidden = True
If Target = "6" Then Range("25:28,37:41,49:52,61:64,73:76").EntireRow.Hidden = True
If Target = "7" Then Range("26:28,38:41,50:52,62:64,74:76").EntireRow.Hidden = True
If Target = "8" Then Range("27:28,39:41,51:52,63:64,75:76").EntireRow.Hidden = True
If Target = "9" Then Range("28:28,40:41,52:52,64:64,76:76").EntireRow.Hidden = True
End If
'---------------------------------------------------
'Masque les Cas non utilisés (Calcul PV et TV)
If Not Intersect(Target, Range(cel)) Is Nothing Then
Cas = Target.Value
Rows("151:204").Hidden = False
Select Case Cas
Case "Cas 1": Rows(LaM1).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 2 ou 3": Rows(LaM3).Hidden = True: Rows(LaM2).Hidden = True
Case "Cas 4": Rows(LaM3).Hidden = True: Rows(LaM1).Hidden = True
End Select
End If
'---------------------------------------------------
End Sub
Grâce à vous et en décryptant à ma manière le principe j'y suis arrivé, en peu de temps.
Seul "hic" dans ce code la macro "nb d'essai / opérateur" est prioritaire par rapport à "nb opérateur" du coup j'ai du passer en commentaire la ligne de commande qui démasque toutes les lignes au début de "nb d'essais / opérateur".
Bref ça fonctionne comme je le souhaitais à la base !
Un grand merci à Mike-31 et ccm81 pour leur aide et explications !
A moins qu'il existe une solution pour éviter que l'une des macro soit prioritaire sur l'autre (sans rentrer les nombreux cas, de mixage des 2, possibles un par un) sinon pour moi le sujet est clos.
Bonne fin de semaine à tous.
Kevin
Bonjour à tous,
je m'en remet de nouveau à vous concernant ce fichier et pour une raison similaire, d'où l'intérêt de rester sur le même fil.
J'ai fait une petite erreur dans mon tout premier message :
"Les cellules pilotes sont auto-renseignées par des formules" : CE N'EST PAS VRAI
Jusque là je ne m'en était pas rendu compte (bien vu l'aveugle !) mais...
Mes cellules pilotes (pour les cas présentés jusque là) sont saisies par l'utilisateur du fichier, même si la saisie est restreinte via une liste de validation.
Bref avec les codes ci-dessus ça fonctionne.
Or à un endroit dans ce fichier j'ai le cas réel où c'est une cellule pilotée par une formule (qui renvoie la valeur "1" ou "2"). Et dans ce cas, même en "adaptant" (avec mes très faibles connaissances qui se limitent à des modif mineures de vos macros) les 2 types de macros (If Target / Select Case) vues plus haut : ça ne fonctionne pas automatiquement.
Je m'explique :
- la cellule pilote passe bien de 1 à 2 seule [ =si(blabla;1;2) ]
- mais rien ne se masque automatiquement
- cependant, lorsqu'on appui sur "F2" puis "entrée" dans cette cellule pilote, là, la macro s'exécute et les lignes souhaitées s'affichent tandis que d'autres se masquent.
- = idem à ci-dessus si au lieu d'une formule c'est l'utilisateur qui saisit manuellement "1" ou "2" dans la cellule pilote (ça c'est logique).
Bref j'en déduis que pour VBA, un résultat de formule dans une cellule n'est pas l'équivalent d'une saisie manuelle (ou choix manuel dans une liste).
Y-a-t'il une astuce pour y arriver ?
En écrivant cette demande je me dis qu'en demandant à VBA de sélectionner la cellule pilote en début de macro ça pourrait suffire...
Merci d'avance
Kevin
je m'en remet de nouveau à vous concernant ce fichier et pour une raison similaire, d'où l'intérêt de rester sur le même fil.
J'ai fait une petite erreur dans mon tout premier message :
"Les cellules pilotes sont auto-renseignées par des formules" : CE N'EST PAS VRAI
Jusque là je ne m'en était pas rendu compte (bien vu l'aveugle !) mais...
Mes cellules pilotes (pour les cas présentés jusque là) sont saisies par l'utilisateur du fichier, même si la saisie est restreinte via une liste de validation.
Bref avec les codes ci-dessus ça fonctionne.
Or à un endroit dans ce fichier j'ai le cas réel où c'est une cellule pilotée par une formule (qui renvoie la valeur "1" ou "2"). Et dans ce cas, même en "adaptant" (avec mes très faibles connaissances qui se limitent à des modif mineures de vos macros) les 2 types de macros (If Target / Select Case) vues plus haut : ça ne fonctionne pas automatiquement.
Je m'explique :
- la cellule pilote passe bien de 1 à 2 seule [ =si(blabla;1;2) ]
- mais rien ne se masque automatiquement
- cependant, lorsqu'on appui sur "F2" puis "entrée" dans cette cellule pilote, là, la macro s'exécute et les lignes souhaitées s'affichent tandis que d'autres se masquent.
- = idem à ci-dessus si au lieu d'une formule c'est l'utilisateur qui saisit manuellement "1" ou "2" dans la cellule pilote (ça c'est logique).
Bref j'en déduis que pour VBA, un résultat de formule dans une cellule n'est pas l'équivalent d'une saisie manuelle (ou choix manuel dans une liste).
Y-a-t'il une astuce pour y arriver ?
En écrivant cette demande je me dis qu'en demandant à VBA de sélectionner la cellule pilote en début de macro ça pourrait suffire...
Merci d'avance
Kevin
ccm81
Messages postés
10904
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
24 décembre 2024
2 428
11 juin 2014 à 14:09
11 juin 2014 à 14:09
peut être comme ceci
- la cellule pilote passe bien de 1 à 2 seule [ =si(blabla;1;2) ]
Donc c'est la/les cellule/s figurant dans blabla qui changent donc les prendre en compte dans le if not intersect .....
Cdlmnt
- la cellule pilote passe bien de 1 à 2 seule [ =si(blabla;1;2) ]
Donc c'est la/les cellule/s figurant dans blabla qui changent donc les prendre en compte dans le if not intersect .....
Cdlmnt
Merci ccm81 pour ta réponse.
En remontant aux données d'origine qui font bouger toutes les cellules "formules" j'arrive à :
si une cellule située dans : H10:H12 ; K12:K14 ; D19:W28 ; D32:W41 ; D45:W54 ; D58:W67 ; D71:W80 est manuellement changée alors le résultat de J158 [ =si(blabla;1;2) ] doit être regardé et en fonction de sa valeur :
1 : lignes 170:186 et 210:226 doivent se masquer
2 : lignes 187:203 et 227:243 doivent se masquer
On Error Resume Next
If Not Intersect(Target, [j163]) Is Nothing Then
Rows("170:243").EntireRow.Hidden = False
If Target = "1" Then Range("170:186,210:226").EntireRow.Hidden = True
If Target = "2" Then Range("187:203,227:243").EntireRow.Hidden = True
End If
Si je comprend bien la deuxième partie de ma macro est bonne (logique car fonctionne si changement manuel) et je n'aurais qu'à incorporer les cellules qui sont manuellement changeables dans "Target". Mais comment ?
Merci d'avance
En remontant aux données d'origine qui font bouger toutes les cellules "formules" j'arrive à :
si une cellule située dans : H10:H12 ; K12:K14 ; D19:W28 ; D32:W41 ; D45:W54 ; D58:W67 ; D71:W80 est manuellement changée alors le résultat de J158 [ =si(blabla;1;2) ] doit être regardé et en fonction de sa valeur :
1 : lignes 170:186 et 210:226 doivent se masquer
2 : lignes 187:203 et 227:243 doivent se masquer
On Error Resume Next
If Not Intersect(Target, [j163]) Is Nothing Then
Rows("170:243").EntireRow.Hidden = False
If Target = "1" Then Range("170:186,210:226").EntireRow.Hidden = True
If Target = "2" Then Range("187:203,227:243").EntireRow.Hidden = True
End If
Si je comprend bien la deuxième partie de ma macro est bonne (logique car fonctionne si changement manuel) et je n'aurais qu'à incorporer les cellules qui sont manuellement changeables dans "Target". Mais comment ?
Merci d'avance
du coup j'ai tenté :
On Error Resume Next
If Not Intersect(Target, Range("H10:H12,K12:K14,D19:W28,D32:W41,D45:W54,D58:W67,D71:W80")) Is Nothing Then
Rows("170:243").EntireRow.Hidden = False
If Cells("j163") = 1 Then Range("170:186,210:226").EntireRow.Hidden = True
If Cells("j163") = 2 Then Range("187:203,227:243").EntireRow.Hidden = True
End If
Mais il me cache toutes les lignes tout le temps... (au moins il m'en cache)
Où se trouve mon erreur ?
On Error Resume Next
If Not Intersect(Target, Range("H10:H12,K12:K14,D19:W28,D32:W41,D45:W54,D58:W67,D71:W80")) Is Nothing Then
Rows("170:243").EntireRow.Hidden = False
If Cells("j163") = 1 Then Range("170:186,210:226").EntireRow.Hidden = True
If Cells("j163") = 2 Then Range("187:203,227:243").EntireRow.Hidden = True
End If
Mais il me cache toutes les lignes tout le temps... (au moins il m'en cache)
Où se trouve mon erreur ?
ccm81
Messages postés
10904
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
24 décembre 2024
2 428
12 juin 2014 à 13:28
12 juin 2014 à 13:28
Peut être que ça vient de là?
alors le résultat de J158 [ =si(blabla;1;2) ]
If Cells("j163") = 1 Then Range("170:186,210:226").EntireRow.Hidden = True
alors le résultat de J158 [ =si(blabla;1;2) ]
If Cells("j163") = 1 Then Range("170:186,210:226").EntireRow.Hidden = True
Mike-31
Messages postés
18352
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
21 décembre 2024
5 110
12 juin 2014 à 13:31
12 juin 2014 à 13:31
Re,
Si c'est la cellule qui pilote la macro, il faut écrire
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, [J163]) Is Nothing Then
Rows("170:243").EntireRow.Hidden = False
If Cells("J163") = 1 Then Range("170:195,210:226").EntireRow.Hidden = True
If Cells("J163") = 2 Then Range("187:203,227:243").EntireRow.Hidden = True
End If
End Sub
par contre si c'est les cellule de la colonne J
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, Union([H10:H12], [K12:K14], [D19:W28], [D32:W41], [D45:W54], [D58:W67], [D71:W80])) Is Nothing Then
Rows("170:243").EntireRow.Hidden = False
If Cells("J163") = 1 Then Range("170:195,210:226").EntireRow.Hidden = True
If Cells("J163") = 2 Then Range("187:203,227:243").EntireRow.Hidden = True
End If
End Sub
Si c'est la cellule qui pilote la macro, il faut écrire
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, [J163]) Is Nothing Then
Rows("170:243").EntireRow.Hidden = False
If Cells("J163") = 1 Then Range("170:195,210:226").EntireRow.Hidden = True
If Cells("J163") = 2 Then Range("187:203,227:243").EntireRow.Hidden = True
End If
End Sub
par contre si c'est les cellule de la colonne J
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, Union([H10:H12], [K12:K14], [D19:W28], [D32:W41], [D45:W54], [D58:W67], [D71:W80])) Is Nothing Then
Rows("170:243").EntireRow.Hidden = False
If Cells("J163") = 1 Then Range("170:195,210:226").EntireRow.Hidden = True
If Cells("J163") = 2 Then Range("187:203,227:243").EntireRow.Hidden = True
End If
End Sub
Mike-31
Messages postés
18352
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
21 décembre 2024
5 110
12 juin 2014 à 22:42
12 juin 2014 à 22:42
Re,
effectivement si J163 pilote le code et contient une formule cela ne fonctionnera pas.
Quel est la formule en J163
effectivement si J163 pilote le code et contient une formule cela ne fonctionnera pas.
Quel est la formule en J163
Re,
J163 : =si(J158<=J162;"1";"2")
J158 fait appel à d'autres cellules formule, idem pour J162.
Si on remonte jusqu'à des cellules rentrées manuellement on obtient la plage :
Union([H10:H12], [K12:K14], [D19:W28], [D32:W41], [D45:W54], [D58:W67], [D71:W80])
Et là si n'importe laquelle de ces cases est changée ça peut faire évoluer le résultat final.
J163 : =si(J158<=J162;"1";"2")
J158 fait appel à d'autres cellules formule, idem pour J162.
Si on remonte jusqu'à des cellules rentrées manuellement on obtient la plage :
Union([H10:H12], [K12:K14], [D19:W28], [D32:W41], [D45:W54], [D58:W67], [D71:W80])
Et là si n'importe laquelle de ces cases est changée ça peut faire évoluer le résultat final.
Mike-31
Messages postés
18352
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
21 décembre 2024
5 110
13 juin 2014 à 10:19
13 juin 2014 à 10:19
Re,
colle dans les propriétés de ta feuille ce code et teste
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, Union([H10:H12], [K12:K14], [D19:W28], [D32:W41], [D45:W54], [D58:W67], [D71:W80])) Is Nothing Then
Rows("170:243").EntireRow.Hidden = False
If [J163] = 1 Then [170:195,210:226].EntireRow.Hidden = True
If [J163] = 2 Then [187:203,227:243].EntireRow.Hidden = True
End If
End Sub
colle dans les propriétés de ta feuille ce code et teste
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, Union([H10:H12], [K12:K14], [D19:W28], [D32:W41], [D45:W54], [D58:W67], [D71:W80])) Is Nothing Then
Rows("170:243").EntireRow.Hidden = False
If [J163] = 1 Then [170:195,210:226].EntireRow.Hidden = True
If [J163] = 2 Then [187:203,227:243].EntireRow.Hidden = True
End If
End Sub
Merci Mike31 !!!
C'est exactement ce qu'il me fallait. Enfin j'ai du remettre 186 au lieu de 195 mais ça fonctionne parfaitement comme je le souhaitait.
Grâce à ça mon fichier fait exactement ce que je voulais !
Il faut donc prendre en compte uniquement les cellules que l'utilisateur change manuellement et utiliser "Union".
Grand merci !
Merci aussi à ccm81 pour son aide.
Sujet totalement clos !
C'est exactement ce qu'il me fallait. Enfin j'ai du remettre 186 au lieu de 195 mais ça fonctionne parfaitement comme je le souhaitait.
Grâce à ça mon fichier fait exactement ce que je voulais !
Il faut donc prendre en compte uniquement les cellules que l'utilisateur change manuellement et utiliser "Union".
Grand merci !
Merci aussi à ccm81 pour son aide.
Sujet totalement clos !