Protection de feuilles selon leurs noms "Microsoft Excel Object"

Chalafraiz

XLDnaute Nouveau
Bonjour,

Je commence à bien savoir utiliser VBA mais j'ai encore beaucoup de problèmes avec l'utilisation des variables, et je bute actuellement sur un problème pour lequel je n'ai pas trouvé de solution sur le net.

Dans mon classeur, j'ai un bon nombre de feuilles. Voici une liste exhaustive de ce que l'on peut voir dans l'onglet "Microsoft Excel Object" de VBA :
-Accueil (Accueil)
-Donnees (Donnees)
-Feuil10 (Catalogue ABC)
-Feuil11 (Catalogue truc)
-...
-Feuil30 (Catalogue chouette)​


Comme vous l'aurez surement compris, les noms entre parenthèses représentes ceux visibles dans les onglets Excel, et je ne souhaite pas les changer car ils permettent à l'utilisateur de les reconnaître. Comme dans les feuilles de catalogues il n'y a pas de fonctions, je n'ai pas souhaité les renommer (telles que les feuilles Accueil et Donnees, pour lesquelles il était plus pratique d'écrire Call Donnees.Ma_Macro plutôt que Call Feuil2015.Ma_Macro).

Comme leur nombre est conséquent, je n'ai pas envie de m'embêter à faire une liste de :
Code:
Feuil10.protect
Feuil11.protect
...

Je pensais faire appel à un code tel que le suivant, mais cela ne fonctionne pas.
Code:
Dim i as integer
Dim NomFeuille as Variant
Dim Feuille as Sheet

For i = 10 To 50
    NomFeuille = "Feuil" & i
    Set Feuille = NomFeuille
    Feuille.Protect
Next

Je sais que ce code est moche, je pensais bien que cela ne fonctionnerait pas vu que je demande à VBA de définir une feuille comme une variable. Je précise que j'ai aussi essayé sans passer par NomFeuille, en déclarant Feuille as Object, mais il n'appréciait pas le Feuille = "Feuil" & i

Bref, je sais pourquoi mon code ne fonctionne pas (mauvaise manipulation des variables), j'aimerais juste que vos lumières m'éclairent, pour savoir si j'ai raison de continuer à m'entêter dans ce genre de fonctions, ou si cela n'est pas possible...

Merci d'avance pour votre aide !


P-S : en passant, si vous avez des liens vers des cours sur les variables telles que Sheet, Variant, Object, je prends !
 
Dernière édition:
G

Guest

Guest
Re : Protection de feuilles selon leurs noms "Microsoft Excel Object"

Bonjour,

Code:
Dim Wsh As Worksheet
For Each Wsh In ThisWorkbook.Worksheets
    If Wsh.CodeName <> "Accueil" And Wsh.CodeName <> "Donnees" Then Wsh.Protect "toto"
Next

A+
 

Chalafraiz

XLDnaute Nouveau
Re : Protection de feuilles selon leurs noms "Microsoft Excel Object"

Bonjour,

Code:
Dim Wsh As Worksheet
For Each Wsh In ThisWorkbook.Worksheets
    If Wsh.CodeName <> "Accueil" And Wsh.CodeName <> "Donnees" Then Wsh.Protect "toto"
Next

A+

Merci pour votre rapide réponse !

Je m'excuse, je n'ai pas précisé que la liste de mes feuilles n'était pas complète :s

J'ai 10 feuilles qui ne sont pas des catalogues. Je pense (je ne peux pas le tester actuellement) que votre code fonctionnera si je mets tous les noms de feuilles en conditions, mais, histoire d'en apprendre un peu plus sur les variables VBA, est-ce qu'il est envisageable de manipuler des noms de feuilles d'une façon similaire à celle que j'ai écris dans mon code, avec une boucle for ?


Autre question :
Sheets("Feuil1") Ici Feuil1 est le nom de la feuille ?
Feuil1.Protect Ici Feuil1 est aussi le nom de la feuille ?
De quelle façon peut-on différencier ces deux "appellations" ?

Merci d'avance.
 
G

Guest

Guest
Re : Protection de feuilles selon leurs noms "Microsoft Excel Object"

Re,


Pour reprendre ton exemple en #1:
Code:
Dim NomFeuille As String
Dim Feuille As Worksheet
For i = 10 To 50
    NomFeuille = "Feuil" & i
    Set Feuille = ThisWorkbook.Sheets(NomFeuille)
    Feuille.Protect
Next

Comme tu le disais le nom entre parenthèse (Feuil1) est le nom apparent dans l'interface utilisateur et correspond à la propriété .Name
L'autre nom est le nom interne de la feuille et correspond à la proprité 'CodeName' qui n'est modifiable que dans VBE et de façon plus compliquée par VBA.

Tu ne pourras pas faire ThisWorkBook.Sheets(NomFeuille) si NomFeuille est le codeName, car il n'y pas pas de collection CodeNames à disposition dans le modèle objet Excel (qu'on pourrait toutefois créer bien qu'il faille que le jeu en vaille la chandelle)

Sheets et ou WorkSheets sont des collections. Faire référence à un de leurs item ne peut se faire QUE par index ou leur Nom.

Voir l'aide excel sur l'objet Collection.

Voir l'aide excel sur CodeName

Autre possibilité: un tableau des CodeName de feuille à ne pas protéger:
Code:
Dim Wsh As Worksheet
'Tableau des CodeNames de feuille à ne pas protéger
Dim CodeNames: CodeNames = Array("Accueil", "Données", "Truc", "Machin", "Chouette")
For Each Wsh In ThisWorkbook.Worksheets
    If IsError(Application.Match(Wsh.CodeName, CodeNames, 0)) Then Wsh.Protect
Next

A+
 
Dernière modification par un modérateur:

Pierrot93

XLDnaute Barbatruc
Re : Protection de feuilles selon leurs noms "Microsoft Excel Object"

Bonjour,
Salut Hasco:)

