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 :

Interdire la modification des noms de feuilles [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut Interdire la modification des noms de feuilles
    Bonjour à tous,

    J'ai dans un fichier plusieurs feuilles avec des noms pré formatés et plusieurs macros.
    Certaines de ces macros créent de nouvelles feuilles avec encore une fois des noms prédéfinis.
    Le nombre de feuilles peut donc évoluer lors de l'utilisation.

    J'aimerais pour éviter que les macros ne plantent que l'utilisateur ne puisse pas changer le nom des feuilles.
    Je pensais utiliser un des évènements de ThisWorkbook et de tester les différents noms de feuilles mais je ne sais pas trop comment m'y prendre.

    Merci d'avance pour votre temps et vos idées

  2. #2
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 909
    Par défaut
    Bonjour,

    Tu as la possibilité d'utiliser les CodeNames de tes feuilles.
    Le CodeName est le nom de l'objet comme pour tes UserForms dans Excel.

    Normalement, quand tu es dans ta partie Macro, tu as dans "Microsoft Excel Objets", tes onglets d'Excel avec, par exemple, "Feuil1 (Toto)"
    "Toto" est le nom de l'onglet que ton utilisateur peut modifier.
    "Feuil1" est le codename que le développeur peut modifier.

    Comment le modifier ?
    Deux façons de le faire :
    • Directement dans ses propriétés (F4) dans le paramètre "(Name)"
    • Par le code, en utilisant .codename = "Hello"


    L'utilisation se fait comme ceci dans le code :
    Thisworkbook.sheets("Toto").range("A1") = "Hello the world"
    F_Toto.range("A1") = "Hello the world"
    F_toto (codename) est la même chose que thisworkbook.sheets("Toto")

    Cordialement,

  3. #3
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Merci pour ta réponse Gado2600,

    J'avais oublié le CodeName de la feuille c'est vrai que c'est très utile pour les cas où les feuilles peuvent changer de place ou de nom.
    J'aurais dû y pensais avant de développer, ça fait beaucoup de changement dans le code maintenant mais il faut être pris pour être appris

    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Changer_CodeName()
        Dim sh As Worksheet
        For Each sh In ThisWorkbook.Worksheets
            sh.CodeName = sh.Name
        Next
    End Sub
    Et en changeant toutes les parties de code ou j'utilise une feuille en l'appelant par son Name ça devrait aller.

    Ah mince fausse joie !

    La propriété .CodeName d'une feuille est en lecture seule donc pas possible de la modifier (sauf si je m'y prends mal).
    Et comme selon les feuilles les macro sont différentes et prennent en compte les noms de feuille, je suis toujours dans une impasse

  4. #4
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 909
    Par défaut
    Ah oui... C'est bizarre... Je suis persuadé d'avoir déjà jouer avec ce paramètre sur l'un de mes projets...


    Bref, il est quand même possible de le faire : ici

  5. #5
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut Solution temporaire
    J'ai trouvé une solution qui n'en ai pas vraiment une (je contourne seulement le problème)

    Dans le Module ThisWorkbook du Projet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Explicit
     
    Dim NomFeuille$, IndiceFeuille&
     
    Private Sub Workbook_Open()
        NomFeuille = ActiveSheet.Name: IndiceFeuille = ActiveSheet.Index
    End Sub
     
    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
        ActiveWorkbook.Sheets(IndiceFeuille).Name = NomFeuille
        NomFeuille = Sh.Name: IndiceFeuille = Sh.Index
    End Sub
    Ainsi sauf si l'utilisateur a l'idée de déplacer une feuille, les noms de feuilles ne changeront pas.

    Je laisse le post ouvert encore un peu pour voir si d'autres auraient eu le même problème et auraient d'autres solutions.

  6. #6
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 909
    Par défaut
    Je ne veux pas te casser ton code, qui est une idée originale en soit, mais, même sans en avoir l'idée, tes utilisateurs peuvent le faire par accident...
    Je déconseille fortement ce genre de système sauf si tu es absolument sûr de ton coup dans l'utilisation du fichier.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Ah mince fausse joie !
    Bonjour,

    Effectivement, en cours d'exécution on ne peut changer la propriété CodeName (à ma connaissance).

    La piste à suivre est de mémoriser le CodeName et le Name des feuilles dans l'espace de Noms puis de s'y référer par la suite.
    Je construirai un exemple dès que j'aurai du temps libre, ce qui n'est pas le cas actuellement.
    Il y a donc un bon espoir de solutionner le problème.

    A plus.

  8. #8
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    il la propriété est en lecture seule lors de l'exécution par macro

    je ne sais pas si c'est comme ça qu'on l'appelle, mais j'utilise l'évaluation de nom de l'objet Worksheet pour la modifier par macro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuil1.[_CodeName] = "toto"
    après, il est aussi possible de le faire via le projet VBE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto.Parent.VBProject.VBComponents(toto.CodeName).Properties("_CodeName") = "totoBIS"

  9. #9
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Citation Envoyé par Gado2600 Voir le message
    Je ne veux pas te casser ton code, qui est une idée originale en soit, mais, même sans en avoir l'idée, tes utilisateurs peuvent le faire par accident...
    Je déconseille fortement ce genre de système sauf si tu es absolument sûr de ton coup dans l'utilisation du fichier.
    Je suis entièrement d'accord mais comme je l'explique dans le post précèdent je ne fais que déplacer le problème.
    Je le fais quand même car le nouveau problème a moins de chance d'arrive (bouger les onglets) alors que changer le nom ils ne font que ça (sans vraiment de raison) ^^

    Je sais, ce n’est pas très pro

    La piste idéale de résolution serait effectivement de modifier le CodeName de toutes les feuilles.
    Merci à tous pour vos infos et astuces, je me pencherais sur le problème en détail pour modifier tout le code sans effet de bord.

  10. #10
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par antonysansh Voir le message
    La piste idéale de résolution serait effectivement de modifier le CodeName de toutes les feuilles.

    Mes propositions ICI ne conviennent pas ?

  11. #11
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Oui pardon Joe c'est effectivement la piste que je vais suivre !
    Par contre je me heurte a un petit problème et ma compréhension est limite sur ce sujet.
    Le code suivant ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
     
    Dim sh As Worksheet
    For Each sh In ThisWorkbook.Worksheets
        sh.[_CodeName] = sh.Name
    Next
     
    End Sub
    Pour le CodeName d'une feuille est-on entièrement libre ou des caractères sont interdits ? Voir une limite sur le nombre de caractères ?

    Edit : avec un On Error Resume Next je me rend compte que sur certaine feuille, Excel ne veut pas changer le CodeName par exemple : Sommaireou Fiche_Orga

  12. #12
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Je n'ai pas de souci avec ce code

    j'ai testé avec les deux noms dont tu as parlé
    j'ai même poussé le vice avec la longueur maximale d'un nom de feuille

    Nom : CodeName.png
Affichages : 2119
Taille : 10,8 Ko

    vérifie que tu n'as pas d'espace dans le nom des feuilles (au début, à la fin, ou à l'intérieur)

  13. #13
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    C'est vraiment étrange chez moi ça ne marche pas même après vérification des espaces et caractères spéciaux.
    J'ai pu mettre manuellement (propriété name de la feuille dans l'explorateur de projet) des noms qui feront l'affaire.

    J'ai toujours un problème mais cette fois de cohérence avec le reste de mon code.

    Moi qui pensais finir par simplement sécuriser le fait de ne pas pouvoir changer le nom d'un onglet, me voilà reparti pour encore un peu de développement.

    En tout cas merci beaucoup a vous pour votre aide

    Je pense qu’on a fait le tour alors je passe en résolu

  14. #14
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 593
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 593
    Par défaut
    Bonjour

    Une autre solution est d'avoir une variable public où est stockée le nom de la feuille lors de son activation.
    Lors du changement d'onglet (deactivate) ou même d'autre évènements, on peux tester si le nom de la feuille a changé et remettre le nom réservé... avant de changer le contenu de la variable pour le nom de l'onglet qui devient actif...

    Ce poste, certes un peu différent peux t'aider http://www.developpez.net/forums/d15...-precedemment/

  15. #15
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Je fais suite à mon message #7
    La piste à suivre est de mémoriser le CodeName et le Name des feuilles dans l'espace de Noms puis de s'y référer par la suite.
    Je construirai un exemple dès que j'aurai du temps libre, ce qui n'est pas le cas actuellement.
    Il y a donc un bon espoir de solutionner le problème.
    J'ai construis un exemple en suivant la démarche suivante

    1) Un classeur avec 3 feuilles ("RIRI", "FIFI", "LOULOU") dont les noms sont bloqués
    2) Copiez le code suivant dans la fenêtre de code ThisWorkbook
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Workbook_Open()
    '--- Empêcher la modification du nom de la feuille ---
    Call NameNoModif(Sheets("LOULOU"))
    Call NameNoModif(Sheets("RIRI"))
    Call NameNoModif(Sheets("FIFI"))
    End Sub
     
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Call RecupSheetName
    End Sub
    3) Copiez le code suivant dans un module Standard
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Const PREFIXE_NAME_NAME As String = "NoModifName"
     
    Sub NameNoModif(S As Worksheet)
    Dim N As Name
    Set N = ThisWorkbook.Names.Add(Name:=PREFIXE_NAME_NAME & S.CodeName, RefersTo:=S.CodeName)
    N.Comment = S.Name
    'N.Visible = False   'Retire la visibilité du Nom à l'utilisateur (j'ai flagué pour que vous puissiez voir)
    End Sub
     
    Sub RecupSheetName(Optional dummy As Byte)
    Dim N As Name
    Dim S As Worksheet
    Dim A$
    '---
    For Each N In ThisWorkbook.Names
      If InStr(1, N.Name, PREFIXE_NAME_NAME) Then
        On Error Resume Next
        Set S = ThisWorkbook.Sheets(N.Comment)
        If Err <> 0 Then
          A$ = N.RefersTo
          A$ = Mid(A$, 1, Len(A$) - 1)
          A$ = Mid(A$, 3)
          For Each S In ThisWorkbook.Sheets
            If S.CodeName = A$ Then
              S.Name = N.Comment
              Exit For
            End If
          Next S
          Err.Clear
        End If
        On Error GoTo 0
      End If
    Next N
    End Sub
     
    '##################################################
    '### Exemple pour l'ajout de nouvelles feuilles ###
    '##################################################
    Sub TestAjoutFeuille()
    Dim S As Worksheet
     
    On Error GoTo Erreur
     
    '/// Cas 1 - Création d'une feuille avec la possibilité que l'utilisateur change son nom  ///
    Set S = Sheets.Add
    S.Name = "On peut changer le nom"
     
    '/// Cas  - Création d'une feuille avec blocage du nom  ///
    Set S = Sheets.Add
    S.Name = "Nom bloqué"
    Call NameNoModif(S)   'On appelle cette Sub dans ce cas
     
    Erreur:
    If Err <> 0 Then MsgBox "Erreur " & Err.Number & vbCrLf & Err.Description
    End Sub
    Le rétablissement du nom de la feuille se fait par le biais de Workbook_SheetSelectionChange
    L'avantage de cette technique est qu'il n'y a pas besoin d'intervenir, dans votre code, sur le Name ou le CodeName des feuilles.
    Je ne me suis pas occupé de gérer le surplus des NOMS lorsque des feuilles ont été supprimées. Cela reste donc à faire.
    Fichiers attachés Fichiers attachés

  16. #16
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Encore merci à tous,

    78chris, j'avais essayé un truc de ce genre mais j'ai complexifié pour rien avant d'abandonner.

    Merci pour ton temps passé sur mon problème PMO, je garde ton code dans un coin il peut mettre très utile.

    En définitif, je voulais bloquer le changement de nom des feuilles car certaines macros se servaient du nom des feuilles. C'est, on peut le dire, pas très bien réfléchi à la base. Alors avec l'aide de chacun j'ai pu renommer les CodeName et changer le reste de mon code pour prendre en compte le CodeName au lieu du Name.

    Encore merci à vous tous, j'ai encore appris plein de chose grâce à vous

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

Discussions similaires

  1. [JTable] Interdire la modification des données ?
    Par Cyborg289 dans le forum Composants
    Réponses: 7
    Dernier message: 25/02/2013, 11h40
  2. copie d'un pds avec modification des noms des membres
    Par naimespseudo dans le forum z/OS
    Réponses: 17
    Dernier message: 23/08/2009, 00h09
  3. [WS 2003] Comment interdire la modification des infos réseau
    Par Andry dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 25/03/2009, 08h10
  4. Réponses: 3
    Dernier message: 19/04/2007, 13h51
  5. Interdire les modifications des données dans une JTable
    Par markfish55 dans le forum Composants
    Réponses: 3
    Dernier message: 19/12/2006, 16h48

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