Incorporer un choix de liste déroulante dans formule NBVAL ?
Bonjour,
Je me permets de vous solliciter pour éventuellement améliorer un tableau qui comptabilise des fréquences de rendez-vous avec mes clients.
Je suis novice, et je me demande s'il serait possible d'incorporer un choix via liste déroulante, dans une formule NBVAL, afin de ne pas avoir à modifier la formule ligne par ligne (afin de ne pas écraser la date d'inscription) chaque mois (colonne concernée : "Nombre de RDV").
Voici un exemple de ce que je cherche à faire (mon fichier client est plus gros...) :
Merci par avance !
Bonjour Gouna et bienvenue, bonjour le forum,
Par formules je ne sais pas faire. Si une proposition VBA t'intéresse, l'événementielle SelectionChange ci-dessous devrait fonctionner :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim TS As ListObject 'déclare la variable TS (Tableau Structuré)
Dim PL As Range 'déclare la variable PL (PLage)
Dim TM() As Variant 'déclare la variable TM (Tableau des Mois)
Dim K As Integer 'déclare la variable K (incrément)
Set TS = ListObjects("Tableau1") 'définit le tableau structuré TS
Set PL = TS.DataBodyRange 'définit la plage PL
For I = 1 To PL.Rows.Count 'boucle sur toutes les lignes I de la plage PL
'renvoie dans la cellule ligne I colonne 5 de PL la valeur du nombre de rendez-vous
PL(I, 5).Value = Application.WorksheetFunction.CountIf(Range(PL(I, 6), PL(I, PL.Columns.Count)), "X")
Next I 'prochaine ligne de la boucle
If Target.Address <> "$C$27" Then Exit Sub ' si la cellule sélectionnée n'est pas C27, sort de la procédure
Set PL = TS.HeaderRowRange 'redéfinit la plage PL
For I = 6 To PL.Columns.Count 'boucle sur les dernière colonnes de la plage PL (à partir de la 6ème)
K = K + 1 'incrémente K
ReDim Preserve TM(1 To K) 'redimensionne le tableau des mois TM
TM(K) = PL(1, I) 'récupère dans la variable K de TM la valeur de lq cellule ligne 1 colonne I de PL
Next I ' prochqine colonne de la boucle
With Target.Validation 'prend en comte la validation de données de C27
.Delete 'efface la validation actuelle
.Add xlValidateList, Formula1:=Join(TM, ",") 'ajoute TM comme liste de validation de données
End With 'fin de la prise en compte de la validation de données de C27
End SubLe nombre de rendez-vous est actualisé chaque fois qu'une cellule est sélectionné et la liste de validation est mise à jour quand C27 est sélectionnée.
Ton fichier modifié :
Bonjour à tous,
Pour compter les croix, tu mets en E2
=NB.SI(DECALER(F2;0;0;1;12);"x") le 12, c'est pour 12 mois a partir du premier
Crdlmt
Bonjour,
Merci beaucoup pour le temps que vous consacrez pour me répondre !
Du coup pour la colonne "Nombre de RDV" les 2 solutions fonctionnent parfaitement.
Maintenant l'idée serait de pouvoir mettre à jour automatiquement la colonne "Ancienneté du client" en prenant en compte son mois d'entrée dans le fichier, et en prenant en compte le mois en cours (actualisé chaque mois donc).
La formule actuelle est (pour le "client 1" par exemple) :
=NBVAL(Tableau1[[#En-têtes];[Mois de Décembre 2020]:[Mois de Mars 2021]])Cela impose de devoir reprendre manuellement chaque ligne, chaque mois, afin de changer [Mois de Mars 2021] en [Mois d'Avril 2021] par exemple, mais sans toucher au [Mois de Décembre 2020] (qui peut être un autre mois selon la date d'entrée du client).
Merci encore à vous !
Bonne journée,
Cordialement.
Bonjour le fil, bonjour le forum,
Utilise l'excellente formule de Djidji pour le nombre des rendez-vous et remplace le premier code que je t'avais proposé par celui-ci :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim TS As ListObject 'déclare la variable TS (Tableau Structuré)
Dim PL As Range 'déclare la variable PL (PLage)
Dim TM() As Variant 'déclare la variable TM (Tableau des Mois)
Dim K As Integer 'déclare la variable K (incrément)
Application.ScreenUpdating = False ' masque les rafraîchissements d'écran
Set TS = ListObjects("Tableau1") 'définit le tableau structuré TS
'************************************************************
Set PL = TS.DataBodyRange 'définit la plage PL
For I = 1 To PL.Rows.Count 'boucle sur toutes les lignes I de la plage PL
'renvoie dans la cellule ligne I colonne 4 de PL l'ancienneté du client
PL(I, 4).Value = PL.Columns.Count - PL(I, 4).Resize(1, PL.Columns.Count).Find("X", , xlValues, xlWhole).Column + 1
Next I 'prochaine ligne de la boucle
'************************************************************
If Target.Address <> "$C$27" Then Exit Sub ' si la cellule sélectionnée n'est pas C27, sort de la procédure
Set PL = TS.HeaderRowRange 'redéfinit la plage PL
For I = 6 To PL.Columns.Count 'boucle sur les dernière colonnes de la plage PL (à partir de la 6ème)
K = K + 1 'incrémente K
ReDim Preserve TM(1 To K) 'redimensionne le tableau des mois TM
TM(K) = PL(1, I) 'récupère dans la variable K de TM la valeur de lq cellule ligne 1 colonne I de PL
Next I ' prochqine colonne de la boucle
With Target.Validation 'prend en comte la validation de données de C27
.Delete 'efface la validation actuelle
.Add xlValidateList, Formula1:=Join(TM, ",") 'ajoute TM comme liste de validation de données
End With 'fin de la prise en compte de la validation de données de C27
Application.ScreenUpdating = True ' affiche les rafraîchissements d'écran
End SubEt si Djidji te trouve une nouvelle formule pour l'ancienneté, utilise la et supprime la partie du code entre les deux lignes d'astérisques...
re
et avec une formule :
En passant, quand on veut travailler sur des dates, il est obligatoire de mettre des dates au format excel (en general jj/mm/aaaa) que tu peux transformer a ta guise pour avoir des textes. Sinon, c'est une usine a gaz pour en sortir des dates.
Par exemple, à quoi sert de mettre "mois de janvier 2021" alors que" janvier 2021" suffit, et que c'est obtenu à partir de la date 01/01/2021 en format personnalisé mmmm aaaa ? et que si tu la regardes en format standard, elle apparait, comme toute bonne date excel, sous la forme 44197 qui permet de faire des calculs.
Tu devrais revoir toutes tes dates si par la suite tu veux encore faire des opération dessus !
Crdlmt
Bonjour,
Merci infiniment à vous pour votre aide et vos solutions !
Oui alors pour le nom des entêtes comprenant "Mois de ...." c'est parce qu'en réalité cela reprends des valeurs indiquées dans une autre feuille excel (mon fichier comprend une 20aine de feuilles), le tableau existait avant mon arrivée du coup j'ai préféré conserver la mise en forme pour éviter des erreurs.
Maintenant pourquoi pas repartir sur un format de date personnalisé, oui je vais faire çà ce sera bien plus logique.
En tout cas, vous allez très certainement me faire gagner un temps fou !
Merci encore !
Re-bonjour,
Finalement j'ai repris la mise en forme exacte de mon fichier pro, et effectivement à ce moment là la formule DATEDIF ne peux plus vraiment fonctionner. Voilà la véritable mise en forme du tableau avec les intitulés exact, pas sur qu'une formule puisse convenir du coup pour mettre à jour automatiquement la colonne "Ancienneté du client".
Cordialement
Et comment on voit l'année, dans ta feuille 1 ??
et ton tableau, tu en as les sources ?
Crdlmt
C'est le problème du fichier de base, il n'y a pas l'année indiquée dans le listing, juste la succession des "Intitulé 01 Décembre", "Intitulé 02 Janvier" etc.
par exemple : "Rendez-vous 01 Décembre", le raisonnement avait été basé sur le numéro "01", et pas spécialement sur l'année.
Du coup, quand je cherche par exemple le nombre de RDV de la tournée "02", je cherche "Rendez-vous 02 Janvier".
Merci quand même et bonne soirée :-)