une approche sans doute à coté de la plaque... mais bon....
Code:
Option Explicit
Sub test()
Dim i As Byte, f As String
i = 1
f = "Feuil" & i 'ou Feuil1 est le codename de la feuille.
With ThisWorkbook
    .Sheets(.VBProject.VBComponents(f).Name).Protect "toto"
End With
End Sub

bon après midi
@+
 
G

Guest

Guest
Re : Protection de feuilles selon leurs noms "Microsoft Excel Object"

Re,

Hello Pierrot:)

C'est certainement ce que j'aurai fait pour moi( les feuilles à protéger sont celles dont le codeName n'a pas été personalisé) mais pour quelqu'un qui a
post1 à dit:
encore beaucoup de problèmes avec l'utilisation des variables
je me demande s'il connait bien le modèle objet excel.

Mais j'ai certainement tort de ne vouloir donner que du lait aux nourrissons.

A+
 
Dernière modification par un modérateur:

Chalafraiz

XLDnaute Nouveau
Re : Protection de feuilles selon leurs noms "Microsoft Excel Object"

Merci à vous deux pour vos réponses.

Effectivement, je n'aime pas trop utiliser des fonctions que je ne connais pas car en cas de problème il est plus compliqué de résoudre ce qu'on ne sait pas, que ce que l'on a l'habitude de faire...

En fait, je travaille essentiellement avec des fonctions basiques (boucles If, Do while, etc,.) et des variables simples (integer, double, boolean, string), et quelques fonctions d'userform. Du coup j'ai peu l'habitude de manipuler les autres variables.

Je vais laisser tomber l'idée de la boucle For pour le moment, pour cause de délais assez courts.

Je pense utiliser votre première proposition, tant pis pour la répétition !

(Je ne marque pas encore le sujet comme résolu, je risque d'avoir encore des questions pour la suite de ma procédure...)
 

Discussions similaires

Statistiques des forums

Discussions
314 636
Messages
2 111 460
Membres
111 150
dernier inscrit
thenoobofmc