Compiler plusieurs colonnes en une seule ?

Bonjour,

Après avoir bien lu les recommandations pré-post, cherché dans le forum, je ne pense pas que ma question ait été posée. Si ça n'est pas le cas, je vous prierais de m'excuser et de bien vouloir me diriger vers le topic concerné. Si c'est le cas, alors j'espère que vous pourrez m'aider !

J'ai un tableau contenant des colonnes "axes de formation", chaque colonne représente un axe (ex : ASH, ENT...)

Les lignes sont les numéros de candidat.

Dans chaque cellule, est inscrit oui ou non, explicitant le choix de chaque candidat.

Mais ayant 14 choix différents, c'est difficile d'y voir clair.

Je souhaiterais avoir une colonne résumant l'axe de formation choisi.

J'ai pensé utiliser les solutions suivantes mais elles ne sont pas optimales et chronophages :

  • Rechercher/remplacer : oui par le nom de l'axe puis trier. Mais pour 80 candidats c'est lourd
  • Rechercher/remplacer : oui et non pas des chiffres, un chiffre, un axe et faire des fréquences. Pas mal mais très long à faire aussi

Avez-vous une idée qui pourrait avec une formule SI par exemple ou ET ou OU ou alors complètement autre chose (!) pourrait m'aider à "compiler" plusieurs colonnes en une ?

J'ai fait un tableau sous Numbers exporté en Excel pour exemple, ce n'est pas mon tableau mais c'est exactement pareil.

Vous remerciant par avance pour votre aide,

Nicolas

Bonjour,

Une solution avec VBA (si j'ai bien compris ton besoin)

47nicoguitare.zip (16.09 Ko)

A+

Bonjour,

S'il n'y a qu'un seul choix "oui" par candidat dans les axes de formation, la solution suivante par formule te suffira.

Regarde et reviens si la solution ne te va pas.

Messieurs bonsoir,

Tout d'abord un grand merci pour votre aide si rapide et si efficace.

Les deux solutions me conviennent bien que :

- pour Raja : effectivement il peut y avoir plusieurs "axes de formation" de fait, la formule doit-être quelque peu modifiée ?

- pour frangy : ta solution inclut la possibilité d'avoir plusieurs "axes de formation". Mon soucis est que je sais comment faire une macro mais pas lire le fichier Visual Basic. Autrement dit, comment décoder ce que tu as fait. Dois-je donc me mettre au VBA pour traduire tout cela ?

Encore merci, c'est une perspective de gain de temps infinie qui s'annonce !!

bonsoir à tous

un essai pour 2 choix; pas plus

31nicoguitare.xls (19.00 Ko)

les formules sont simples

Bonsoir Tulipe_4,

Oui c'est une solution intéressante.

Il faut que je me renseigne afin de savoir si le nombre d'"axes de formations" est limité. Si oui, à combien. S'il est limité à 2 ce serait parfait !

Merci beaucoup pour ces différentes solutions offrant autant de possibilités !

Bonjour,

I l faut effectivement posséder les rudiments de VBA pour comprendre le code.

Dans l’exemple joint, j’ai placé quelques commentaires, ... ça peut aider.

Par contre, cela suppose que tu sais accéder à l’éditeur pour visualiser le code. Si ce n’est pas le cas, il y a quelques tutoriels pour apprendre à utiliser VBE. Dis-moi si tu as besoin d’aide.

47nicoguitare.zip (16.83 Ko)

A+

Bonjour,

Merci pour le document que j'ai consulté attentivement. Objectif : réussir à le faire moi-même.

Je sais accéder à l'éditeur pour visualiser le code. Par contre tu parles de VBE, est-ce une faute de frappe ou est-ce autre chose que VBA (Visual Basic) ?

Merci pour ton aide, je suis en train de potasser le cours VBA !

Est-ce que tu as réalisé la macro ou directement taper le code ?

Par contre tu parles de VBE, est-ce une faute de frappe ou est-ce autre chose que VBA (Visual Basic) ?

L'éditeur de macros est aussi appelé Visual Basic Editor ou VBE. C’est l'environnement dans lequel tu peux modifier les macros que tu as enregistré, écrire de nouvelles macros et de nouveaux programmes VBA.

Est-ce que tu as réalisé la macro ou directement taper le code ?

J’ai forcément tapé le code puisqu’il n’est pas possible d’enregistrer directement les opérations décrites par le programme. Quand tu écris un programme, tu peux t’aider de l’enregistreur de macro pour visualiser le code correspondant à certaines opérations mais généralement, tu es obligé de mettre ta patte pour le finaliser.

A+

Ok. Merci encore beaucoup.

A toi de me dire si tu penses que le sujet peut-être marqué comme validé.

A mon échelle, je sais que c'est possible de compiler plusieurs colonnes en une synthèse. Et je vais chercher à réaliser moi-même la manipulation pour l'appliquer sur mes fichiers.

Si les réponses que nous t'avons apporté te satisfont

Si tu as d'autres soucis, il sera toujours temps d'ouvrir une nouvelle discussion .

Bienvenue dans le monde de VBA et attention au mal de crane .

A+

Ça marche. Merci encore.

Du coup, je me "suis mis" au VBA. En toute humilité hein !! J'ai compris que tu avais utilisé la fonction FOR.

Cependant certaines lignes me restent difficilement compréhensible. Disons que je comprends leur but mais je ne comprends pas pourquoi elles sont écrites ainsi.

Pèle mêle :

LigneFin = .Range("B" & Rows.Count).End(xlUp).Row et ColFin = .Cells(LigneDeb - 1, Columns.Count).End(xlToLeft).Column - 1

Je ne comprends pas pourquoi on désigne les lignes et colonnes de fin ainsi.

ColDeb = 3

Pourquoi ColDeb = 3 et pas = C ? Parce que l'on inscrit tout en chiffre ?

Enfin, je ne vois pas comment est obtenue la synthèse dans le code, c'est à dire quel ordre tu donnes pour qu'elle se fasse dans telle colonne et pas une autre.

Bonjour,

LigneFin = .Range("B" & Rows.Count).End(xlUp).Row et ColFin = .Cells(LigneDeb - 1, Columns.Count).End(xlToLeft).Column - 1

Je ne comprends pas pourquoi on désigne les lignes et colonnes de fin ainsi.

Le traitement doit être effectué sur une plage qui n’est pas forcément figée.

Dans ton exemple, la plage à traiter correspond à C3:G30.

Si le nombre d’axes ou de candidats est variable, le programme doit pouvoir déterminer les limites de la plage à traiter.

Pour la ligne et la colonne de début, c’est facile puisqu’elle est prédéfinie

LigneDeb = 3,

ColDeb = 3 (colonne C).

Pour déterminer la ligne et la colonne de fin, sache qu’il y a plusieurs façons de procéder. Je ne vais pas détailler ces différentes méthodes. J’ai choisi d’utiliser la suivante :

Pour la dernière ligne de la plage à traiter :

LigneFin = .Range("B" & Rows.Count).End(xlUp).Row

je recherche la dernière cellule renseignée de la colonne B. Je me place sur la dernière cellule de la feuille en colonne B, soit Range("B" & Rows.Count), puis je remonte dans la colonne jusqu’à trouver la première cellule renseignée avec End(xlUp).

Et enfin, j’obtiens le numéro de ligne avec la propriété row.

Pour visualiser l’action de cette instruction, tu peux faire la même chose avec Excel en te positionnant sur la cellule B65536 et en appuyant sur fin puis flèche haut.

Pour la dernière colonne, c’est le même principe :

Cells(LigneDeb - 1, Columns.Count).End(xlToLeft).Column

LigneDeb est la première ligne de la plage des données à traiter, soit la ligne 3.

LigneDeb-1 est le numéro de la ligne d’en-tête.

Columns.Count est le numéro de la dernière colonne de la feuille, soit 256 pour ce classeur.

On se place donc sur la dernière cellule de la ligne d’en-tête, soit Cells(LigneDeb - 1, Columns.Count)

puis on remonte dans la ligne vers la gauche jusqu’à trouver la première cellule renseignée avec End(xlToLeft).

Tu peux faire la même chose avec Excel en te positionnant sur la cellule IV2 et en appuyant sur fin puis flèche gauche.

Par contre, tu constates que tu n’es pas positionné sur la dernière colonne de la plage à traiter mais sur la colonne de synthèse. Il faut donc se décaler de -1 pour déterminer ColFin.

ColFin = .Cells(LigneDeb - 1, Columns.Count).End(xlToLeft).Column - 1

ColDeb = 3

Pourquoi ColDeb = 3 et pas = C ? Parce que l'on inscrit tout en chiffre ?

Tu peux indiquer la position d’une colonne avec une lettre ou un chiffre.

Exemple pour la cellule IV2

cells(2,"IV" ) ou cells(2,256 ) ou range("IV2").

Enfin, je ne vois pas comment est obtenue la synthèse dans le code, c'est à dire quel ordre tu donnes pour qu'elle se fasse dans telle colonne et pas une autre.

La copie du texte correspondant à la synthèse des axes de formation pour un candidat est effectuée par la ligne de code

.Cells(i, ColFin + 1) = Right(Texte, Len(Texte) - 3)

Le texte est donc collé dans la cellule Cells(i, ColFin + 1)

L’index i correspond à la ligne (valeur itérée par une boucle for...next),

ColFin +1 correspond à la colonne décalée de 1 par rapport à la dernière colonne renseignée sur la ligne d’en-tête, soit la colonne de synthèse.

Coté migraine, ça va ?

A+

frangy a écrit :

Dans ton exemple, la plage à traiter correspond à C3:G30.

Tu veux dire C3:G3 non ?

frangy a écrit :

Si le nombre d’axes ou de candidats est variable, le programme doit pouvoir déterminer les limites de la plage à traiter.

Apparemment c'est le cas donc il vaut mieux.

Je note aussi que je dois modifier le code si ma colonne de début n'est plus C3 et la remplacer par la colonne et la ligne correspondante.

frangy a écrit :

Pour la dernière ligne de la plage à traiter :

LigneFin = .Range("B" & Rows.Count).End(xlUp).Row

je recherche la dernière cellule renseignée de la colonne B. Je me place sur la dernière cellule de la feuille en colonne B, soit Range("B" & Rows.Count), puis je remonte dans la colonne jusqu’à trouver la première cellule renseignée avec End(xlUp).

Et enfin, j’obtiens le numéro de ligne avec la propriété row.

Pour visualiser l’action de cette instruction, tu peux faire la même chose avec Excel en te positionnant sur la cellule B65536 et en appuyant sur fin puis flèche haut.

Très clair et très ingénieux.

frangy a écrit :

Pour la dernière colonne, c’est le même principe :

Cells(LigneDeb - 1, Columns.Count).End(xlToLeft).Column

LigneDeb est la première ligne de la plage des données à traiter, soit la ligne 3.

LigneDeb-1 est le numéro de la ligne d’en-tête.

Columns.Count est le numéro de la dernière colonne de la feuille, soit 256 pour ce classeur.

On se place donc sur la dernière cellule de la ligne d’en-tête, soit Cells(LigneDeb - 1, Columns.Count)

puis on remonte dans la ligne vers la gauche jusqu’à trouver la première cellule renseignée avec End(xlToLeft).

Tu peux faire la même chose avec Excel en te positionnant sur la cellule IV2 et en appuyant sur fin puis flèche gauche

Ok mais dans cet exemple, j'ai extrait de mon classeur original les données qui m'intéressaient. Lors de l'application prochaine de cette procédure sur un autre classeur aurais-je tout intérêt à créer un tableau ne contenant que ces données à synthétiser ou est-ce envisageable de générer cette synthèse à l'intérieur du classeur original ?

Personnellement, je ne vois pas d'objection à créer un classeur ne contenant que les données que je souhaite synthétiser car cela sera plus lisible que noyé dans la masse du classeur original. Mais qu'en penses-tu ?

Cette question inclut aussi ta réponse qui concerne l'inscription de la synthèse dans le tableau.

frangy a écrit :

Coté migraine, ça va ?

Je dois avouer que c'est complexe ! Pour être franc, je lis, je relis, je laisse passer quelques heures et je relis. Comme ça, je comprends ! Mais je suis loin d'être prêt !!!!!!

Cependant, tes explications sont très claires et limpides, ce qui m'aide énormément ! Encore et encore merci !

Bonjour,

Tu veux dire C3:G3 ?

Non, la plage à traiter correspond aux données correspondant à tous les axes de formation et pour tous les candidats, à savoir C3:G30.

Je note aussi que je dois modifier le code si ma colonne de début n'est plus C3 et la remplacer par la colonne et la ligne correspondante.

Exact.

Est-ce envisageable de générer cette synthèse à l'intérieur du classeur original ?

C’est bien sûr envisageable mais il faudra alors adapter le code afin de redéfinir les limites de la plage à traiter et la position de la colonne synthèse.

La solution dépend du cas de figure : nombre de colonnes figé ou non, position de la colonne de synthèse déterminée ou pas.

Dans tous les cas, il faut trouver le moyen de déterminer les limites de la plage à traiter et la position de la colonne Synthèse.

A+

D'où la solution intermédiaire de copier/coller dans un autre classeur ou une autre feuille les données à synthétiser.

Merci

Hum, sauf que maintenant je ne sais pas comment appliquer la macro que tu as faîtes...

Je copie/colle puis modifie ton code dans mon fichier ? Vais tester cela.

Je sais pas comment supprimer un message, je voulais éviter le monologue.

Donc deux problèmes :

1.) Je ne sais pas comment activer ma VBA avec un bouton. Je sais pour une MAcro mais pas pour une VBA.

2.) En admettant que j'arrive à lancer mon VBA, je ne suis pas certain que mon code soit bon.

Mais faisons étape par étape !

Bonjour,

Je ne sais pas comment activer ma VBA avec un bouton. Je sais pour une MAcro mais pas pour une VBA.

Tu disposes pour cela de 2 types de controles :

  • Contrôles de Formulaires
  • Contrôles ActiveX
Dans le classeur nicoguitare-2.xls, le bouton "FAIRE LA SYNTHESE" est un contrôle ActiveX.

Il porte le nom "Synthetiser" et la procédure associée au clic sur ce bouton est Synthetiser_Click().

Tu peux placer ce type de contrôle via l'onglet Developpeur / Inserer.

Cordialement.

Rechercher des sujets similaires à "compiler colonnes seule"