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

VB.NET Discussion :

Tri des colonnes selon un ordre défini par un vecteur [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Ingénieur forestier
    Inscrit en
    Mai 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur forestier
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2019
    Messages : 10
    Par défaut Tri des colonnes selon un ordre défini par un vecteur
    Bonjour à tous,

    j'avais jusqu'à présent trouvé toutes les infos dans les tutoriels disponibles mais là je ne m'en sors pas avec les fonctionnalités de la fonction sort ...

    Je souhaite modifier l'ordre de mes colonnes en suivant un ordre défini. Les en-têtes de ces colonnes sont stockée dans un vecteur (liste) et je souhaiterais que les colonnes soient triées selon cet ordre.

    NB : Ma plage de données est dynamique, je l'ai donc définie comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim maplage as Range
    Dim Dercol As Long
    Dim Dernlig As Long
    Dernlig = Range("A" & Rows.Count).End(xlUp).Row
    Dercol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
    maplage = Range(Cells(1, 1), Cells(Dernlig, Dercol))
    En vous remerciant par avance !

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Salut,

    A en juger par le code que tu nous livres, ce sont les colonnes d'une feuille Excel que tu souhaites trier.

    Si c'est bien cela, saches que tu peux trier les contenus en échangeant les données des cellules d'une colonne à l'autre, mais tu ne peux permuter les colonnes, je veux dire que quoi que tu changes dans e cellules, même les déplacements de colonnes entières, une fois la transformation terminée, la 1ère colonne est toujours la A, la 2ème la B, ...
    Ceci est vrai aussi pour d'autres grilles de données, notamment pour le DataGridView.

    Note encore que les méthodes de tri de ces outils sont conçus (en général) pour le tri des données contenues dans une colonne, non pour trier les entêtes ni les données d'une même ligne, ...

    Peut-être devrais-tu préciser ta question, voire nous fournir quelques copies d'écrans illustrant ton problème ...

    A bientôt,

  3. #3
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    maplage = Range("A1").CurrentRegion
    'Ou
    maplage=ActiveSheet.UsedRange

  4. #4
    Membre habitué
    Femme Profil pro
    Ingénieur forestier
    Inscrit en
    Mai 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur forestier
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2019
    Messages : 10
    Par défaut Nouveau problème ...
    Re-bonjour,

    merci pour vos réponses.
    Ok pour ActiveSheet.UsedRange, ça va me servir !

    J'en conclus qu'on ne peut pas utiliser la fonction sort pour trier des colonnes ?

    Je m'en suis sortie avec le code suivant : (en étant aidée ...)

    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
    17
     
    Sheets("ONF_COFOR").Activate
        Application.ScreenUpdating = False
        For n = LBound(liste) To UBound(liste)
        Columns("AJ:AJ").Insert
        Next
        Dim Col As Integer
        Col = 36
        For n = LBound(liste) To UBound(liste)
            Set C = Rows(1).Find(liste(n), LookIn:=xlValues, lookat:=xlWhole)
            Columns(C.Column).Copy Destination:=Cells(1, Col)
            Col = Col + 1
        Next
        For n = 35 + (UBound(liste) + 1) * 2 To UBound(liste) + 37 Step -1
        Columns(n).Delete
        Next
        Application.ScreenUpdating = True
    Liste étant le vecteur dans lequel j'ai stocké l'ordre de mes colonnes.
    Ce code ne fonctionnait cependant tout d'avord pas car mes données sont sous forme de tableau. Je dois enlever la mise en forme de tableau pour que cela fonctionne. Cette mise en forme tableau m'a posé d'autres soucis, je m'en débarrasserais bien mais j'ai une autre procédure qui se sert de ces tableaux qui en fonctionnera donc plus ...

    Son élaboration a été assez laborieuse, pourriez-vous m'aider à la faire fonctionner sans les tableaux ?
    L'objectif est d'obtenir qu'Excel ouvre un nouveau classeur et me copie dedans toutes les lignes répondant à une certaine conditions dans les feuilles de mon classeur de base.
    Fonctionne très bien avec mes tableaux mais comment remplacer ListeObject(1), ligne 5, pour que cela fonctionne sans ?

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
        'Création d'un tableau contenant mes lignes
        Dim TabE(), LE&, TabS(), LS&, C&, i&
        ReDim TabS(1 To 50000, 1 To 10)
        For i = LBound(Noms_feuilles) To UBound(Noms_feuilles)
            TabE = Sheets(Noms_feuilles(i)).ListObjects(1).DataBodyRange.Value ' <-------- ICI ----------
            If UBound(TabS, 2) < UBound(TabE, 2) Then ReDim Preserve TabS(1 To UBound(TabS, 1), 1 To UBound(TabE, 2))
                For LE = 1 To UBound(TabE, 1)
                    If TabE(LE, Col) = 1 Then
                        LS = LS + 1
                            For C = 1 To UBound(TabE, 2)
                            TabS(LS, C) = TabE(LE, C)
                            Next C
                    End If
                Next LE
        Next i
     
       'Création d'un nouveau classeur et "collage" du tableau contenant les lignes dans ce classeur
       Workbooks.Add
     
       With Range("A1")
       .Value = "Liste des participants à " & ev
       .Font.Size = 16
       .Font.Bold = True
       End With
     
    'Colle les valeurs du tableau créé dans la feuille
       ActiveSheet.[A4].Resize(LS, UBound(TabS, 2)).Value = TabS
    En vous remerciant par avance !

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Quand il s'agit de modifier l'ordre des colonnes, il ne s'agit pas du tout d'un tri, mais d'une réorganisation.

    Donc en effet, aucun lien avec Sort() qui sert à trier les valeurs d'une plage par ordre croissant ou décroissant de valeurs.

  6. #6
    Invité
    Invité(e)
    Par défaut
    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 test(ByRef sheet As Object)
            Dim R As Object = sheet.range("A1").currentregion
            Dim dic As New Dictionary(Of String, Object)
            Dim lst() As String = "SECT;DESIGNATION;ACTIVER".Split(";")
            For Each c In R.columns
                dic.Add(c.cells(1, 1).value, c)
            Next
            For Each t In lst
                If dic.ContainsKey(t) Then
                    dic(t).Copy(sheet.Cells(1, sheet.range("A1").currentregion.columns.count + 1))
                End If
            Next
            For Each t In dic.Values
                t.EntireColumn.Delete
            Next
        End Sub

  7. #7
    Membre habitué
    Femme Profil pro
    Ingénieur forestier
    Inscrit en
    Mai 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur forestier
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2019
    Messages : 10
    Par défaut
    Bonjour,

    merci beaucoup dysorthographie, mais ça y est j'ai bien un code pour trier mes colonnes. Seulement cela m'a obligé à enlever mes tableaux ce qui pose problème pour une autre procédure.

    Je vais poser cette question dans une autre discussion si je ne trouve pas d'ici quelques heures et clôturer celle-ci, je pense que ce sera plus clair.

    Merci bonne journée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/06/2008, 11h57
  2. Réponses: 13
    Dernier message: 09/07/2006, 15h53
  3. Tri des colonnes au choix
    Par nora_ora dans le forum Oracle
    Réponses: 4
    Dernier message: 06/10/2005, 17h11
  4. [JTable] Tri des colonnes
    Par djskyz dans le forum Composants
    Réponses: 10
    Dernier message: 17/03/2005, 10h14
  5. Tri des colonnes d'une DBGRID
    Par Atrebate62 dans le forum Bases de données
    Réponses: 3
    Dernier message: 31/05/2004, 12h20

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