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 :

Tri de colonne dans des tableaux structurés [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    décembre 2016
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : décembre 2016
    Messages : 92
    Points : 47
    Points
    47
    Par défaut Tri de colonne dans des tableaux structurés
    Bonjour à tous,
    Avant toute chose, je vous souhaite à tous un très bon we de Pâques. Profitez en à fond avant cette nouvelle vague de reconfinement.

    J'ai essayé de plusieurs manières afin de définir une macro permettant de trier des colonnes de tableaux structurés. Mon problème est que j'ai plusieurs tableaux structurés et j'aimerai pouvoir utiliser une seule meme macro que j'utiliserai au gré du besoin pour chaque tableau. Je ne veux pas d'une automatisation de tri de tous les tableaux en meme temps.

    Je suis partie d'un tableau nommé, et j'ai fait un enregistrement automatique de la macro (Code ci-dessous). J'ai essayé ensuite en définissant des variables pour voir si cela fonctionnait mieux, mais bug.

    Existe-til une macro plus simple sans avoir à nommer le tableau pré-sélectionné (j'espère que je suis explicite), où vais je devoir faire une macro par tableau.

    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
    Sub Trier()
     
        Range("Tbl_Type_Recette[Type_Recette]").Select
        ActiveWorkbook.Worksheets("Paramètres").ListObjects("Tbl_Type_Recette").Sort. _
            SortFields.Clear
        ActiveWorkbook.Worksheets("Paramètres").ListObjects("Tbl_Type_Recette").Sort. _
            SortFields.Add2 Key:=Range("Tbl_Type_Recette[Type_Recette]"), SortOn:= _
            xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Paramètres").ListObjects("Tbl_Type_Recette"). _
            Sort
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
     
            Selection.End(xlUp).Select
            ActiveCell(2, 1).Select
            Selection.ListObject.ListRows.Add (1)
    End Sub
    Je vous remercie pour votre aide et vous souhaite une très belle journée

  2. #2
    Membre éprouvé Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    mai 2013
    Messages
    833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : mai 2013
    Messages : 833
    Points : 1 291
    Points
    1 291
    Par défaut
    Bonjour,

    Ce type de code pourrait faire l'affaire :
    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
     
    ' xlWkSheet = ActiveWorkbook.Worksheets("Paramètres")
    ' strTableau = Tbl_Type_Recette
    ' strField = Type_Recette
    Sub Trier(xlWkSheet As Worksheet, strTableau As String, strField As String)
     
        Range(strTableau & "[" & strField & "]").Select
        xlWkSheet.ListObjects(strTableau).Sort. _
            SortFields.Clear
        xlWkSheet.ListObjects(strTableau).Sort. _
            SortFields.Add2 Key:=Range(strTableau & "[" & strField & "]"), SortOn:= _
            xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With xlWkSheet.ListObjects(strTableau). _
            Sort
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
     
            Selection.End(xlUp).Select
            ActiveCell(2, 1).Select
            Selection.ListObject.ListRows.Add (1)
    End Sub
    Non testé. Non optimisé. Non fiabilisé. Je te laisse le faire

    Cordialement,
    Le sabre est une arme. Le kendo est un art de tuer. Quelques soient les belles paroles pour l'expliquer, telle est sa vérité.

  3. #3
    Membre du Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    décembre 2016
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : décembre 2016
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Bonjour
    Je vous remercie, j'ai testé mais cela ne fonctionne pas

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    mars 2021
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2021
    Messages : 109
    Points : 179
    Points
    179
    Par défaut
    Salut,

    Pour la sélection du tableau du peux faire un userform avec une listbox (ici listbox1) et un bouton de validation (ici CommandButton1)

    Mets ce code dedans :
    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
    Private Sub userform_initialize()
    Dim obj As Object
    Dim sht As Worksheet
    Dim i As Integer
    i = 1
    For Each sht In ThisWorkbook.Worksheets
        For Each obj In sht.ListObjects
        tableau(i, 1) = obj.Name
        tableau(i, 2) = sht.Name
        ListBox1.AddItem (obj.name)
        i = i + 1
        Next
    Next
    End Sub
     
    Private Sub CommandButton1_Click()
    UserForm1.Hide
    For i = 0 To UBound(tableau)
    If ListBox1.Value = tableau(i, 1) Then
    MsgBox tableau(i, 1) & " dans la feuille " & tableau(i, 2)
    End If
    Next
    End Sub
    Il va te falloir créer un module pour déclarer la constante partagée a deux dimensions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public tableau(0 To 1000, 1 To 2) As String
     
    Sub Trier()
    UserForm1.Show
    End Sub
    Le msgbox renvoie le nom du tableau et le nom de la feuille correspondante.

    Par conte le problème c'est comment savoir quelle colonne de ton tableau tu veux manipuler si tu ne connais pas le tableau avant de faire l'opération ?

    Si quelqu'un sait comment faire apparaitre les entêtes des colonnes a partir du nom du tableau dans une autre listbox je suis preneur aussi

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    17 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 17 434
    Points : 50 403
    Points
    50 403
    Billets dans le blog
    92
    Par défaut
    Salut.

    Voici une fonction générique qui trie un tableau sur base des ses colonnes en tri croissant ou décroissant. Cette solution n'intègre pas le tri sur une liste personnalisée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function SortTable(Name As String, SortFields)
      Dim i As Long
     
      With Range(Name).ListObject.Sort
        .SortFields.Clear
        For i = LBound(SortFields) To UBound(SortFields) Step 2
          .SortFields.Add Key:=Range(Name & "[" & SortFields(i) & "]"), SortOn:=xlSortValues, Order:=SortFields(i + 1)
        Next i
        .Apply
      End With
    End Function
    Voici comment on peut l'utiliser: sorttable "t_Mappage",array("Tableau",xlascending,"colonne",xldescending)


    Nom : 2021-04-02_161616.png
Affichages : 57
Taille : 232,5 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    février 2010
    Messages
    7 394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : février 2010
    Messages : 7 394
    Points : 14 084
    Points
    14 084
    Par défaut
    Bonjour

    Citation Envoyé par Pierre Fauconnier Voir le message
    Voici une fonction générique qui trie un tableau sur base des ses colonnes en tri croissant ou décroissant. Cette solution n'intègre pas le tri sur une liste personnalisée...
    C'est fort de café : sur 365 j'obtiens un tri par couleur (qui ne trie rien puisque je n'en ai pas) je n'arrive pas à comprendre...
    Chris
    PowerQuery existe depuis plus de 10 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    17 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 17 434
    Points : 50 403
    Points
    50 403
    Billets dans le blog
    92
    Par défaut
    Salut Chris,

    J'ai déjà eu ce souci, mais à mon idée, le SortOn:=xlSortValues résolvait ce problème...

    C'est un truc "recopié" de mémoire de mon xltools... J'investigationne et je te dis...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    17 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 17 434
    Points : 50 403
    Points
    50 403
    Billets dans le blog
    92
    Par défaut
    Salut Chris,

    Au temps pour moi, j'ai été trop vite pour tester en me basant sur le fait que les flèches étaient dans le bon sens sur les outils de filtre alors qu'un simple examen du tableau suffisait... Mais c'est xlSortOnValues et pas xlSortValues qu'il faut utiliser. Voilà qui trie mieux les données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function SortTable(Name As String, SortFields)
      Dim i As Long
     
      With Range(Name).ListObject.Sort
        .SortFields.Clear
        For i = LBound(SortFields) To UBound(SortFields) Step 2
          .SortFields.Add Key:=Range(Name & "[" & SortFields(i) & "]"), SortOn:=xlSortOnValues, Order:=SortFields(i + 1)
        Next i
        .Apply
      End With
    End Function
    Désolé pour le contretemps...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    février 2010
    Messages
    7 394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : février 2010
    Messages : 7 394
    Points : 14 084
    Points
    14 084
    Par défaut
    Bonjour Pierre

    J'aurais du le voir moi aussi...

    Merci de la correction et bon week end
    Chris
    PowerQuery existe depuis plus de 10 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  10. #10
    Membre du Club
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    décembre 2016
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : décembre 2016
    Messages : 92
    Points : 47
    Points
    47
    Par défaut
    Bonjour Pierre
    Merci pour cette fonction
    Etant encore un peu novice, où dois l'intégrer cette fonction ? Je ne comprend pas bien comment cela fonctionne
    Merci pour votre aide




    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut Chris,

    Au temps pour moi, j'ai été trop vite pour tester en me basant sur le fait que les flèches étaient dans le bon sens sur les outils de filtre alors qu'un simple examen du tableau suffisait... Mais c'est xlSortOnValues et pas xlSortValues qu'il faut utiliser. Voilà qui trie mieux les données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function SortTable(Name As String, SortFields)
      Dim i As Long
     
      With Range(Name).ListObject.Sort
        .SortFields.Clear
        For i = LBound(SortFields) To UBound(SortFields) Step 2
          .SortFields.Add Key:=Range(Name & "[" & SortFields(i) & "]"), SortOn:=xlSortOnValues, Order:=SortFields(i + 1)
        Next i
        .Apply
      End With
    End Function
    Désolé pour le contretemps...

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    17 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 17 434
    Points : 50 403
    Points
    50 403
    Billets dans le blog
    92
    Par défaut
    Tu dis que tu as plusieurs tableaux structurés que tu souhaites trier avec une seule fonction. C'est pour cela que j'ai proposé une fonction générique(1). Mais il faut bien "la nourrir", c'est-à-dire lui donner les arguments spécifiques à chaque tableau (nom du tableau, nom des colonnes de tri, ordre croissant ou décroissant).

    Donc, tu auras, quoi que tu fasses, autant de fonctions d'appel de cette fonction générique que tu as de tableaux à trier, puisque les paramètres vont changer(2). Tu dois donc déterminer quand tu veux retrier tes tableaux: Par exemple, ça pourrait être lorsque tu quittes la feuille qui contient un tableau, on retrie ce tableau, etc...

    A toi donc de nous dire quand tu souhaites que chaque tableau soit retrié. Un minimum de détails sur la conception de ton classeur seraient utiles pour t'aiguiller au mieux.







    (1) On considère que l'on traite sur les valeurs. La fonction, en l'état, n'a pas vocation de remplacer l'interface et de paramétrer tous les cas de figure.

    (2) Sauf bien sûr si tes tableaux ont la même structure et qu'il n'y a que le nom qui change. On pourrait alors généraliser l'appel de la fonction, par exemple lorsque l'on quitte la feuille.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/03/2019, 17h16
  2. Réponses: 2
    Dernier message: 22/01/2019, 14h50
  3. Tri par colonne dans 2 tableaux
    Par enicnath dans le forum R
    Réponses: 0
    Dernier message: 25/06/2018, 17h38
  4. Réponses: 2
    Dernier message: 11/12/2017, 16h46
  5. Réponses: 1
    Dernier message: 04/10/2009, 11h40

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