Renvoyer suite de cellules textes en fonction du résultat par colonne

Bonjour,

Voici mon problème: J'ai un tableau avec de nombreuses colonnes (50+) où des tests sont effectués dans chacun des tableaux, ces tests qui vont renvoyer pour chaque ligne (des milliers) "VRAI" OU "FAUX".

Je souhaite faire une colonne qui permet de visualiser le titre de chaque colonne où le résultat du texte est "FAUX". En sachant donc que s'il y a plusieurs "FAUX", les titres des colonnes doivent se mettre à la suite les uns après les autres. Je ne sais absolument pas comment faire cela, à part en utilisant une incrémentation de SI mais qui est impossible dès qu'on dépasse quelques colonnes.

Vous trouverez en pièce jointe un tableau illustratif (rien de logique, une seule ligne et que 7 colonnes) où l'objectif est d'obtenir ce que j'ai tapé à la main dans la case jaune manuellement.

Merci énormément pour votre aide, et excusez-moi si la solution se trouve déjà sur le forum, je cherche depuis un petit bout de temps, je n'ai pas trouvé ce problème précisément et j'en ai vraiment besoin pour mon travail.

Cordialement,

Mystogan13

Bonjour,

Une proposition utilisant une fonction personnalisée :

Function NomEnTetesFaux(Plage_En_Tête As Range, Plage_A_Evaluer As Range) As String

Dim Indice As Long, Resultat As String

For Indice = 1 To Plage_En_Tête.Columns.Count 'Parcourir les colonnes
    If Not Plage_A_Evaluer(1, Indice) Then 'Si contenu = "FAUX"
        'Ajout du nom de l'en-tête à la suite des autres
        If Resultat = "" Then
            Resultat = Plage_En_Tête(1, Indice)
        Else
            Resultat = Resultat & ", " & Plage_En_Tête(1, Indice)
        End If
    End If
Next Indice
NomEnTetesFaux = Resultat

End Function

A utiliser comme une fonction classique :

=NomEnTetesFaux($E$7:$K$7;$E8:$K8)

Le fichier :

Bonjour Mystogan13, le forum,

Salut Pedro22 , bravo pour ta fonction perso

Juste une petite remarque si tu me le permets, si cellule vide, ta fonction considère que c'est FAUX,

Une variante ....à tester

Une modif dans la plage de cellules contenant VRAI/FAUX déclenche la macro.

Option Compare Text
Option Explicit

Sub test()
Dim i As Integer, j As Integer
Dim dernCol As Integer

dernCol = Cells(7, Cells.Columns.Count).End(xlToLeft).Column - 1  '-1 car il faut exclure la colonne "Controle non concluant"

Application.ScreenUpdating = False                    'évite le rafraichissement de l'écran

For i = 8 To Range("E" & Rows.Count).End(xlUp).Row    'boucle de la ligne 8 à la dernière utilisée de la colonne E
    Cells(i, dernCol + 1).ClearContents                      'efface la dernière colonne
    For j = 5 To dernCol                              'boucle de la colonne E à la dernière colonne
        If UCase(Cells(i, j)) = "FAUX" Then           'si la cellule contient FAUX
            If Cells(i, dernCol + 1) = "" Then               'si la cellule de la dernière colonne "Controle non concluant"
                Cells(i, dernCol + 1) = Cells(7, j)          'on inscrit la valeur correpondante de la ligne 7
            Else
                Cells(i, dernCol + 1) = Cells(i, dernCol + 1) & ", " & Cells(7, j) 'on concatène les différentes valeurs
            End If
        End If
    Next j
Next i
Columns(dernCol + 1).AutoFit                                 ' on ajuste la largeur de la dernière colonne "Controle non concluant"

Application.ScreenUpdating = True
End Sub

Cordialement,

Salut Pedro22 , bravo pour ta fonction perso

Juste une petite remarque si tu me le permets, si cellule vide, ta fonction considère que c'est FAUX,

Salut xorsankukai !

Merci pour ta remarque, voilà une version qui en tient compte :

Function NomEnTetesFaux(Plage_En_Tête As Range, Plage_A_Evaluer As Range) As String

Dim Indice As Long, Resultat As String

For Indice = 1 To Plage_En_Tête.Columns.Count 'Parcourir les colonnes
    If Not Plage_A_Evaluer(1, Indice) And  Plage_A_Evaluer(1, Indice) <> "" Then 'Si contenu = "FAUX"
        'Ajout du nom de l'en-tête à la suite des autres
        If Resultat = "" Then
            Resultat = Plage_En_Tête(1, Indice)
        Else
            Resultat = Resultat & ", " & Plage_En_Tête(1, Indice)
        End If
    End If
Next Indice
NomEnTetesFaux = Resultat

End Function

Merci Pedro22 et xorsankukai pour vos réponses !

Ta fonction Pedro22 et top c'est exactement ce qu'il me faut !

Merci énormément pour votre aide !

Bonjour,

Actuellement, pour savoir si c'est faux on fait :

If Not Plage_A_Evaluer(1, Indice) ...

Si le contenu de la plage est VRAI, on renvoie l'inverse (NON VRAI = FAUX), donc on ne fait rien. Si le contenu est FAUX, (NON FAUX = VRAI), alors on exécute les lignes de code dans la structure "SI".

Si tu veux pouvoir choisir entre VRAI ou FAUX, il serait plus simple d'inclure un 3ème argument à la fonction. Une proposition :

Function NomEnTetes(Plage_En_Tête As Range, Plage_A_Evaluer As Range, VRAIouFAUX As Boolean) As String

Dim Indice As Long, Resultat As String

For Indice = 1 To Plage_En_Tête.Columns.Count 'Parcourir les colonnes
    If Plage_A_Evaluer(1, Indice) = VRAIouFAUX And  Plage_A_Evaluer(1, Indice) <> "" Then 'Si contenu = "VRAIouFAUX"
        'Ajout du nom de l'en-tête à la suite des autres
        If Resultat = "" Then
            Resultat = Plage_En_Tête(1, Indice)
        Else
            Resultat = Resultat & ", " & Plage_En_Tête(1, Indice)
        End If
    End If
Next Indice
NomEnTetesFaux = Resultat

End Function
=NomEnTetes($E$7:$K$7;$E8:$K8;FAUX)

Bonjour,

Actuellement, pour savoir si c'est faux on fait :

If Not Plage_A_Evaluer(1, Indice) ...

Si le contenu de la plage est VRAI, on renvoie l'inverse (NON VRAI = FAUX), donc on ne fait rien. Si le contenu est FAUX, (NON FAUX = VRAI), alors on exécute les lignes de code dans la structure "SI".

Si tu veux pouvoir choisir entre VRAI ou FAUX, il serait plus simple d'inclure un 3ème argument à la fonction. Une proposition :

Function NomEnTetes(Plage_En_Tête As Range, Plage_A_Evaluer As Range, VRAIouFAUX As Boolean) As String

Dim Indice As Long, Resultat As String

For Indice = 1 To Plage_En_Tête.Columns.Count 'Parcourir les colonnes
    If Plage_A_Evaluer(1, Indice) = VRAIouFAUX And  Plage_A_Evaluer(1, Indice) <> "" Then 'Si contenu = "VRAIouFAUX"
        'Ajout du nom de l'en-tête à la suite des autres
        If Resultat = "" Then
            Resultat = Plage_En_Tête(1, Indice)
        Else
            Resultat = Resultat & ", " & Plage_En_Tête(1, Indice)
        End If
    End If
Next Indice
NomEnTetesFaux = Resultat

End Function
=NomEnTetes($E$7:$K$7;$E8:$K8;FAUX)

Merci beaucoup la fonction est superbe !

Est-il possible si toutes les réponses de la ligne sont fausses ou vraies qu'il y ait écrit "OK" au lieu de rien ?

Après ça tout sera parfait !

Merci énormément pour votre aide.

Bonjour,

Il suffit d'ajouter une ligne de code :

If Resultat = "" Then Resultat = "OK"

Entre Next Indice et NomEnTetesFaux = Resultat.

Mais c'est aussi gérable directement en formule dans Excel...

=SI(NomEnTetes($E$7:$K$7;$E8:$K8;FAUX)="";"OK";NomEnTetes($E$7:$K$7;$E8:$K8;FAUX))
Rechercher des sujets similaires à "renvoyer suite textes fonction resultat colonne"