IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Permutation de colonnes


Sujet :

Macros et VBA Excel

  1. #41
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    L'enregistreur de macro n'est jamais suffisant en soit.
    Mais il permet de mettre sur la voie de la solution en indiquant les objets/méthodes/propriétés appropriés.

    Bien sûr, il doit être complété par la lecture de la documentation VBA (aide en ligne) concernant ces objets/méthodes/propriétés et d'une connaissance de base des structures et principes du langage.

  2. #42
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    merci Menhir

  3. #43
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Patrick,


    Un code comme celui que je propose, et comme beaucoup d'autres, parce qu'il est générique, s'utilise en une ligne par un novice, parce qu'il est générique justement, et qu'il demande au novice de le copier-coller puis de l'utiliser selon les commentaires qui sont fournis avec. Sa seule responsabilité, en ce qui concerne un code générique, consiste à savoir le copier-coller puis l'utiliser en passant, dans le cas du mien par exemple, les noms des colonnes dans le bon ordre et sans fautes d'orthographe. C'est une surcouche qu'il peut utiliser comme une procéudere native de VBA ou du modèle objet d'Excel.

    On ne lui demande pas de comprendre ce code, dans un premier temps, il est juste proposé comme solution directement exploitable. Et comme il est générique, ce n'est justement pas grave s'il n'en comprend pas toutes les lignes.

    Si tu lui donnes un code "adapté" à son cas, comme ici, et qui flingue son classeur en bousillant ses formules, ses formats et tout le reste, tu l'aides nettement moins que si tu lui donnes un code auquel il doit simplement passer des paramètres.

    Est-ce si difficile de comprendre cela?

  4. #44
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Est-ce si difficile de comprendre cela?
    non pas du tout
    c'est bien ce que je dis faire faire par quelqu'un

    c'est tout a ton honneur de fournir un code clé en main gratuitement mais ne me dit pas que ca aide un debutant c'est pas vrai , ca lui fait le boulot c'est tout
    ne sachant pas decortiquer un code simple généré ,tu crois qu'il va s'amuser a decortiquer le tiens serieusement ?
    et combien meme il tenterais l'aventure ce serait apprendre a voler en f15 avant de savoir faire du velo
    mais bon si tu veux ta fonction fonctionne il a plus qu'a

  5. #45
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 176
    Points
    4 176
    Par défaut
    Tout à fait d'accord avec l'intervention de @Menhir

    Vu la présentation de @Bert35, j'ai pas l'impression qu'il y a une quelconque mise en forme ou des formules …, mais simplement des données brutes à retravailler afin de faire par la suite une mise en forme finale avec tout ce qui s'en suit. De toute façon il y a que lui qui peut nous le préciser.

    Maintenant il est là pour apprendre, et il peut se rendre compte que selon le contexte de sa problématique, il devra bien faire attention à bien choisir la solution la plus adéquate à son problème …

  6. #46
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Loïc,

    Ca fait vingt ans que j'enseigne Excel et VBA. Je peux t'affirmer que, selon mon expérience, l'enregistreur ne met pas le novice sur la voie. Au pire cela le décourage, au mieux il va s'exténuer des flopées d'heures à essayer de comprendre pourquoi son code ne fonctionne pas, détruit ses données, plante Excel.

    L'enregistreur, ça "aide" soit le gars qui connaît le VBA mais qui ne se souvient plus d'une manip (pour autant que la manip soit réalisable avec l'enregistreur), soit la personne qui a des soirées et des weekends à perdre et qui s'accroche, et ça décourage les autres...

    L'enregistreur, c'est: pas de variables, pas de boucles (donc du code bêtement répétifif), au début pas de Option Explicit, donc des problèmes de faute de frappe qu'on met des heures à déboguer, etc, etc...

    Voilà une plage qui se trouve sur la feuille nommée en Excel Feuil1...

    Nom : 20180905_01.png
Affichages : 487
Taille : 6,5 Ko

    Voici le code de l'enregistreur qui en permute des colonnes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub Macro6()
    '
    ' Macro6 Macro
    '
     
    '
        Sheets("Feuil1").Select
        Range("C1:C3").Select
        Selection.Cut
        Range("A1:A3").Select
        Selection.Insert Shift:=xlToRight
        Range("C1:C3").Select
        Selection.Cut
        Range("B1:B3").Select
        Selection.Insert Shift:=xlToRight
    End Sub
    Essayez de faire l'exercice intellectuel de rendre cette macro générique pour réorganiser n'importe quel tableau (en faisant abstraction de vos connaissances actuelles du VBA). Par exemple, de manière à permuter le tableau suivant se trouvant sur une feuille nommée en Excel Consolidation pour réorganiser les colonnes selon l'ordre Code - Prénom - Nom - Grade - Service - Date.

    Nom : 20180905_02.png
Affichages : 518
Taille : 20,9 Ko

    Alors, il suffit de supprimer les Select comme le propose Patrick? Je pense que c'est un poil plus complexe.
    Il suffit d'appliquer la macro de Ryu en la transformant mal parce que pas commentée? J'ai fait la démonstration que non (ce n'est pas une attaque perso, Ryu, c'est un constat technique).

    Les gens qui viennent sur XL-VBA ne sont ni des programmeurs, ni des passionnés, pour la plupart. Alors leur donner un code qui plante leur fichier et qui va finalement les aider (peut-être!) après une discussion de 50 postes avec des renvois non commentés vers l'aide en ligne, je doute franchement que ça les aide. Beaucoup d'utilisateurs du forum VBA-XL posent des questions non pour apprendre le VBA, mais pour avoir une solution, la plus pertinente possible, à leur problématique du moment, souvent dans l'urgence d'un fichier qui plante alors que ce n'est pas le moment. Leur donner une solution qui plante va les aider? Je pense que non. C'est comme quand on répond à quelqu'un qui se risque à FSO que FSO, c'est de la mer***, c'est lourd, beurk, et qu'on lui balance une api ou un DIR récursif. Qu'Est-ce qu'il s'en fout que FSO soit lourd... Dans 99% des cas, ça fait le job souhaité. Dans la plupart des cas, nous de répondons pas à des programmeurs, juste à des utilisateurs d'Excel pour qui l'application et le VBA sont des outils, dont beaucoup se passeraient volontiers s'ils le pouvaient, et qui n'ont pas toujours la possibilité de faire appel à des prestataires externes (ce que je regrette ). Et contrairement à ce que dit Ryu, non, les gens qui posent des questions sur le forum ne sont pas forcément là pour apprendre, et encore moins avec des codes foireux!

    Et d'ailleurs, Patrick, lorsque tu tentes de proposer du code dans la rubrique Contribuez, que fais-tu d'autre que de proposer du code générique? C'est une attitude pour le moins paradoxale de tenter de proposer du code générique puis de diSi on suit vos raisonnements (adapter, apprendre, ...), supprimons la rubrique Contribuez et supprimons les sources proposées sur le portail Excel, puisque c'est si simple d'adapter le code proposé en réponse à une question... . Honnêtement, je ne vous comprends pas.


    Et pour finir, je me fous que des solutions différentes des miennes soient proposées, ou plutôt non, je trouve ça très chouette, comme le souligne souvent Ryu. Mais faut-il encore qu'elles fonctionnent et qu'elles ne foutent pas la pagaille au lieu de proposer une solution...

  7. #47
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 176
    Points
    4 176
    Par défaut
    Et contrairement à ce que dit Ryu, non, les gens qui posent des questions sur le forum ne sont pas forcément là pour apprendre,
    Rectification : je n'ai pas dit les gens , j'ai parlé de demandeur @bert35 qui à l'air bien motivé pour s'améliorer et donc apprendre, et d'ailleurs il prévoit de créer beaucoup de discussion, d'après ce que j'ai compris.

    Dans le cas de simple données en Value, tu as raison cela doit être un code foireux, que Marc-L m'a appris et qui est cité plusieurs fois pour diverses solutions.

    Maintenant on a fait une polémique sur le code prenant en compte des formules, dont j'ai montré un cas simple et qui marche, mais en aucun cas j'ai dit que l'on pouvait le généralisé à tout;
    et comme tous codes/solutions, ils ont tous à un moment une limite qui fait que l'on doit revoir/étudier la problématique sur certains aspect afin d'éviter des déboires.

  8. #48
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    @pierre
    j'ai fait joujou avec ce truc

    ebauche qui fonctionne facilement transformable en fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [Sub test()
        mestitre = Array("titre4", "titre2", "titre3", "titre1")
        Set plage = Range("A1:D10")
        With plage
            For arr = 0 To UBound(mestitre) - 1
                For i = 1 To .Columns.Count + .Column - 1
                    If Cells(1, i) = mestitre(arr) Then
                        Cells(1, i).Resize(.Rows.Count, 1).Cut
                        If mestitre(arr) <> .Cells(1, (arr + 1) + .Column - 1) Then Cells(1, arr + 1).Resize(.Rows.Count, 1).Insert Shift:=xlToRight
                    End If
                Next
            Next
        End With
        Application.CutCopyMode = False
    End Sub
    je n'ai suivi que le raisonnement de ta macro 6 que j'ai etendu a x colonnes en fonction de l'array des titres

    Nom : demo.gif
Affichages : 604
Taille : 339,9 Ko
    qu'est ce que tu en pense ?
    je pense meme que l'on peut la racourcir d'une ligne ou 2 en mergeant les "IF"

    Bon je l'avoue j'ai mis pres de 20 minute a comprendre pourquoi j'avais une erreur sur la derniere colonne i
    il faut pas la faire c'est tout car elle est forcement a la place indiqué par l'array

  9. #49
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par RyuAutodidacte Voir le message
    [...]

    Dans le cas de simple données en Value, tu as raison cela doit être un code foireux, que Marc-L m'a appris et qui est cité plusieurs fois pour diverses solutions.[...]
    Ca me plairait grandement que tu cites les portions de message ou je dis que le code est foireux pour des Value, car je dis explicitement qu'il ne fonctionne par pour les formules, les formats, la mise en forme conditionnelle.

    Mais qu'il soit pondu par marc-l, le pape ou jupiter, je m'en moque. Il transforme les dates en texte (et donc oui, il est foireux pour des Value, en fait) et il ne fonctionne que dans le cas précis d'une feuille libre de tout autre donnée que celles à permuter, et en les faisant commencer en A1. Et oui, il va demander des transformations importantes pour pouvoir être utilisé hors de ce cas précis et restrictif. On ne peut donc pas dire que ce soit un code mirobolant.

    Citation Envoyé par RyuAutodidacte Voir le message
    [...]Maintenant on a fait une polémique sur le code prenant en compte des formules, dont j'ai montré un cas simple et qui marche[...]
    Je t'ai démontré avec une simple formule toute bête que ton code foire avec des formules.


    Citation Envoyé par RyuAutodidacte Voir le message
    [...]
    mais en aucun cas j'ai dit que l'on pouvait le généralisé à tout;
    et comme tous codes/solutions, ils ont tous à un moment une limite qui fait que l'on doit revoir/étudier la problématique sur certains aspect afin d'éviter des déboires.
    Jusqu'à preuve du contraire, mon code fonctionne dans tous les cas que j'ai soulevé, et peut être adapté facilement pour les tableaux qui ne sont pas structurés, sans casser les formules, sans casser les formats, sans casser les mises en forme conditionnelles, sans casser les formules qui sont ailleurs dans le classeur et qui pointent vers ce qu'on est en train de permuter. A chacun de l'essayer s'il le souhaite, et d'y apporter des améliorations (il y en a sûrement) dans un esprit constructif. Mais s'arcbouter sur une solution foireuse ne me semble pas raisonnable... L'améliorer, la tienne, la mienne ou une autre, me semble bien plus constructif sur un forum

  10. #50
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 176
    Points
    4 176
    Par défaut
    je vais arrêter là la discussion car je pense que l'on ne se comprend pas et j'ai pas envie de rentrer dans un débat ou je parle pas de la même chose que toi et pas dans les mêmes conditions données/codes

    et oui je confirme tu n'as pas dit le mot foireux, c'est moi qui l'ai dit pour la simple raison que tu insistes sur ce code en disant qui ne marche pas pour tel ou tel raisons,
    alors que ce code là je l'utilise mais pas dans les même conditions que tu décris, et il n'a pas vocation à tout faire et ça je le sais.
    Maintenant je n'ai pas cherché la perfection du code à tout faire, mais juste à répondre au besoin du demandeur (qui je pense pour l'instant n'a rien fait sur son fichier au niveau mise en forme, formule, etc …)

    Je clos maintenant la discussion

    PS : j'ai pas critiqué ton code qui peut apporter une solution à des forumeurs, et non ce n'est pas une attaque perso de ma part aussi, je pense juste que tu n'as pas compris je que je voulais expliquer …
    Tant pis c'est pas grave on peut pas forcément se comprendre tout le temps

  11. #51
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    oulah!! pas s'enerver

    @ryu ton code avec evaluate est parfait pour generer une variable tableau avec des colonnes non contigues et meme dans un desordre

    @pierre to code fonctionne pour la permutation

    pourquoi s'enerver les deux codes font pas la meme chose

    quand au mien je vais le rendre plus generique et en faire une fonction

  12. #52
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Ryu,

    Nous ne nous comprenons pas probablement car nous ne poursuivons pas les mêmes finalités. Tu souhaites répondre à un cas précis, je souhaite donner le plus souvent possible du code générique qui peut être utilisé sans se poser de questions. Et ces deux façons se valent, c'est très bien ainsi.

    Par contre, je vois quatre problèmes récurrents dans des discussions comme celles-ci.

    Le premier est que certains prennent parfois pour attaque personnelle la critique technique de la solution qu'ils proposent. Si j'établis une critique technique de la solution proposée ici, c'est qu'elle présente des lacunes graves dans certaines situations, vues sous l'angle d'un code générique (mon angle de vue, donc). Ce n'est pas que je critique Ryu ou n'importe qui, je mets juste le doigt sur des dysfonctionnements potentiels que j'estime graves. Ca s'arrête juste là, et il n'y a pas d'attaque personnelle de ma part dans ces interventions.

    Le deuxième problème que je vois est que n'envisager que la situation décrite par le demandeur initial est à mon sens très (trop) restrictif et l'on découvre souvent, au fil de la discussion, qu'il n'a pas tout dit. On s'empresse alors de patcher la solution proposée pour qu'elle corresponde à la nouvelle situation décrite et on en arrive à une discussion de 50 messages ou plus où la solution devient une improbable usine à gaz. Si on avait regardé la situation avec du recul dès le début, la discussion aurait été courte, compréhensible et la solution proposée aurait probablement fonctionner du premier coup. Comme exemple, je prends le fait que tu mentionné que le demandeur ne parlait pas de tableaux structurés. Et alors? Est-ce pour cela qu'il ne faut pas en parler et ne pas proposer les deux premières étapes qui président à la bonne conception d'un classeur Excel? Ces deux étapes sont: Traiter les données reçues pour les mettre sous la forme d'une table à plat puis transformer cette table à plat en tableau structuré. C'est à mes yeux incontournable si on veut faire du travail de pro. Ce n'est pas de la pensée unique, c'est juste incontournable. Ca va permettre d'utiliser facilement tous les outils qu'Excel met à disposition pour le traitement de données, que ce soit en Excel pur ou en VBA. TOUT le traitement des données va être facilité par la réalisation de ces deux premières étapes. C'est pourquoi, alors que je pensais proposer sur mon blog une solution de permutation de colonnes hors tableau structuré, je vais m'abstenir tant c'est inutile. Je n'envisage la permutation de colonnes que dans le cas de tableaux structurés. Ca n'a pour moi pas de sens de réaliser cela hors tableaux de données.

    Le troisième problème auquel tu es peut-être moins sensible (ce n'est pas une attaque personnelle), c'est que cette solution risque d'être découverte par des internautes qui arrivent sur la discussion par le biais d'une recherche internet, et qui vont la plaquer sur leur classeur, forcément différent de celui pour lequel elle a été créée, et qui vont massacrer leur classeur, alors qu'une solution générique expliquée aurait résolu leur cas. Que vont-ils penser de DVP et de la personne qui a donné la solution? Leur avis sur le répondeur, je m'en fous un peu, mais l'image qu'ils vont avoir de DVP m'importe plus.

    Et le quatrième problème que je vois, c'est que comme les solutions proposées ne sont pas génériques, on répète les mêmes solutions vaguement adaptées de discussion en discussion, avec plus ou moins de bugs et d'appoximations, alors que l'on pourrait créer un réservoir de codes génériques prêts à l'emploi qui profiteraient à toute la communauté, tant il me semble évident que, quel que soit l'enjeu, les problématiques ont déjà été rencontrées et ont déjà été résolues. Chacun réinvente la roue dans son coin en perdant un temps fou et en ayant au final du code bien souvent bancal ou trop strictement adapté à une situation et donc, inutilisable ailleurs. C'est pourquoi j'oriente toujours le demandeur vers des solutions courtes, des petites fonctions les plus génériques possibles et qui s'appuient sur une conception rigoureuse des classeurs.

    J'espère que cela t'aura permis de comprendre mon point de vue, et je te souhaite sincèrement une bonne journée...

  13. #53
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    Bonjour a tous
    voila c'est maintenant une fonction et!!!:

    1. elle fonctionne aussi bien sur un tableau(listobject) q'un range classique
    2. et cela ou que la plage se trouve dans le sheets
    3. la permutation s'argumente par les index de colonne par rapport a la plage
    4. la permutation s'argumente aussi par les titres de colonnes (listobject) ou valeur de la ligne 1 de la plage (range classique)

    La fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Function permute_columns2(plage, mestitre)
        Dim arr&, i&
        With plage
            If IsNumeric(Join(mestitre)) Then For i = 0 To UBound(mestitre): mestitre(i) = .Cells(1, Val(mestitre(i))): Next
          For arr = 0 To UBound(mestitre)
            For i = 1 To .Columns.Count + .Column - 1
                If .Cells(i) = mestitre(arr) Then
                    .Cells(1, i).Resize(.Rows.Count, 1).Cut
                    If mestitre(arr) <> .Cells((arr + 1)) Then .Cells(1, (arr + 1)).Resize(.Rows.Count, 1).Insert Shift:=xlToRight
                End If
            Next
        Next
    End With
    Application.CutCopyMode = False
    End Function
    on peu pas dire que c'est une usine a gaz hein !!

    les sub de tests :

    pour un tableau(listobject)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test2tableau()
    '   mestitre = Array("titre4", "titre2", "titre3", "titre1")    '    par les noms de colonnes (listobject)  OU!!! valeur de ligne1(range classique)
    '   OU
        mestitre = Array(4, 2, 3, 1)    '                                par les indexs colonnes indexées  de la plage (elle commence pas forcement en A1)
        Set plage = Range("Tableau3[#all]")
        permute_columns2 plage, mestitre
    End Sub
    un range classique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test2range()
    '   mestitre = Array("titre4", "titre2", "titre3", "titre1") '    par les noms de colonnes (listobject)  OU!!! valeur de ligne1(range classique)
    '   OU
        mestitre = Array(4, 2, 3, 1)    '                                par les indexs colonnes indexées  de la plage (elle commence pas forcement en A1)
        Set plage = Range("c8:f17")
        permute_columns2 plage, mestitre
    End Sub
    testé et retesté

    la!! elle est generique


  14. #54
    Membre à l'essai
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2018
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2018
    Messages : 37
    Points : 14
    Points
    14
    Par défaut
    Et ben , messieurs les codeurs, vous m'épatez !!
    Juste pour intervertir 2 colonnes, cela en fait des solutions !! Je suis perdu.
    Pour ceux qui veulent, je me suis présenté....ainsi que ce que je recherche dans ma première macro !!

  15. #55
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour on est tout simplement aller plus loins que 2 colonnes (qui peut le plus peut le moins )

  16. #56
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Bonjour
    Juste une interrogation :
    Ce type de démarche (interversion de colonnes) vous parait-il de nature à être répété ?
    Il me semble que non, par construction même. Et donc : -->> "lancement" une seule fois -->> et donc --->> moins de temps à mettre en oeuvre manuellement que par code.
    Seule motivation à mon sens d'agir par code (par exploitation de données présentées de manière figée) : disposition différente des colonnes (en vue d'affichage ou d'impression). Et sans ce cas :
    - sur une autre feuille
    - les formules n'ont aucune utilité
    - et le code est alors ultra simple

    Ce ne sont bien entendu là que mon avis, mon regard et ma manière de considérer la justification d'un développement informatique. Je comprends nonobstant que ces aspects peuvent ne pas être partagés.

  17. #57
    Membre à l'essai
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2018
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2018
    Messages : 37
    Points : 14
    Points
    14
    Par défaut
    Unparia,

    J'ai envie de dire...bingo !!!
    Tu as tt as fait raison. En principe, les donnees issues de ces appareils sont toutes présentées de cette manière.
    Disons que cela me permet de mettre le nez ds le code vba même si c'est plus long.

  18. #58
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par bert35 Voir le message
    Et ben , messieurs les codeurs, vous m'épatez !!
    Juste pour intervertir 2 colonnes, cela en fait des solutions !! Je suis perdu.
    Pour ceux qui veulent, je me suis présenté....ainsi que ce que je recherche dans ma première macro !!
    Pas de quoi, quand on sait que nos codeurs sont prolifiques en imagination de solutions propres aux gouts de chacun d'eux, que par ces temps-ci, ils doivent manquer de problemes hors routine.

  19. #59
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 176
    Points
    4 176
    Par défaut
    Bonjour,

    @Pierre : "Et ces deux façons se valent, c'est très bien ainsi." => C'est ok

    "on découvre souvent, au fil de la discussion, qu'il n'a pas tout dit. On s'empresse alors de patcher la solution proposée pour qu'elle corresponde à la nouvelle situation décrite …"
    => C'est bien pour cela que dès que je le juge nécessaire ( ces derniers temps), j'interroge le demandeur d'apporter des précisions à sa problématique et évite de commencer un code sans en connaître le but avec les tenants et aboutissants,
    et si nécessaire je lui demande en plus un xlsx, tenant compte de la réalité (sinon c'est une perte de temps), il va de soi que j'attends du demandeur un minimum d'effort de sa part (PS : sur Mac avec AppleScript/VBA est un cas spécial que pas mal de monde ne maitrise pas )

    Concernant les points de vues, ils peuvent diverger d'une personne à une autre, comme cela a été le cas avec l'enregistreur de macro,
    et heureusement qu'il y a des divergences, car cela permet d'avancer (ou pas ) en échangeant les opinions

    "on pourrait créer un réservoir de codes génériques prêts à l'emploi qui profiteraient à toute la communauté,…" => Personnellement quand je suis venu sur le forum, ce n'est pas pour cela, c'était pour résoudre une problématique et aussi pour apprendre;
    avec un code prêt à l'emploi ou l'on a juste besoin d'appliquer je n'aurais rien appris (alors oui il y des personnes (pas toutes) qui s'inscrivent sur le forum pour avoir une solution toute faite (non payé), avec 3 posts, puis ils disparaissent … )
    je préfèrent faire mes recherches sur le net/forums en voyant une diversité de réponses excellentes, bancales (ou pas car mal adapté ou situations légèrement différentes… - on apprends aussi des erreurs des autres aussi bien que les siennes)
    Dans le cas où l'on aurait dans un forum "Le réservoir des codes génériques prêts à l'emploi" ce ne serait plus un forum mais "Venez vous servir" (je précise : aucune attaque perso de ma part)
    et ce n'est pas ce que j'attends d'un forum, ou l'aide est donné sur le propre temps de chacun, et que le minimum de respect est que le demandeur fasse un effort aussi de son coté

    Voilà je partage ma propre opinion qui peut être la même ou différentes des autres … que l'on soit d'accord ou pas … (joke : mais il n'y a pas de quoi fouetté un chat )

    @Jacques entièrement d'accord avec ce que tu dis

    @Patrick intéressant la démarche de ton code

    • juste pour l'exercice :

    AVANT

    Nom : Capture d’écran 2018-09-07 à 03.50.44.png
Affichages : 455
Taille : 61,6 Ko

    APRES

    Nom : Capture d’écran 2018-09-07 à 03.51.40.png
Affichages : 471
Taille : 62,8 Ko

    PS : je n'ai pas tout vérifié, peut être (ou pas) qu'il y aura un hic, c'est juste pour l'exercice (pas de gestion de MFC)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub Demo_OK_ListObjects()
    Dim myTable As ListObject, COL, VE, VA
     
    Set myTable = ActiveSheet.ListObjects("Tableau1")
    COL = Array(5, 4, 6, 2, 3, 1)  ' Mettre les colonnes dans l'ordre voulues
     Application.ScreenUpdating = False
        With myTable
            VE = Application.Index(.HeaderRowRange.Value, Evaluate("ROW(1:" & .HeaderRowRange.Rows.Count & ")"), [COL])
            VA = Application.Index(.DataBodyRange.Formula, Evaluate("ROW(1:" & .DataBodyRange.Rows.Count & ")"), [COL])
            .HeaderRowRange.Value = VE
            .DataBodyRange.Formula = VA
            .ListColumns("Date").DataBodyRange.NumberFormat = "dd/mm/yyyy"
        End With
     Application.ScreenUpdating = True
    End Sub
    Voilà

  20. #60
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Salut

    @Jacques: Méfions-nous de simplifier le fonctionnement des entreprises et de le ramener à "on a des données brutes, nues de toutes formules et autres, et yaka les mettre dans le bon ordre"... La réalité des entreprises est plus complexe. De plus, comme le dit Patrick, qui peut le plus peut le moins et si une procédure simple de 10 lignes peut permuter des colonnes avec formules, formats et autres, elle peut aussi permuter des colonnes de données brutes

    @Ryu: Je partage ton analyse sur "le code tout cuit", et je pense que la bonne démarche est effectivement d'apprendre plutôt que consommer, mais tout le monde n'a pas notre passion de l'outil , et c'est pour cela qu'il y a la rubrique "Contribuez" et la page de sources. Chacun peut ainsi trouver son compte

    Bonne journée à tou(te)s

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/10/2013, 22h38
  2. permutation des colonnes d'une matrice
    Par jane40 dans le forum R
    Réponses: 2
    Dernier message: 26/04/2011, 13h00
  3. permutation de colonnes dans une matrice
    Par omar.ayadi dans le forum MATLAB
    Réponses: 10
    Dernier message: 16/01/2009, 10h30
  4. [DBGrid] Permutation des colonnes
    Par mqrv2008 dans le forum Débuter
    Réponses: 3
    Dernier message: 10/10/2008, 15h58
  5. Réponses: 2
    Dernier message: 19/12/2006, 22h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo