IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Déclencher Activate (d'une feuille) depuis une autre feuille [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 630
    Points : 164
    Points
    164
    Par défaut Déclencher Activate (d'une feuille) depuis une autre feuille
    Bonjour,

    Le code suivant ouvre une Feuille (Fiche) par son Index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
    Dim Plage As Range
    Dim Fiche As String
     
        Set Plage = Me.Range("Q3:Q172")                  'Plage des NOMS concaténés
     
        On Error Resume Next
     
        If Not Intersect(Target, Plage) Is Nothing And Target.Count = 1 Then
            Application.EnableEvents = False
                Fiche = Target.Offset(0, 1).Value
                If Not Worksheets(Fiche) Is Nothing Then
                    Worksheets(Fiche).Activate           'activation de la Fiche par son Index
                Else
                    MsgBox "La Fiche '" & Fiche & "' n'existe pas.", vbExclamation, "Erreur"
                End If
            Application.EnableEvents = True
        End If
     
        On Error GoTo 0
    End Sub
    Code de Feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Worksheet_Activate() 'optimisé
     
        'blabla
    End sub
    Le code de la Feuille Worksheet_Activate() fonctionne parfaitement si je navigue de feuille en feuille mais pas si la feuille est activée depuis une procédure située sur une autre feuille.

    En espérant avoir été clair, je vous remercie par avance pour vos lumières,
    Cdt

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 025
    Points : 29 112
    Points
    29 112
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Le code de la Feuille Worksheet_Activate() fonctionne parfaitement si je navigue de feuille en feuille mais pas si la feuille est activée depuis une procédure située sur une autre feuille.
    Pourquoi utilisez-vous l'instruction On Error Resume Next dans votre code. Il y a de forte chance que la variable "Fiche" contienne un nom qui ne correspond pas à une feuille.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 630
    Points : 164
    Points
    164
    Par défaut
    Bonjour Philippe,

    Les Fiches sont bien accessibles ; le problème est qu'une fois la Fiche sélectionnée, le code "Activate" (de Feuille) ne s'exécute pas.
    Ci-après une partie du code de chaque Fiche.
    Nota : tout va bien si je passe de Fiche en Fiche mais pas si la Fiche est ouverte depuis la procédure n°1 (mon premier message)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_Activate() 
     
        Position_Fiche_Actu = "Fiche " & ActiveSheet.Name & "/" & ActiveWorkbook.Sheets.Count - 2
     
        Application.EnableEvents = False
        [b11] = Position_Fiche_Actu
     
    etc.
    Cdt

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 025
    Points : 29 112
    Points
    29 112
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    le problème est qu'une fois la Fiche sélectionnée, le code "Activate" (de Feuille) ne s'exécute pas
    C'est tout à fait normal. Si la feuille est active, l'événement Activate ne peut être déclenché.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 630
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    Donc, il n'y a pas de solution pour que le code qui suit s'exécute (si je le laisse dans le code de chaque Fiche) ?

    Position_Fiche_Actu = "Fiche " & ActiveSheet.Name & "/" & ActiveWorkbook.Sheets.Count - 2
    Cdt

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 025
    Points : 29 112
    Points
    29 112
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Donc, il n'y a pas de solution pour que le code qui suit s'exécute (si je le laisse dans le code de chaque Fiche) ?
    Un événement Worksheet_Activate ne s'enclenche que si l'on active une feuille donc si la feuille est déjà active, il n'y a pas d'événement. De même l'événement Worksheet_SelectionChange n'est détecté qu'à condition que l'on change de sélection de cellule. C'est le principe de la procédure événementielle

    Pour information, si l'on doit utiliser la même procédure événementielle sur toutes les feuilles d'un classeur, il est préférable d'utiliser les procédures événementielles du classeur (ThisWorkbook) préfixées Workbook_Sheet ainsi pour ce cas bien précis, la procédure Workbook_SheetActivate.

    A lire éventuellement Les évènements du module objet ThisWorkbook, dans Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 414
    Points : 2 062
    Points
    2 062
    Par défaut
    Bonjour,

    J'ajouterai que tu désactives les évènements, donc les procédures évènementiels ne peuvent pas s'exécuter dans tous les cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            Application.EnableEvents = False    '// Desactivation des evenements
                Fiche = Target.Offset(0, 1).Value
                If Not Worksheets(Fiche) Is Nothing Then
                    Worksheets(Fiche).Activate           'activation de la Fiche par son Index
                                                         '// Les evenements sont désactivés, la procédure Worksheet_Activate n'est pas executée
                Else
                    MsgBox "La Fiche '" & Fiche & "' n'existe pas.", vbExclamation, "Erreur"
                End If
            Application.EnableEvents = True

  8. #8
    Membre averti
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 192
    Points : 328
    Points
    328
    Par défaut re
    bonjour
    mais bien sur que si tu peux le faire ,Bien que je ne vois pas trop l'intérêt

    les modules Feuil sont des modules classe aussi a part entière
    parti de là les fonctions en public sont accessibles

    et en ce qui concerne le activate ben tu le met en public et tu l'appelle d’où tu veux

    c'est pas compliqué

    Attention!!!!!!!!!!!!!!!!!
    si tu dois agir par l’intermédiaire d'une autre feuille sur le activate d'une autre
    dans le code la feuille dans l'event activate doit être explicitement signifiée

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 630
    Points : 164
    Points
    164
    Par défaut
    Bonjour et merci à tous,

    @Philippe :

    Je peux donc remplacer mes procédures événementielles de chaque feuille en déplaçant le code dans ThisWorkbook :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    'code
    End Sub
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    'code
    End Sub
     
    Private Sub Workbook_Activate(ByVal Sh As Object, ByVal Target As Range)
    'code
    End Sub
    Si oui, il faut que ce code affecte toutes les fiches (existantes ou à créer) sauf la Feuil01 et Feuil02 (qui ne changeront jamais de nom) ; j'imagine qu'il est possible de limiter ces événements à toute autre Feuille ?

    Si oui, le code qui suit est compatible avec ce "déplacement" ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    'doivent impérativement être placées TOUT EN HAUT DU MODULE
    Private Declare Function CloseClipboard Lib "user32" () As Long
    Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function EmptyClipboard Lib "user32" () As Long
     
    Private Sub Worksheet_Activate() 
     
        On Error GoTo suite
     
        Application.EnableEvents = False
     
        Me.Range(Me.Cells(1, 1), Me.Cells(40, 16)).Select
     
        With ActiveWindow
            .ScrollRow = 3
            .ScrollColumn = 1
            .Zoom = True
            .Zoom = .Zoom - 0.5       '
        End With                                  
     
    suite:
        RetourSelection                          
        Application.EnableEvents = True
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Dim CellRetourBase As String 
    Dim CellMenuOptions As String 
    Dim CellOpenPhotos As String 
    Dim CellScrollTop As String 
    Dim ActionCells As Object 
     
        OpenClipboard 0
        EmptyClipboard
        CloseClipboard
     
        CellRetourBase = "B2"
        CellMenuOptions = "T2"
        CellOpenPhotos = "T4"
        CellScrollTop = "B53"
     
        Set ActionCells = CreateObject("Scripting.Dictionary")  
            ActionCells.Add CellRetourBase, "AllerBaseIM"
            ActionCells.Add CellMenuOptions, "MenuOptions"
            ActionCells.Add CellOpenPhotos, "AccesPhotos"
            ActionCells.Add CellScrollTop, "ScrollTop"
     
        On Error GoTo Fin
     
        If Not Intersect(Target, Me.Range(CellRetourBase & "," & CellMenuOptions & "," & CellOpenPhotos & "," & CellScrollTop)) Is Nothing Then
            RetourSelection
            If ActionCells.exists(Target.Address(False, False)) Then
                Select Case ActionCells(Target.Address(False, False))
                    Case "AllerBaseToto": AllerBaseIM
                    Case "MenuOptions": If Authentification() Then UF_Menu_Options.Show
                    Case "AccesPhotos": Accès_Rép_Photos
                    Case "ScrollTop"
                        With ActiveWindow
                            .ScrollRow = 2
                            .ScrollColumn = 1
                        End With
                End Select
            End If
        End If
     
    Fin:
        On Error Resume Next
        Set ActionCells = Nothing  
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Wsh
     
        If [l6] = "Doublon" Then
            MsgBox "Doublon !" & Chr(10) & Chr(10) & _
                "Sélectionnez un autre nom dans la liste qui va s'ouvrir !", vbCritical, "Alerte !"
            Range("F4").ClearContents
            Set Wsh = CreateObject("WScript.Shell")
                Wsh.SendKeys "%{Down}", True
            Set Wsh = Nothing
        End If    
    End Sub
    Cdt

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 025
    Points : 29 112
    Points
    29 112
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je peux donc remplacer mes procédures événementielles de chaque feuille en déplaçant le code dans ThisWorkbook
    Oui mais cela n'a d'intérêt que si les événements doivent vraiment être intercepté par un maximum de feuilles.


    Si oui, il faut que ce code affecte toutes les fiches (existantes ou à créer) sauf la Feuil01 et Feuil02 (qui ne changeront jamais de nom) ; j'imagine qu'il est possible de limiter ces événements à toute autre Feuille ?
    Un événement préfixé Workbook_Sheet concerne toutes feuilles y compris celles qui devraient être ajoutées et donc si l'on souhaite que l'événement ne concerne que certaines feuilles, il faudra utiliser une structures décisionnelles comme If...Then...Else ou un Select Case.
    Pour éviter les problèmes, il est préférable d'utiliser la propriété CodeName d'une feuille plutôt que son nom et encore moins son numéro
    Je ne comprends pas la raison d'utiliser l'instruction Application.EnableEvents = False pour l'événement Activate. On l'utilise en général pour l'événement Change si l'on doit écrire dans une cellule lorsque cet événement est intercepté pour éviter que l'événement ne boucle sur lui même.

    Exemple
    L'affichage du nom de la feuille se fera sur toutes les feuilles activées sauf pour celles dont le CodeName est sht_Parameter ou sht_Menu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
       With Sh
         Select Case .CodeName
           Case "sht_Parameter", "sht_Menu"
           Case Else
             MsgBox "Vous avez activé la feuille " & .Name
         End Select
       End With
    End Sub
    Lire éventuellement VBA Excel - Comment s’affranchir de la modification du nom de la feuille en utilisant son CodeName
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 630
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    Merci pour le lien !

    Oui mais cela n'a d'intérêt que si les événements doivent vraiment être intercepté par un maximum de feuilles.
    Oui, entre 90 et 200 Fiches

    Je ne comprends pas la raison d'utiliser l'instruction Application.EnableEvents = False pour l'événement Activate.
    Pour éviter la procédure Private Sub Worksheet_SelectionChange(ByVal Target as Range au Select de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Range(Me.Cells(1, 1), Me.Cells(40, 16)).Select
    Et si je remplace .Select par .Activate, le "SelectionChange (...)" va se déclencher au :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub RetourSelection()  
        Me.Range("D2").Select
    End Sub
    et je souhaite que D2 soit effectivement sélectionné.

    Je retiens la solution de Select Case pour exclure Feuil01(blabla) et Feuil02(blabla) qui sont pour moi les CodeNames.

    Un gros doute... puis-je reprendre le CodeName comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
       With Sh
         Select Case .CodeName
           Case Feuil01, Feuil02
           Case Else
             MsgBox "Vous avez activé la feuille " & .Name
         End Select
       End With
    End Sub
    Je préfère avoir des numéros pour les fiches, ce qui évite, vu le nombre, d'avoir à "naviguer" horizontalement.

    Pour info, voici comment je nomme mes fiches créées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Index_Last_F = ActiveWorkbook.Sheets.Count
        Nom_Last_F = Sheets(Index_Last_F).Name
     
        Application.EnableEvents = False                            'Attention !
             Sheets(Index_Last_F).Select
             ThisWorkbook.Unprotect "toto"
                 ActiveSheet.Copy After:=ActiveSheet
                 With ActiveSheet
                     .Name = Nom_Last_F + 1
                     .Unprotect Password:="toto"
                      Range("F4:L4,H21:N29,H33:N35,F39:N39,F41:N41,F43:N43,E47:N47,H51:L51,H53:J53").ClearContents
                     .Protect Password:="toto"
                 End With
             ThisWorkbook.Protect "toto", True, True
        Application.EnableEvents = True
    Cdt

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 025
    Points : 29 112
    Points
    29 112
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne comprends pas la raison d'utiliser l'instruction Application.EnableEvents = False pour l'événement Activate
    .
    Pour éviter la procédure Private Sub Worksheet_SelectionChange(ByVal Target as Range au Select de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Range(Me.Cells(1, 1), Me.Cells(40, 16)).Select
    Et si je remplace .Select par .Activate, le "SelectionChange (...)" va se déclencher au
    J'avoue ne pas comprendre votre réponse. N'y a t'il pas un problème de conception d'intercepter autant d'événements sur 90 à 200 feuilles ?

    Je retiens la solution de Select Case pour exclure Feuil01(blabla) et Feuil02(blabla) qui sont pour moi les CodeNames.
    J'ai l'impression que vous n'avez pas lu complètement le lien que j'ai publié. Le but de l'utilisation du CodeName est de s'affranchir du risque qu'un utilisateur modifie le nom de la feuille ce qui provoquera une erreur

    Je préfère avoir des numéros pour les fiches, ce qui évite, vu le nombre, d'avoir à "naviguer" horizontalement.
    Vous êtes libre de faire comme vous l'entendez mais je pense toujours qu'il y a un problème de conception et d'organisation des données.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 630
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    N'y a t'il pas un problème de conception d'intercepter autant d'événements sur 90 à 200 feuilles ?
    Si le code est dans chaque feuille, l'interception n'a lieu qu'une seule fois (?) ; dans Workbook_SheetActivate(ByVal Sh As Object), j'ai un doute.

    J'ai l'impression que vous n'avez pas lu complètement le lien que j'ai publié
    Possible mais je fais toujours de mon mieux.

    Le but de l'utilisation du CodeName est de s'affranchir du risque qu'un utilisateur modifie le nom de la feuille ce qui provoquera une erreur
    Mon classeur est protégé : ThisWorkbook.Protect "toto", True, True. La protection ne prévient-elle pas le renommage et le déplacement des Onglets ?

    En général, j'utilise néanmoins le CodeName par sécurité, c'est pourquoi je me demandais comment le concilier avec Select Case

    Mes deux feuilles à isoler sont Feuil01(accueil) et Feuil02(base) ; Feuil01 et Feuil02, ne sont-ils pas mes CodeName ?
    Si oui, je pensais les combiner à Select Case comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select Case ws.CodeName
        Case "Feuil01": (...) 
        Case "Feuil02": (...) 
        Case Else: (...)
    End Select
    Mais j'ai un doute car je n'ai pas souvenir d'avoir utilisé des CodeName dans des Select Case, d'où ma question (sans doute maladroite).

    Cdt

  14. #14
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 630
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    Je pense avoir trouvé ce que je cherchais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Workbook_SheetActivate(ByVal sh As Object)
    Dim codeName As String
     
        codeName = ActiveSheet.codeName
     
        Select Case codeName
            Case "Feuil01", "Feuil02"
                Exit Sub
            Case Else
                MsgBox codeName
        End Select
    End Sub
    Merci à tous pour vos contributions respectives,
    Cdt

  15. #15
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 025
    Points : 29 112
    Points
    29 112
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    L'instruction Exit Sub à l'intérieur du Select Case ainsi que l'instruction codeName = ActiveSheet.codeName sont parfaitement inutile et la déclaration d'une variable CodeName ????
    L'argument sh EST la feuille active et CodeName est une propriété de celui-ci
    Il faudrait lire les tutos que l'on vous référence

    J'ai pourtant publié un exemple
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  16. #16
    Membre averti
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 192
    Points : 328
    Points
    328
    Par défaut
    Bonjour
    il y a différentes manières de voir les choses
    divers exemples
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'exemple case
    'Case sh.Name en case else
    Private Sub Workbook_SheetActivate(ByVal sh As Object)
        Select Case sh.codeName
            Case "Feuil01", "Feuil02"
            Case Else
                MsgBox codeName
        End Select
    End Sub
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Workbook_SheetActivate(ByVal sh As Object)
        'select case sur codename de sh
        Select Case sh.codeName
            Case "Feuil01"
            Case "Feuil02"
            Case Else
                MsgBox codeName
        End Select
    End Sub
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'case true sur un like inversé et negatif
    Private Sub Workbook_SheetActivate(ByVal sh As Object)
        'select case booleen
        'toute les feuille sauf feuil01 et 02
        Select Case True
            Case Not " Feuil01 Feuil02 " Like " " & sh.Name & " "
                MsgBox codeName
        End Select
    End Sub
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'condition if  sur un like inversé negatif
    Private Sub Workbook_SheetActivate(ByVal sh As Object)
        'toute les feuille sauf feuil01 et 02
        If Not " Feuil01 Feuil02 " Like " " & sh.Name & " " Then
            MsgBox codeName
        End If
    End Sub

  17. #17
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 630
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    @ Philippe

    J'ai relu votre exemple et appliqué (strictement) les corrections à mon code. Tout est bon. Merci !

    @ Patmeziere

    Merci pour les solutions alternatives !

    Cdt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-365] Comment effacer un "Range" de la feuille active dans une autre feuille ?
    Par DenisHen dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/01/2022, 16h28
  2. Réponses: 1
    Dernier message: 07/12/2014, 18h36
  3. Réponses: 6
    Dernier message: 18/05/2010, 12h00
  4. Passage d'une List d'une activity à une autre
    Par Xen59 dans le forum Android
    Réponses: 4
    Dernier message: 17/05/2010, 19h49
  5. Bouton page active d'une autre couleur
    Par stefina87 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 12/03/2009, 15h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo