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é un tableau dans une feuille de calcul lors de son ouverture [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut Trié un tableau dans une feuille de calcul lors de son ouverture
    Bonjour à tous,

    Je cherche un code qui me permettrait de trié un tableau lors de l'ouverture de la feuille où il se trouve.

    La feuille concernait s'appelle : ListPortable
    La zone du tableau : A2:S198
    L'ordre de tri : clé1 colonne F, clé2 colonne G et clé3 colonne E
    Lors du tri, les lignes vides ne doivent pas être prises en compte, donc le tri doit s'arrêter à la dernière cellule non vide.

    J'ai utilisé l'éditeur de macro d'Excel qui m'a donné le code suivant, mais rien de concluant compte-tenu du fait que les lignes vides sont également triées et mises en début de tableau, elles doivent rester en fond de tableau.
    Pouvez-vous m'apporter votre aide, s'il vous plait ?

    Merci par avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Range("A2:S198").Sort Key1:=Range("F3"), Order1:=xlAscending, Key2:=Range _
            ("G3"), Order2:=xlAscending, Key3:=Range("E3"), Order3:=xlAscending, _
            Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:= _
            xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, _
            DataOption3:=xlSortNormal

  2. #2
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Il y a des lignes vides au milieu de lignes non vides ?
    Si oui, pourquoi ne pas filtrer, la plage sur les cellules non vides
    ET ensuite trier sur ces cellules, ou alors une autre idée qui me vient pourquoi ne pas supprimer les lignes non vides intercalées, ça pourrait être quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Sub x()
     
    Dim maplage As Range
    Set maplage = Range("A2:A198")
    maplage.Rows.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
     
    End Sub

  3. #3
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Bonjour,

    Les lignes vides sont à la fin du tableau, jamais entre des lignes non vides.

  4. #4
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Alors il te suffit de déterminer ta plage avec


  5. #5
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Je vais simplement supprimer les lignes vides. Elles ne servent pas pour l'instant.

    Par contre des données vont être ajoutées à mon tableau, il faut donc qu'à chaque ouverture de la feuille les nouvelles données soient prises en compte dans mon tri.

    Comment faire ?

    Voici mon code. Je n'ai pas pris en compte les lignes vides dans ma sélection.
    Je m'arrête à la cellule S131 de mon tableau.
    Lorsque je vais ajouter des données il faut que celle-ci soient prises en compte dans un nouveau tri.

    Où dois-je ajouter ?

    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub Worksheet_Activate()
        Range("B2:S131").Select
        Selection.Sort Key1:=Range("F3"), Order1:=xlAscending, Key2:=Range("G3") _
            , Order2:=xlAscending, Key3:=Range("E3"), Order3:=xlAscending, Header:= _
            xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
            xlSortNormal
        Range("A2").Select
    End Sub

  6. #6
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Pour définir la plage sans les dernières cellules vides (Equivalent de l'action manuelle suivante : on se place sur la dernière ligne et on fait CTRL + FLeche du haut)

    Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1:S" & Range("A65536").End(xlUp).Row)
    On sélectionne donc tout de la première cellule à la dernière remplie dans la colonne A jusqu'à la colonne s

  7. #7
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Merci aalex 38 ça marche au niveau du tri.

    Par contre la colonne A est numérotée de 1 à x. Cette numérotation ne doit pas bouger.

    Comment faire pour que celle-ci puisse garder sa numérotation originale ?

    Merci par avance

    Voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub Worksheet_Activate()
    Dim MaPlage As Range
        Set MaPlage = ActiveSheet.Range("A2:S" & Range("S65536").End(xlUp).Row)
        Selection.Sort Key1:=Range("F3"), Order1:=xlAscending, Key2:=Range("G3") _
            , Order2:=xlAscending, Key3:=Range("E3"), Order3:=xlAscending, Header:= _
            xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
            xlSortNormal
        Range("A2").Select
    End Sub

  8. #8
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Comment faire pour que celle-ci puisse garder sa numérotation originale ?
    - Ne pas trier sur la colonne A

    - Renumeroter

    Range("S65536").End(xlUp).Row

    Attention ce code te donne le numero de la ligne pour ta selection, il n'est pas question de colonne ici, si la colonne A est renseignée et pas la S pour la même ligne tu risque d'avoir des problèmes, si la colonne A est une numérotation il est préférable de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A2:S" & Range("A65536").End(xlUp).Row)
    Pour ne pas trier sur A (pas testé) tu pourrais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B2:S" & Range("A65536").End(xlUp).Row)

  9. #9
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Pour le code tu as raison c'est une erreur de saisie.

    Par contre j'ai testé ta deuxième solution sans succès, la colonne A est toujours triée.

    Je vais voir pour une numérotation après tri.

  10. #10
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Si la collonne a est numéroté de 1 à X pourquoi ne pas simplement passer derrière et la numéroter? Un peu barbare mais si tu n'as pas de problème de temps...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i = 1 to Range("A65536").End(xlUp).Row-1
    cells(i+1,1)=i
    next i
    edit : oups je viens de voir cette ligne

    Je vais voir pour une numérotation après tri.
    Bon ben c'est la même idée

  11. #11
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Il y a bien un moyen de ne pas trier la colonne A, je ne sais plus comment essai de voir avec l'enregistreur de macro

    Bon ben c'est la même idée

  12. #12
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Voici mon code (à l'aide de l'enregistreur de macro), il n'est pas très beau.
    Il renumérote la colonne A à partir de la cellule A3.

    Par contre ça s'arrête à la ligne 131, comment faire pour qu'elle prenne en compte toute nouvelle saisie ?

    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
     
    Private Sub Worksheet_Activate()
    Dim MaPlage As Range
        Set MaPlage = ActiveSheet.Range("B2:S" & Range("B65536").End(xlUp).Row)
        Selection.Sort Key1:=Range("F3"), Order1:=xlAscending, Key2:=Range("G3") _
            , Order2:=xlAscending, Key3:=Range("E3"), Order3:=xlAscending, Header:= _
            xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
            xlSortNormal
            Range("A2").Select
    Range("A3").Select
        ActiveCell.FormulaR1C1 = "1"
        Range("A3").Select
        Selection.DataSeries Rowcol:=xlRows, Type:=xlLinear, Date:=xlDay, Step _
            :=1, Trend:=False
        Selection.AutoFill Destination:=Range("A3:A131")
        Range("A3:A131").Select
        Selection.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
            Step:=1, Trend:=False
        Range("A2").Select
    End Sub

  13. #13
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Voici le code modifié et ça fonctionne.

    Merci à tous pour votre aide.

    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
     
    Private Sub Worksheet_Activate()
    Dim MaPlage As Range
        Set MaPlage = ActiveSheet.Range("B2:S" & Range("B65536").End(xlUp).Row)
        Selection.Sort Key1:=Range("F3"), Order1:=xlAscending, Key2:=Range("G3") _
            , Order2:=xlAscending, Key3:=Range("E3"), Order3:=xlAscending, Header:= _
            xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
            xlSortNormal
            Range("A2").Select
    Range("A3").Select
        ActiveCell.FormulaR1C1 = "1"
        Range("A3").Select
        Selection.DataSeries Rowcol:=xlRows, Type:=xlLinear, Date:=xlDay, Step _
            :=1, Trend:=False
        Selection.AutoFill Destination:=Range("A3:A" & Range("A65536").End(xlUp).Row)
        Range("A3:A" & Range("A65536").End(xlUp).Row).Select
        Selection.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
            Step:=1, Trend:=False
        Range("A2").Select
    End Sub
    ps : j'ai une autre question, mais je vais changer de discussion, car sans rapport avec celle-ci

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

Discussions similaires

  1. [Toutes versions] Copier le contenu d'un tableau dans une feuille de calcul
    Par Heureux-oli dans le forum Contribuez
    Réponses: 0
    Dernier message: 25/04/2009, 20h08
  2. Supprimer une/des image(s) dans une feuille de calcul
    Par Lorenzole+bo dans le forum Excel
    Réponses: 1
    Dernier message: 21/12/2007, 11h23
  3. Utiliser un userform pour lire et écrire dans une feuille de calculs
    Par sebi78 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/04/2007, 19h51
  4. [VBA-E] Nommer chemin d'accès dans une feuille de calcul.
    Par BRUNO71 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/03/2007, 13h30
  5. [VBA-E] Passer d'un contrôle à l'autre avec tab dans une feuille de calculs
    Par small_heart dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/02/2007, 20h57

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