XL 2019 Activer une macro à partir du contenu d'une cellule

thibaut93800

XLDnaute Nouveau
Bonjour,

Je suis novice en macro et je cherche à modifier une macro que j'avais faite.
Aujourd'hui je voudrais que la macro s'active en fonction du résultat d'une formule présente dans une cellule.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("C17:J17")) Is Nothing Then
Select Case Target.Value

Case "VERIFICATION - X"
Sheets("X").Visible = True
Sheets("Y").Visible = False
Sheets("Z").Visible = False

Case "VERIFICATION - Y"
Sheets("X").Visible = False
Sheets("Y").Visible = True
Sheets("Z").Visible = False

Case "VERIFICATION - Z"
Sheets("X").Visible = False
Sheets("Y").Visible = False
Sheets("Z").Visible = True

End Select
End If
End Sub


Actuellement je suis obligé de cliquer et valider la Cellule C17 pour activer la macro. Quelqu'un a t'il une idée sur l'automatisation de la macro. Merci d'avance
 

Fichiers joints

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Thibault,
Avec un Worksheet_Calculate. par contre c'est lourd il sera exécuté à chaque recalcul de la feuille. A éviter, mais ça fait ce que vous voulez. :)
VB:
Private Sub Worksheet_Calculate()
Select Case [C17]
    Case "VERIFICATION - X"
        Sheets("X").Visible = True
        Sheets("Y").Visible = False
        Sheets("Z").Visible = False
    Case "VERIFICATION - Y"
        Sheets("X").Visible = False
        Sheets("Y").Visible = True
        Sheets("Z").Visible = False
    Case "VERIFICATION - Z"
        Sheets("X").Visible = False
        Sheets("Y").Visible = False
        Sheets("Z").Visible = True
End Select
End Sub
 

Fichiers joints

soan

XLDnaute Accro
Bonjour Thibaut, sylvanu,

ou peut-être à l'ouverture du classeur :
VB:
Private Sub Workbook_Open()
  Application.ScreenUpdating = 0
  Worksheets("X").Visible = 0: Worksheets("Y").Visible = 0: Worksheets("Z").Visible = 0
  Select Case Right$([C17], 1)
    Case "X": Worksheets("X").Visible = -1
    Case "Y": Worksheets("Y").Visible = -1
    Case "Z": Worksheets("Z").Visible = -1
  End Select
End Sub
attention : utiliser ce code seulement s'il y a au moins une autre feuille visible !!!

soan
 

Phil69970

XLDnaute Occasionnel
Bonjour Thibaut, sylvanu, Soan

Légèrement hors sujet car les feuilles s'affichent/masquent directement sur le choix de la cellule C11

VB:
Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Intersect(Target, Range("C11")) Is Nothing And Target.Value <> "" Then
    For n = 2 To 4
        If n = Target.Value Then Sheets(n).Visible = True Else Sheets(n).Visible = False
    Next
    Sheets(Target.Value).Visible = True
End If
End Sub
@Phil69970
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re bonjour tout le monde,
Ou encore plus simple, ne demande rien d'autre qu'un clic, encore plus simple qu'une liste déroulante :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, Range("C10:C12")) Is Nothing Then
    Application.ScreenUpdating = False
    Select Case Target
        Case "X"
            Sheets("X").Visible = True
            Sheets("Y").Visible = False
            Sheets("Z").Visible = False
        Case "Y"
            Sheets("X").Visible = False
            Sheets("Y").Visible = True
            Sheets("Z").Visible = False
        Case "Z"
            Sheets("X").Visible = False
            Sheets("Y").Visible = False
            Sheets("Z").Visible = True
    End Select
End If
End Sub
 

Fichiers joints

soan

XLDnaute Accro
Bonjour @Phil69970, le fil,

Si j'ai bien compris ton code VBA, ça teste C11 qui contient 1, 2, ou 3 ; donc l'index
de la feuille à afficher ou masquer ; effectivement, c'est un peu hors sujet puisque
dans l'énoncé, c'est selon le nom d'une feuille, dont on ne connaît pas la position
dans le classeur.

D'autre part, même pour un index de feuille, je crois que ton code marcherait
tout aussi bien sans Sheets(Target.Value).Visible = True puisque c'est déjà fait
par la ligne If, quand n = Target.Value ; je te laisse vérifier.

soan
 

Phil69970

XLDnaute Occasionnel
Soan
Tu as raison
D'autre part, même pour un index de feuille, je crois que ton code marcherait
tout aussi bien sans Sheets(Target.Value).Visible = True puisque c'est déjà fait
par la ligne If, quand n = Target.Value ; je te laisse vérifier.
Ce code suffit :
VB:
Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Intersect(Target, Range("C11")) Is Nothing And Target.Value <> "" Then
    For n = 2 To 4
        Sheets(n).Visible = False
    Next
    Sheets(Target.Value).Visible = True
End If
End Sub
c'est selon le nom d'une feuille, dont on ne connaît pas la position
dans le classeur.
Je suis parti de son exemple avec la 1ere feuille "Fiche"
Ce code fonctionne QUE si la 1ere feuille est la feuille "Fiche" puisque la boucle demarre à la 2eme feuille.

@Phil69970
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas