Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

EnableFieldList = False … ne marche pas !

  • Initiateur de la discussion Initiateur de la discussion Sebast
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Sebast

XLDnaute Impliqué
Bonjour à toutes et à tous,

je cherche à limiter les actions possibles sur les différents items de tableaux croisés dynamiques.
Notamment avec l’instruction EnableFieldList = False, je veux que le destinataire ne puisse pas cliquer sur les menus déroulants des TCD (année, client, calibre etc.)

Que ce soit sur une feuille en particulier ou toutes (comme je l’espère avec la boucle créée), ça ne marche pas, on peut toujours cliquer sur les champs donc mon code est sans effet

Qui peut me dire où ça pêche ? (j’utilise ici un with … end with car normalement, j’ai beaucoup d’instructions mais en l’occurrence, je me focalise sur une car elle ne fonctionne pas …)

Merci d'avance

______________________ Code restant sans effet ____________________________________

Sub Geler_les_champs()
Dim sh As Long
Dim pt As PivotTable

For sh = 1 To Sheets.Count ' on balaie toutes les feuilles

Sheets(sh).Activate

If ActiveSheet.PivotTables.Count > 0 Then ' pour éviter un plantage si pas de tcd dans la feuille
With ActiveSheet.PivotTables(1)
.EnableFieldList = False ' on interdit l'accès aux champs
End With
End If ' fin du test si tcd

Next ' on passe à la feuille suivante

End Sub
 

Pièces jointes

Re : EnableFieldList = False … ne marche pas !

Salut Sebast,

Cette propriété n'empêche pas de triturer les champs. Elle ne fait que désactiver la possibilité dans le ruban d'afficher la liste des champs.

Au passage, j'écrirai ton code de cette façon 😉
VB:
Sub test()
Dim wks As Worksheet

On Error Resume Next


For Each wks In Worksheets
    With wks.PivotTables(1)
        .EnableFieldList = False
    End With
Next

End Sub

Petites explications:
- Utiliser Worksheets plutôt que Sheets car Sheets englobe toutes les types d'onglets (graphiques,...)
- Utiliser un For Each...Next est beaucoup plus efficace pour parcourir une classe d'objet et on ne risque pas de se tromper
- On Error Resume Next, permet de simplifier la gestion d'erreur pour ce type de procédure
- Plus besoin de sélectionner les feuilles et donc de perdre du temps de traitement (ça va plus vite quoi 😉 )

Bon courage,
 
Re : EnableFieldList = False … ne marche pas !

Re,

Ma petite proposition précédente ne me paraissait pas tout à fait propre. En voici une autre légèrement modifiée qui te sera certainement utile:
VB:
Sub test()
Dim wks As Worksheet
Dim pvt As PivotTable


For Each wks In Worksheets
    For Each pvt In wks.PivotTables
        With pvt
            .EnableFieldList = False
        End With
    Next
Next


End Sub

Bon courage
 
Re : EnableFieldList = False … ne marche pas !

Ah, au fait, 🙄

Pour faire ce que tu veux, essaye ceci (cela désactive toutes les sélections des champs):

VB:
Sub test()
Dim wks As Worksheet
Dim pvt As PivotTable
Dim pvf As PivotField


'On parcours toutes les feuilles
For Each wks In Worksheets
    
    'On parcours tous les TCD de la feuille
    For Each pvt In wks.PivotTables
        
        'On parcours tous les champs du TCD et on les désactive
        For Each pvf In pvt.PivotFields
            
            With pvf
                .EnableItemSelection = False
            End With
            
        Next
    
    Next


Next


End Sub

Bon courage
 
Re : EnableFieldList = False … ne marche pas !

Bonsoir Jam,

Merci beaucoup pour ton aide et désolé pour cette réponse tardive, je n’étais pas devant l’écran ces dernières heures …
Ta solution fonctionne bien et c’est vrai que balayer les collections est beaucoup plus élégant que mon compteur un peu archaïque !

Cependant, même si mon code est rudimentaire, je ne comprends pas pourquoi il ne donne aucun résultat. En fait, mon problème initial ne résidait pas dans la boucle mais bien dans l’instruction elle-même, restant sans effet, que ce soit pour tout le classeur ou pour une seule feuille.
J’avais écrit ce code car j’espérais – une fois le problème de l’instruction résolue – l’appliquer en fait à une feuille sur deux, et pour cela employer For sh = 1 To Sheets.Count step 2

Car je ne connais pas d’équivalent à step 2 quand on parcourt une collection (For Each wks In Worksheets step 2 plante, évidemment …)
Cependant, ton code est intéressant car il supprime le risque de ne pas trouver un tcd dans un onglet : avec For Each pvt In wks.PivotTables, on supprime l’instruction If ActiveSheet.PivotTables.Count > 0 …

Pour autant, même si ton code est plus compact, je ne vois pas pourquoi le mien reste muet (pour moi, la boucle "archaïque" est clean) : qui peut me dire pour ça reste sans effet ?
Comment sans ce type de boucle mettre un pas de 2 (même si ce n'était pas ma question initiale) ?

Encore merci pour tes lumières

PS : comment fait-on pour mettre en lumière le code, c'est à dire le fond bleu ciel et le code couleur comme en VBA, commentaires en vert etc. ?
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

K
Réponses
12
Affichages
2 K
S
Réponses
3
Affichages
2 K
StanSigma
S
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…