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
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))