Transfert liste tableau spécifique

Bonjour à tous, Bonjour le forum,

Tout d'abord meilleur vœux à tous.

Voici mon soucis, à l'époque le regretté MFerrand m'avait écrit un code qui permet un transfert d'une liste dans un tableau... Le tableau à changé et j'ai essayé d'adapter son code mais je n'y arrive pas...

Dans l'onglet répartition, il y a un bouton qui génère le tableau

Dans le fichier, il y a un exemple souhaité...(un dessin vaut mieux qu'un grand discours)

16transfert-2021.xlsm (121.96 Ko)

Merci pour l'aide

OLi

Bonjour,

Ps toujours facile de reprendre après quelqu'un.

Il faudrait quand même que tu précises les fonctionnalités ...

  • quelles sont les données d'entrée ? je suppose que c'est l'onglet Liste2
    • ce n'est du reste pas un tableau
    • les lignes colorés sont-elles une signification ?
  • où sont les données de sortie et sous quel format les veux tu ?
    • je suppose qu'il faut oublier l'onglet répartition et prendre le dernier onglet ? c'est bien cela ?
    • où se trouve le matricule de la personne ? et la date de naissance ? pourquoi les en-têtes ne sont pas globalement écrits de la même façon ?
    • comment fait-on la distinction entre filières prep et autres filières ?

Connais-tu PowerQuery intégré à ta version d'excel ? ... c'est sans doute la meilleures solution (que je maîtrise encore mal).

Bonjour Steelson,

Merci de t'intéresser à mon problème.

Les données effectivement se trouve dans l'onglet Liste2, j'ai repris les données effectivement d'un tableau qui était dans un autre classeur. La couleur était affectée au tableau. ici pas besoin de couleur.

Effectivement il faut prendre en tableau final celui de l'onglet souhaité.

Col A doit accueillir le n°ordre qui ne peut pas être doublé si les col de C à F sont identique.

Ceci est valable aussi pour le nom, prénom, date de naissance et sexe

c'est la première partie du tableau (renseignements élèves)

la seconde, c'est la répartition des cours, dans la domaine musique et parole.

elle se repartit de la façon suivante : Cours - Filière Prep - Périodes - autres filieres - périodes

Les cours préparatoires sont représentées par un P suivi d'une chiffre. autres filières c'est le reste.

Les cours dans la colonne cours, les degrés : soit en Préparatoire ou autre filière et y indiquer le nombre de périodes

idem pour le domaine de la parole

j'espère que cela est un plus clair....

OLi

Une version plus simple et maintenable par toi-même ... un simple TCD sur une liste formatée en tableau et des titres de colonnes homogènes avec le résultat attendu ! J'ai ajouté des segments.

re,

Merci pour ta proposition...il y a juste que les cours doivent être scindé la partie musique , la partie Parole...

de cette façon :

CoursFil.PrepPériodeA.FilièrePériode

Pour chaque domaine

J'aime bien le VBA, mais j'aime aussi faire les choses simples, dans un soucis de maintenance et de facilité d'utilisation.

En fait, qui fixe cette contrainte de présentation ? est-elle flexible ?

il y a juste que les cours doivent être scindé la partie musique , la partie Parole...

de cette façon :

CoursFil.PrepPériodeA.FilièrePériode

Pour chaque domaine

Avant de proposer cette solution j'avais réfléchi aux avantages et inconvénients, et il me semblait que cela te donnait la main (à la place d'un code qu'il faut d'abord savoir déchiffrer !)

solution spécifique macrosolution TCD
avantagescorrespond strictement à la demande à l'instant tfacilité de mise en œuvre, pas de macro
sorties reconfigurables en jouant avec les sélections des segments
simple à modifier le cas échéant
inconvénientsévolutions difficilesil faut s'adapter à la lecture légèrement différente
requiert des compétences VBA pour faire évoluer
long à mettre en œuvre

Il est en effet possible par ce biais de sortir 2 tableaux, un pour la partie musique et un pour la partie Parole.

Je trouve dommage de remplacer les outils en natif par des codes VBA alambiqués quand on peut.

re,

La solution du TCD est très bien pour moi(j'avais vu que l'on pouvais faire des tableaux séparés), mais pas pour la hiérarchie... , ils veulent absolument le tableau comme ils m'ont conçu... Hélas, je ne pas faire autrement.

Je garde ton TCD, il pourra me servir...

J'aimerais si c'est possible la solution en vba...(j'apprends tout doucement le vba)

Je t'en remercie par avance

OLi

ok je le ferai

J'ai toujours regretté que la hiérarchie fixe à la fois l'objectif et les moyens, le fond et la forme, cela bride toute créativité ... et toute simplicité parfois ! je pense qu'ils ne se rendent pas compte parfois des surcoûts en développement, et en maintenance. J'ai souvent rencontré cela dans l'éducation nationale (un comble !).

J'ai rédigé de façon simple afin que tu puisses te l'approprier ... (on pourrait faire plus condensé)

Sub Répartir()

' les données sont réputés triées par personnes

Dim liste As Worksheet, tablo As Worksheet
Set liste = Sheets("Liste2")
Set tablo = Sheets("TAbleau souhaité")

numero = 0
ligne = 2
matricule = ""
With tablo
    For i = 2 To liste.Range("A" & Rows.Count).End(xlUp).Row
        ligne = ligne + 1

        If liste.Range("A" & i) <> matricule Then
            matricule = liste.Range("A" & i)
            numero = numero + 1
            .Range("A" & ligne) = numero
            .Range("B" & ligne) = matricule
            .Range("C" & ligne) = liste.Range("B" & i)
            .Range("D" & ligne) = liste.Range("C" & i)
            .Range("E" & ligne) = liste.Range("D" & i)
            .Range("F" & ligne) = liste.Range("E" & i)
        End If

        If liste.Range("I" & i) = "Domaine de la musique" Then
            .Range("G" & ligne) = liste.Range("F" & i)
            If Left(liste.Range("G" & i), 1) = "P" Then
                .Range("H" & ligne) = liste.Range("G" & i)
                .Range("I" & ligne) = liste.Range("H" & i)
            Else
                .Range("J" & ligne) = liste.Range("G" & i)
                .Range("K" & ligne) = liste.Range("H" & i)
            End If
        Else
            .Range("L" & ligne) = liste.Range("F" & i)
            If Left(liste.Range("G" & i), 1) = "P" Then
                .Range("M" & ligne) = liste.Range("G" & i)
                .Range("N" & ligne) = liste.Range("H" & i)
            Else
                .Range("O" & ligne) = liste.Range("G" & i)
                .Range("P" & ligne) = liste.Range("H" & i)
            End If
        End If

    Next
End With

End Sub
15transfert-2021.xlsm (23.58 Ko)

Encore une autre solution sans macro ... formules et une MFC

Bonsoir Steelson, Bonsoir le forum,

Je te remercie pour ton code simplifié, maintenant, si tu as le temps de mettre le condensé, comme ca je peux voir et étudier les subtilités du VBA.

Cela fonctionne très bien , j'avais fait une erreur dans les colonnes mais j'ai rectifié sans aucun problème...

Pour la solution formules et Mise en Forme Conditionnelle, je suis moins fan...mais j'apprends et c'est le principal...

OLi

La simplification (relative) du code consisterait à mettre des tables de correspondances

origine = Array("A", "B", "C", "D", "E", "F", "G", "H")
dest1 = Array("B", "C", "D", "E", "F", "G", "H", "I")
dest2 = Array("B", "C", "D", "E", "F", "G", "J", "K")
dest3 = Array("B", "C", "D", "E", "F", "L", "M", "N")
dest4 = Array("B", "C", "D", "E", "F", "L", "O", "P")

voire mieux, indiquer ces correspondances dans une feuille afin de faire évoluer sans devoir retoucher le code.

et de faire 2 tests

        test1 = (liste.Range("I" & i) = "Domaine de la musique")
        test2 = (Left(liste.Range("G" & i), 1) = "P")

Resterait à écrire le reste en quelques lignes.


L'important est que tu comprennes le code et que tu puisses le retravailler le cas échéant. C'est la solution que tu dois choisir.

re,

Je te remercie pour tes bons conseils, je vais étudier l'histoire...

Merci encore pour ta disponibilité et du temps consacré.

Bonne Journée...

OLi

Rechercher des sujets similaires à "transfert liste tableau specifique"