Microsoft 365 renvoyer l'en-tête d'une colonne

insaf1991

XLDnaute Nouveau
Bonjour tous le monde,
Alors j'ai deux problèmes :
1) je veux combiner une liste déroulante avec la fonction si, c-à-d faire des choix selon la valeur sélectionnée dans la liste, mais je n'arrive pas à le faire :(
2) une fois le choix est fait, je veux renvoyer l'en-tête de la colonne (le nom inscrit dans le tableau) et pas les valeurs cherchée

voilà un fichier ci joint qui explique (j'espère) ce que je veux
Merci pour votre aide
 

Pièces jointes

  • test_1.xlsx
    11.2 KB · Affichages: 5

insaf1991

XLDnaute Nouveau
Re-bonjour,
Merci infiniment vgendron ça fonctionne très bien surtout avec le code, car il affiche juste les colonnes concernés 😃

j'ai essayé de lire le code mais je suis débutante en VBA, je ne vois pas comment c'est possible d'étendre la marge de sélections (que ça soit pour le nombres des étudiants ou pour le nombre de matières)
 

vgendron

XLDnaute Barbatruc
il suffit de déplacer les infos souhaitées au bon endroit.. et adapter le code

Dans la Pièce Jointe, j'ai apporté quelques modifs

1) une feuille Liste qui permet de lister tous les éléments qui peuvent etre utilisés dans le tableau
==> ce sont des tableaux structurés avec un nom explicite "Tab_xxx"
l'utilité: il te suffit d'ajouter des éléments sous le tableau pour que les nouveaux éléments soient automatiquement pris en compte

==> ces tableaux servent à alimenter des listes de validation
pas de risque d'erreur de syntaxe lors de la saisie
dans la feuille "Source", le tableau est rempli avec ces listes de validations pour les activités, les étudiants et les matières

2) j'ai ajouté une colonne vide rouge pour séparer les étudiants et Matières.. en prévision d'une question future pour ajouter des etudiants et/ou matières dans ton tableau

3) dans la feuille "Résultat"
tu choisis l'étudiant en B2 (liste de validation toujours alimentée par le tableau "Tab_Etudiants" de la feuille Listes

lorsque le choix est fait, la macro se lance automatiquement
j'ai commenté toutes les lignes de code

une fois que tu as la liste des matières pour l'étudiant. que comptes tu en faire??
 

Pièces jointes

  • test_1.xlsm
    24.9 KB · Affichages: 1

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

Une autre manière de procéder uniquement sur Office 365 avec une fonction personnalisée matricielle:
=ListeMatières(Xetudiant, plageEtudiant , PlageMatieres ) où
  • Xetudiant est le nom de l'étudiant
  • plageEtudiant est la plage des étudiant (dans le fichier Feuil1!B4:D11)
  • PlageMatieres est la plage des matières (dans le fichier Feuil1!E4:H11)
Il suffit de mettre la fonction dans une seule cellule:
VB:
=ListeMatières(A1 ; Feuil1!B4:D11 ; Feuil1!E4:H11)
Voir Feuil1 cellule E17 et Feuil2 cellule A2

Le code de la fonction dans module1:
VB:
Function ListeMatières(Xetudiant, plageEtudiant As Range, PlageMatieres As Range)
'La fonction retourne toujours un tableau en ligne
Dim tEtu, tMat, n&, i&, j&, res, nres&, x
   On Error Resume Next: n = Application.Match(Xetudiant, plageEtudiant.Rows(1), 0): On Error GoTo 0
   'si étudiant inconu
   If n = 0 Then ReDim tres(1 To 1, 1 To 1): tres(1, 1) = "": ListeMatières = tres: Exit Function
   'lecture des valeurs des deux plages
   tEtu = plageEtudiant.Columns(n): tMat = PlageMatieres.Value
   'on parcourt le tableau des matières. si la valeurs n'est pas vide
   'ainsi que la valeur de la colmonne de l'étudiant alors on retient la valeur
   For j = 1 To UBound(tMat, 2)
      For i = 2 To UBound(tMat)
         If tMat(i, j) <> "" Then
            If tEtu(i, 1) <> "" Then
               'on concatène la matière à res (sauf si la matière est déjà au sein de tres)
               If InStr(res, tMat(1, j)) = 0 Then
                  nres = nres + 1: res = res & ";" & tMat(1, j)
                  Exit For    'inutile de poursuivre dans la colonne, la matière vient d'être retenue
               End If
            End If
         End If
      Next i
   Next j
   If res <> "" Then res = Mid(res, 2)
   Select Case nres
      Case 0      'aucune matière
         ReDim tres(1 To 1, 1 To 1)
         tres(1, 1) = ""
      Case 1      'une seule matière
         ReDim tres(1 To 1, 1 To 1)
         tres(1, 1) = res
      Case Else   ' 2 matières et plus
         ReDim tres(1 To 1, 1 To nres): j = 0
         For Each x In Split(res, ";"): j = j + 1: tres(1, j) = x: Next
   End Select
   ListeMatières = tres
End Function
 

Pièces jointes

  • insaf1991- Liste matières- v1.xlsm
    21.9 KB · Affichages: 1

vgendron

XLDnaute Barbatruc
Une nouvelle version qui permet d'ajouter des lignes d'activités
ainsi que des étudiants ou des matières

pour ajouter une ligne: il suffit de selectionner la dernière activité de la colonne A==> un + apparait: il faut cliquer dessus
pour ajouter un étudiant==> il suffit de selectionner le dernier étudiant à gauche de la colonne rouge==> un + apparait
pour ajouter une matière... bingo !! c'est pareil ;)
 

Pièces jointes

  • Gestion Etudiants.xlsm
    35 KB · Affichages: 2

insaf1991

XLDnaute Nouveau
Je trouve pas les mots pour te remercie, c'est exactement ce que je voulais, merci infiniment 🙌
pour ta question sur l'étape qui suit, c'est une classification des matières par ordre d'importance.

Merci encore une fois
Une nouvelle version qui permet d'ajouter des lignes d'activités
ainsi que des étudiants ou des matières

pour ajouter une ligne: il suffit de selectionner la dernière activité de la colonne A==> un + apparait: il faut cliquer dessus
pour ajouter un étudiant==> il suffit de selectionner le dernier étudiant à gauche de la colonne rouge==> un + apparait
pour ajouter une matière... bingo !! c'est pareil ;)
 

Discussions similaires