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

Microsoft 365 Cocher automatiquement cases liste déroulante selon cellule

Josvin

XLDnaute Nouveau
Bonjour,

J'ai beau chercher un peu partout, je ne trouve pas la réponse à ma question. Peut-être simplement parce que ça n'est pas faisable, mais je préfère demander avis à des spécialistes avant d'abandonner mon idée.

J'aimerais savoir s'il est possible de cocher automatiquement des cases dans une liste déroulante, selon le texte renseigné dans une autre cellule.
De manière plus concrète :
J'ai une liste déroulante dans une cellule regroupant les âges d'une population (de 18 à 65 ans), utilisée pour faire des comparaisons avec une personne donnée, en fonction de son âge. Selon l'âge de la personne que je veux comparer, je coche systématiquement les cases à + ou - 5 ans (exemple : j'ai une personne de 30 ans, je vais la comparer aux personnes de 25 à 35 ans). Afin de m'éviter de cocher 11 cases à chaque fois, est-il possible que, lorsque je tape par exemple "30" dans une cellule adjacente, les cases de 25 ans à 35 ans se cochent automatiquement dans la liste déroulante ?
Et si oui, évidemment, comment ?

Merci d'avance pour votre aide

Josvin
 
Solution
Tu y était presque !
La procédure Worksheet_Change(ByVal Target As Range) doit être unique, elle correspond à l’événement de modification d'une cellule.

Pour corriger cela, il te suffit de regrouper les if dans la même procédure.
La procédure exécutera les 3 actions les unes à la suite des autres.

Nairolf

XLDnaute Accro
Salut Josvin,

Afin de pouvoir peut-être te proposer une solution merci de mettre à disposition un fichier exemple avec ce que tu as actuellement et ce que tu souhaiterais (du moins s'en rapprochant).
 

Josvin

XLDnaute Nouveau
Merci pour ta réponse !

Les informations de mon fichier étant confidentielles, je vais avoir du mal à te l'envoyer tel quel... En revanche j'ai créé un fichier fictif regroupant le même type d'infos et avec la même configuration.

Je te le mets en PJ.

L'idée serait de renseigner l'âge de la personne à comparer en C3, et qu'automatique se cochent les âges à plus ou moins 5 ans dans B3.

Penses-tu que ce soit faisable ?
 

Pièces jointes

  • Fictif.xlsx
    24.2 KB · Affichages: 9

Nairolf

XLDnaute Accro
Donc dans le cas d'un Tableau Croisé Dynamique, je vois 2 solutions :

Dans les 2 cas , mettre le champ "Age" dans la section "Lignes"
- cas 1 : faire un filtre "entre" dans les "filtres s'appliquant aux étiquettes"
- cas 2 : faire un "grouper le champ" en définissant un début à 0 par exemple
 

Josvin

XLDnaute Nouveau
Ca pourrait être des solutions contournées, effectivement, merci Mais elles ne répondent pas exactement à ma problématique.

Pas possibilité, a priori, de filtrer automatiquement en fonction de ce qui serait renseigné dans C3, si je comprends bien ?
 

Nairolf

XLDnaute Accro
Pour cela je ne vois qu'un code vba qui mette à jour le filtre en fonction de la valeur de la cellule C3 et des tolérances associées.

Une proposition de code à mettre dans le code de la feuille intégrant le TCD :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ErrorHandler
If Target.Address = "$C$3" Or Target.Address = "$D$3" Then
        For Each itm In ActiveSheet.PivotTables("Tableau croisé dynamique11").PivotFields("Age").PivotItems
                itm.Visible = True
        Next itm
        For Each itm In ActiveSheet.PivotTables("Tableau croisé dynamique11").PivotFields("Age").PivotItems
            If (Val(itm.Name) <= Range("C3").Value + Range("D3").Value) And (Val(itm.Name) >= Range("C3").Value - Range("D3").Value) Then
                itm.Visible = True
            Else
                itm.Visible = False
            End If
        Next itm
End If
ErrorHandler:
Exit Sub
End Sub
 

Josvin

XLDnaute Nouveau
Super ! Merci beaucoup pour le code vba, je tenterai ça demain !

Après m'être creusé les méninges, je pense tout de même avoir trouvé une solution de contournement "artisanale" qui répond à mon problème. Je te joins le fichier.
Qu'en penses-tu ?

J'aimerais cependant, pour que la solution soit parfaite, que le TCD s'actualise automatique lorsque je remplis C3. Est ce possible ?
 

Pièces jointes

  • tcd-Ages.xlsx
    41.8 KB · Affichages: 5

Nairolf

XLDnaute Accro
Pour le rafraichissement, incorpore ce bout de code à la feuille du TCD :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$3" Then
    ActiveWorkbook.RefreshAll
End If
End Sub
 

Josvin

XLDnaute Nouveau
Merci pour la simplification et le code, c'est parfait !

A un détail près : c'est la première fois que j'utilise un VBA, et j'ai beau regarder les tutos, je ne comprends pas comment le faire fonctionner...
 

Nairolf

XLDnaute Accro
Ok, la façon de faire peut être légèrement différente selon la version d'Excel.
Je vais donc te parler de la version que j'utilise le plus souvent, c'est-à-dire la 2013.

1) Enregistrer le fichier en .xlsm
2) Ouvrir Visual Basic (Alt+F11)
3) Ouvrir l'explorateur de projet (Ctrl+R)
4) Double cliquer sur la feuille concernée dans l'explorateur
5) Coller le code dans la fenêtre qui s'est ouverte
 

Josvin

XLDnaute Nouveau
Ah oui, c'était aussi simple que ça, merci encore ^^

Ne me reste plus qu'à réfléchir à comment déployer ce code aux 3 TCD qui sont (sur la même feuille) dans mon tableau de travail d'origine. Je me dis que la démarche doit être similaire, ça ne doit pas être SI compliqué, une fois qu'on a compris le principe
 
Dernière édition:

Josvin

XLDnaute Nouveau
J'ai une dernière question !

Je rentre donc mes codes pour mes 3 TCD, directement dans la feuille concernée. Evidemment, ça ne fonctionne pas ^^

J'ai rentré ceci :

VB:
Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("age").Address Then
ActiveSheet.PivotTables("TCD_Age_1").RefreshTable
End If
End Sub

Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("age_2").Address Then
ActiveSheet.PivotTables("TCD_Age_2").RefreshTable
End If
End Sub

Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("age_3").Address Then
ActiveSheet.PivotTables("TCD_Age_3").RefreshTable
End If
End Sub

Pourtant, si je ne fais que le premier code (pour le TCD_1), ça fonctionne !
Mais dès que je rajoute la ou les suivantes, ça ne fonctionne plus

Saurais-tu me dire pourquoi ? Comment imbriquer les 3 ?

Merci
 

Nairolf

XLDnaute Accro
Tu y était presque !
La procédure Worksheet_Change(ByVal Target As Range) doit être unique, elle correspond à l’événement de modification d'une cellule.

Pour corriger cela, il te suffit de regrouper les if dans la même procédure.
La procédure exécutera les 3 actions les unes à la suite des autres.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…