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 :

Trier une Plage en VBA sans la modifier la feuille


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Par défaut Trier une Plage en VBA sans la modifier la feuille
    Bonjour à tous,

    j'aimerais trier une plage dans du code VBA afin de la parcourir dans l'ordre croissant, néanmoins je ne veux pas qu'elle soit trié sur la feuille Excel.
    J'utilise le code suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set rng = Range("C8:C10").End(xlUp).Row)
    rng.Sort Key1:=Range("C8"), Order1:=xlDescending
    Comment remédier au problème ?

    Je vous remercie d'avance.

    Cordialement

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    À part que de programmer/trouver une routine de tri pour le faire en mémoire et probablement dans un tableau, ou de copier ta plage sur une autre feuille et trier dans l'autre feuille, je ne vois pas trop.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Une piste en utilisant "System.Collections.SortedList" comme dans le code suivant.
    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
    29
    30
    31
    Sub TriPlage()
    Dim SL As Object
    Dim R As Range
    Dim C As Range
    Dim i&
    Dim A$
    '---
    Set R = Sheets("test").Range("c8:c10")   'à adapter (plage à trier)
     
     
    Set SL = CreateObject("System.Collections.SortedList")
    On Error Resume Next    'pour traiter les doublons
    For Each C In R
      SL.Add CStr(C), CStr(C.Row)
      '--- Cas de doublon (on ajoute à la Key un terme unique) ---
      If Err <> 0 Then
        SL.Add CStr(C) & " #DOUBLON# " & CStr(C.Row), CStr(C.Row)
        Err.Clear
      End If
      '------------------------------------------------------------
    Next C
    On Error GoTo 0
     
    '--- Visionne la collection obtenue ---
    For i& = 0 To SL.Count - 1
      A$ = A$ & SL.Getkey(i&) & vbLf
    Next i&
    MsgBox A$
    '---
    Set SL = Nothing
    End Sub
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    voici une autre méthode ... utilisant au passage une procédure de tri de Jacques Boisgontier

    l'idée :

    1) mettre dans un tableau VBA tes données
    2) les trier
    3) tu peux ensuite utiliser tes données depuis ce tableau VBA

    Cette procédure à l'avantage :

    - de proposer un tri croissant ou décroissant
    - de te permettre d'effectuer ce tri dans un tableau à plusieurs dimensions (tu peux choisir la dimension à trier)

    j'ai annoté sa procédure et son exemple afin que tu comprennes facilement
    et pour travailler avec des tableaux VBA : http://silkyroad.developpez.com/vba/tableaux/

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Option Compare Text
    Sub Tri()
    Dim a() ' le tableau VBA
     
    ' on rempli le tableau avec ta plage
    ' adapte la plage !
    a = [C8:C10].Value
     
    ' je prend pour exemple :
    ' - C8  = "A"
    ' - C9  = "T"
    ' - C10 = "Z"
     
    '-- tri croissant
    'Call Quick(a(), LBound(a), UBound(a), 1, True)
     
    ' avant de faire le tri
    ' mon premier élément est "A"
    MsgBox a(1, 1)
     
    '-- tri décroissant
    Call Quick(a(), LBound(a), UBound(a), 1, False)
     
    ' après tri décroissant
    ' mon premier élément est "Z"
    MsgBox a(1, 1)
    End Sub
     
    Sub Quick(a(), gauc, droi, col, ordre) ' Quick sort
    ' Procédure qui effectue le tri
    ' a() = le tableau à trier
    ' gauc = le premier élément du tableau
    ' droi = le dernier élément
    ' col = la dimension à trier
    ' ordre : True = croissant / False = décroissant
     
    ref = a((gauc + droi) \ 2, col)
    g = gauc: d = droi
    Do
        If ordre Then
            Do While a(g, col) < ref: g = g + 1: Loop
            Do While ref < a(d, col): d = d - 1: Loop
        Else
            Do While a(g, col) > ref: g = g + 1: Loop
            Do While ref > a(d, col): d = d - 1: Loop
        End If
     
        If g <= d Then
            For i = LBound(a, 2) To UBound(a, 2)
                temp = a(g, i): a(g, i) = a(d, i): a(d, i) = temp
            Next i
            g = g + 1: d = d - 1
        End If
     
    Loop While g <= d
     
    If g < droi Then Call Quick(a, g, droi, col, ordre)
    If gauc < d Then Call Quick(a, gauc, d, col, ordre)
     
    End Sub

Discussions similaires

  1. Trier une plage de cellules
    Par Squelet dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 03/12/2019, 13h04
  2. Réponses: 16
    Dernier message: 11/12/2013, 11h20
  3. [VBA-E] tester la valeur d'une plage de données sans boucle
    Par bibi5883 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 25/04/2007, 08h36
  4. trier une table en vba
    Par slimsamfr dans le forum Access
    Réponses: 1
    Dernier message: 28/06/2006, 18h14
  5. [VBA Excel] Trier une plage à plusieurs colonnes
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 22/12/2005, 17h04

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