Signaler

Concatener noms des colonnes si "x" [Résolu]

Posez votre question excel300817 3Messages postés mercredi 30 août 2017Date d'inscription 3 septembre 2017 Dernière intervention - Dernière réponse le 4 sept. 2017 à 12:13 par eriiic
Bonour,

Voici ma situation : J'ai un tableau contenant des lignes recensant des années (ex : 1971, 1972, etc.) et des colonnes recensant des prénoms (Amélie, Baptiste, Clément). Pour chaque année je coche (avec un "x") les prénoms des personnes nées au cours de l'année en question.

Je souhaite créer un code VBA (et seulement VBA car le fichier est entièrement automatisé) qui puisse concaténer dans une feuille "synthèse" où nous retrouvons les années :

Les prénoms de chaque employé née au cours de cette année.
Par exemple, pour 1975, je devrais avoir "Thibault-Xavier".

La macro devrait donc rechercher l'année dans les lignes de mon tableau, vérifier s'il y a un "x" et concatener le nom des colonnes concernées.

Malgré plusieurs essais je n'ai pas réussi et je fais appel à votre aide!!!

Dans l'attente, je vous remercie!!!
Utile
+2
plus moins
Bonjour,

Merci de déposer le fichier xls (réduit au nécessaire et anonymisé et le résultat attendu) sur cjoint.com et coller ici le lien fourni.

Pour ma gouverne, en quoi si quelqu'un te fait ça par formule ça t'empêcherait de l'utiliser en macro ? Ca m'échappe...
eric
excel300817 3Messages postés mercredi 30 août 2017Date d'inscription 3 septembre 2017 Dernière intervention - 30 août 2017 à 16:52
Bonjour eriiic,

Voici le lien :
http://www.cjoint.com/c/GHEoYKSqw1q

J'ai réduit le tableau au maximum !

Oui, je peux effectivement reprendre la formule dans la macro.

Merci par avance!
Répondre
eriiic 21052Messages postés mardi 11 septembre 2007Date d'inscription ContributeurStatut 23 septembre 2017 Dernière intervention - 30 août 2017 à 17:35
En supprimant la 1ère ligne vide (inutile et je n'aime pas) :
Sub concat()
    Dim datas, result(), lig As Long, col As Long
    datas = [A1].CurrentRegion.Value
    ReDim result(1 To UBound(datas), 1 To 2)
    result(1, 1) = "Année": result(1, 2) = "Prénoms"
    For lig = 2 To UBound(datas)
        result(lig, 1) = datas(lig, 1)
        For col = 2 To UBound(datas, 2)
            If datas(lig, col) = "x" Then result(lig, 2) = result(lig, 2) & "-" & datas(1, col)
        Next col
        result(lig, 2) = Mid(result(lig, 2), 2)
    Next lig
    With Sheets("Synthese")
        .[A:B].ClearContents
        With .[A1].Resize(UBound(datas), 2)
            .Value = result
            .Borders.LineStyle = xlContinuous
            .Borders.Weight = xlThin
        End With
        .Select
    End With
End Sub
Répondre
excel300817- 1 sept. 2017 à 14:07
Bonjour eriiic, je te remercie pour ce code.
A quoi sert UBound exactement?

Par ailleurs, je pense avoir besoin de tes compétences pour un autre fichier!
Je pensais pouvoir m'aider du premier code pour le réadapter à celui-ci mais il m'a pas l'air si simple que ca en sachant que je suis que débutante en vba et que je m'aide pas mal des forums (notamment de tes réponses, merci !).

Voici le lien : http://www.cjoint.com/c/GIbl4zEx8Ir

Après avoir renseigné le nombre de phases et renseigné les phases correspondant aux sous-groupes par des "x", je voudrais également que dans le tableau synthèse il n'y ait pas "2 phases" mais le nom des phase avec des tirets (feuille 3, ligne 55)

N'hésite pas à m'écrire si le fichier n'est pas clair (La macro qui complète le tableau dans la feuille 3 est e bas de page du module 2).

Je te remercie par avance et espère que tu pourras répondre à mes interrogations!!!

Bonne journée
Répondre
eriiic 21052Messages postés mardi 11 septembre 2007Date d'inscription ContributeurStatut 23 septembre 2017 Dernière intervention - 1 sept. 2017 à 17:28
Bonjour,

A quoi sert UBound exactement?
F1 dessus et précise ce que tu n'as pas compris.

Pour le reste tes noms sont bourrés de #REF!, faire le ménage dedans stp.
Et tes explications sont trop sommaires pour comprendre ce que tu veux, où et avec quoi.
eric
Répondre
excel300817- 3 sept. 2017 à 01:48
Bonjour Eric,

Utilisation du fichier : renseigner le nb de phases et leur noms puis cliquer sur "démarrer" (je préremplis ces champs). Dans la nouvelle feuille (2), pour chaque facteur mettre un "x" lorsqu'ils sont concernés par une phase (je préremplis). La feuille 3 s'ouvre avec un tableau (à partir de la ligne 55) qui expose les facteurs qui sont concernés par des phases. (Il faut effacer les lignes du tableau pour relancer la macro.)

Résultat attendu : Dans le tableau de la feuille 3, au lieu d'avoir le nombre de phase (lorsqu'il est supérieur à 1), je souhaiterais avoir le nom exact de toutes les phases (avec des tirets) pour chaque facteur. Par exemple, pour le facteur AA1, si ce sont les phases a et b qui sont cochées avec un "x", je souhaiterais que le tableau affiche :
- a
- b
et non pas "2 phases" dans la colonne 2 du tableau de la feuille 3 (ligne 55)


Précisions : c'est le module 2 qui est à modifier (les dernières modifications sont à la fin du module 2, notamment pour avoir le résultat "2 phases" qui n'est finalement pas assez précis.

Nouveau lien du fichier : http://www.cjoint.com/c/GIcxThzqJaV

Merci pour ton aide Eric !
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonjour,


Terminé pour moi
eric
excel300817 3Messages postés mercredi 30 août 2017Date d'inscription 3 septembre 2017 Dernière intervention - 3 sept. 2017 à 11:06
Bonjour Eric,

Je suis désolée, je ne savais même pas que des cellules étaient nommées; j'avais modifié les erreurs de référence dans l'éditeur de vba.

Voici le nouveau fichier (j'ai supprimé les noms de cellule, ils ne sont pas utiles) : http://www.cjoint.com/c/GIdjb2OV5fV

Merci pour ton aide! On va bien réussir (enfin "tu"), comme tu le dis dans ta signature :)
Répondre
eriiic 21052Messages postés mardi 11 septembre 2007Date d'inscription ContributeurStatut 23 septembre 2017 Dernière intervention - 3 sept. 2017 à 13:39
oui mais là rien ne tournait dans ton fichier. Difficile de deviner le fonctionnement.
Donc détaille une saisie complète et ce que ça doit donner : saisir ça et ça dans telle feuille, telle cellule.
Telle cellule doit alors avoir telle valeur parce que... etc
Et tu complètes avec un fichier contenant tous les cas de figure en exemple et ce qui est retourné en vert qu'on sache ce qu'il y a à faire.
Répondre
excel300817- 3 sept. 2017 à 18:05
Eric,

Je t'envoie 2 liens :

http://www.cjoint.com/c/GIdqeajRzyV : Fichier vierge sur lequel tu peux tester d'éditer le tableau final
http://www.cjoint.com/c/GIdqePxURFV : Fichier pré-rempli avec feuille 4 qui précise les anomalies et le résultat attendu

Nous utilisons ce fichier pour chaque activité dans le but d'éditer le tableau de synthèse que nous avons ligne 55 de la feuille 3 à la fin de toutes les saisies.
Nous dupliquons donc le fichier à chaque activité en supprimant les lignes du tableau de synthèse et en recommençant toute la saisie à chaque fois.

Voici la saisie :

Feuille 1 (préparation de la synthèse) :
- Compléter le nb de phases (ex: 3)
- Compléter leur nom (ex: Marcher, courir, sauter)
- Cliquer sur démarrer

Feuille 2 (préparation de la synthèse) :

- Mettre des "x" pour chaque sous-groupe qui participent à une ou plusieurs phases (cellules de la colonne C, D, E voire plus). Par exemple le sous-groupe CC2 peut intervenir pour les phases marcher et courir, on met alors un "x" dans les cellules C20 et D20
- Mettre éventuellement un commentaire (colonne R)
- Cliquer sur valider

Feuille 3 (synthèse) :

Nous avons un tableau synthétique de taille variable par sous-groupes à partir de la ligne 55 que nous éditons.
C'est ici que doit avoir lieu la modification; celui-ci n'affiche pas le noms des phases quand il y en a plus d'un par sous-groupe !


Attention, je reprécise, le fichier peut beuguer quand on refait la saisie si les lignes du tableau de synthèse ne sont pas supprimées.

Merci Eric
Répondre
Donnez votre avis
Utile
+0
plus moins
Si jamais tu peux avoir le cas d'une feuille 2 avec une seule phase, tu dis, il faudra que je modifie.
Ayant beaucoup de mal avec ton fichier et son utilisation (entre ce qui est manuel et par macro) je suis parti sur une fonction personnalisée.
Comme ça tu peux l'utiliser tout autant sur la feuille qu'en vba.
Je me suis basé uniquement sur l'exemple feuille 4, qui prend les infos feuille 2
Function phase(ssGroupe As String)
    Dim c1 As Range, c2 As Range, pl As Range
    With Sheets("2")
        Set c1 = .Columns(2).Find(ssGroupe, , xlValues, xlWhole)
        If c1 Is Nothing Then phase = "- ssGroupe inconnu": Exit Function
        Set pl = Intersect(c1.EntireRow, .Range(.[C3], .[C3].End(xlToRight)).EntireColumn)
        For Each c2 In pl
            If LCase(c2) = "x" Then phase = phase & vbLf & "- " & .Cells(3, c2.Column)
        Next c2
    End With
    phase = Mid(phase, 2)
End Function

A mettre dans un module standard.
Syntaxe sur feuille 4, en B13 :
=phase(D13)

Tu dis si je suis dans les clous, je ne suis sûr de rien.
eric

Donnez votre avis
Utile
+0
plus moins
Eric,

Je peux avoir le cas avec une seule phase mais le code VBA que je te demandais devait de toute manière se lancer que s'il y a plus d'une phase. Sinon, ma macro actuelle me retourne bien le nom de la phase (quand il n'y en a qu'une).

Par ailleurs, comment est-ce que je peux faire en sorte que la fonction s'insère dans la cellule par le biais de la macro en sachant que la taille du tableau (feuille 3) est variable ?
A quel moment dois-je coller ce code dans le module 2 ?

PS : si tu regardes le module 2, j'ai fait des retraitements car la première version affiche les sous-groupes par phase et non le contraire. Mon retraitement se base sur la première version du tableau pour le modifier en supprimant les lignes qui comportent la même phase. N'est-il pas possible de faire la même chose pour ma demande et donc une concaténation ? (je pense que ça peut être plus simple, si c'est possible).

Merci par avance
Donnez votre avis
Utile
+0
plus moins
Module 2 c'est vague, tu n'es pas une adepte de la précision, il va falloir t'y mettre.
De plus je ne vois pas ce que feuille 3 vient faire ici (?) J'ai regardé feuille 4, je suppose que c'est son pendant.

Si tu es vba pas besoin de coller la fonction.
Là où tu mettais "2 phases" qui ne te satisfaisait pas, tu dois connaitre le sous-groupe (c'est impératif). Imaginons que ce soit dans une variable ssG
Si tu avais cells(lig,2)= "2 phases" (en gros), tu mets :
cells(lig,2) = phase(ssG)

Je suppose que c'est dans ce coin :
 If WorksheetFunction.CountIf(Ligne, "x") > 1 And DD <> "" Then
DD.Offset(0, -2) = WorksheetFunction.CountIf(Ligne, "x") & " phases"
End If

Ca te suffit comme explication ?
Mais peut-être as-tu du ménage à faire en plus (?)
Ton style de code personnel (on a chacun le sien), en plus l'absence courante d'indentation ne facilitent pas la lecture...

D'ailleurs en essayant de chercher ta proc j'ai vu que tu avais une variable phase. Renomme la fonction autrement dans ce cas.

Fonction (renommée) pour 1 à x phases :
Function LPhase(ssGroupe As String) As String
    Dim c As Range, pl As Range
    With Sheets("2")
        Set c = .Columns(2).Find(ssGroupe, , xlValues, xlWhole)
        If c Is Nothing Then LPhase = "- ssGroupe inconnu": Exit Function
        If .[D3] = "" Then Set pl = .[C3] Else Set pl = .Range(.[C3], .[C3].End(xlToRight))
        For Each c In Intersect(c.EntireRow, pl.EntireColumn)
            If LCase(c) = "x" Then LPhase = LPhase & vbLf & "- " & .Cells(3, c.Column)
        Next c
    End With
    LPhase = Mid(LPhase, 2)
End Function

eric
Donnez votre avis
Utile
+0
plus moins
Eric,


La feuille 4 était un récap, comme tu l'avais demandé mais il reprend le tableau synthèse qui se forme dans la feuille 3.
Je laisse tomber mon histoire de modification du module 2 que j'ai du mal à expliquer.


En revanche, j'ai essayé avec cette fonction en tapant :

If WorksheetFunction.CountIf(Ligne, "x") > 1 And DD <> "" Then
DD.Offset(0, -2) = Lphase(DD)
End If
Ca ne marche pas.. J'ai "type d'argument byRef incompatible"..
Fichier : http://www.cjoint.com/c/GIdvKcofcKV

Pour tester avec ce fichier :
- Démarrer (feuille 1) => Valider (ligne 70 de la feuille 2)
(Bien entendu, la feuille 3 s'affiche lorsque la validation fonctionne)

Merci !!
eriiic 21052Messages postés mardi 11 septembre 2007Date d'inscription ContributeurStatut 23 septembre 2017 Dernière intervention - 4 sept. 2017 à 09:32
Bonjour,

Je laisse tomber mon histoire de modification du module 2 que j'ai du mal à expliquer.
Mais tu es dedans là non ?
sinon :
DD.Offset(0, -2) = LPhase(DD.Value)

eric
Répondre
excel300817- 4 sept. 2017 à 12:00
Eric,

Malgré les incompréhensions et difficultés d'expression dues à la complexité du fichier, tu as réussi à répondre à ma demande. Je te remercie beaucoup !!!!
Je suis désolée mais je n'hésiterai pas faire appel à tes compétences si besoin^^ ;)
Répondre
eriiic 21052Messages postés mardi 11 septembre 2007Date d'inscription ContributeurStatut 23 septembre 2017 Dernière intervention - 4 sept. 2017 à 12:13
Disons que ce n'est pas simple de s'approprier un fichier déjà avancé en code sans éplucher toutes les lignes une à une ;-)
D'où l'idée d'une fonction qui ne répond qu'à la question et facile à greffer.
Bonne continuation.

eric
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !