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 de données dans une variable dynamique [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mai 2020
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mai 2020
    Messages : 19
    Points : 9
    Points
    9
    Par défaut Trier une plage de données dans une variable dynamique
    Bonjour à toutes et tous

    Je bute sur cette étape dans mon projet
    Au sein d'une variable tableau (deux dimensions), je souhaite pouvoir trier des données

    La plage de données est par exemple de TabPlanning (4,3) à TabPlanning(200,4). Il y a des données sur les lignes supérieures et d'autres colonnes qu'il ne faut pas impacter
    Je souhaite trier ses données par ordre croissant de la colonne 4.

    Merci d'avance pour votre aide

    Daniel

  2. #2
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 954
    Points : 5 183
    Points
    5 183
    Par défaut
    Bonjour
    s'il s'agit d'un tableau structuré, je crois qu'il est impossible de trier qu'une partie de colonne
    si il ne s'agit pas d'un tableau structuré tu peux tester avec prudence et sur une copie de ton fichier pour munir contre tous risque de perte de données avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
    Sheets("Feuil1").Range("C4:D10").Sort Range("C4"), xlAscending, Range("C4"), , xlAscending
    End Sub

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mai 2020
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mai 2020
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Bonjour Bennasr et merci pour ce retour

    Donc si je comprends bien, je peux tenter la méthode suivante :
    1- je sélectionne mes données dans la variable tableau
    2- je les copie vers une feuille de mon fichier excel
    3- j'effectue le tri sur la feuille
    4- je rapatrie les données depuis la feuille vers la variable

    Quel serait le code pour le point 4 ?

    Merci d'avance

    Daniel

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 977
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 977
    Points : 29 012
    Points
    29 012
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Exemple de pour charger une plage de cellules dans une variable tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub t()
     Dim shtSource As Worksheet
     Dim t As Variant
     Set shtSource = ThisWorkbook.Worksheets("DataBase")
     t = shtSource.Range("C2:G50").Value
     Set shtSource = Nothing
    End Sub
    Pour en savoir plus Utiliser les variables tableaux en VBA Excel

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mai 2020
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mai 2020
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci Philippe pour ce retour et ce code
    Ma contrainte est que le tableau existe déjà et que les données de la feuille doivent aller dans la "zone" TabPlanning (4,3) à TabPlanning(200,4).
    C'est jouable ?
    Cordialement
    Daniel

  6. #6
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 954
    Points : 5 183
    Points
    5 183
    Par défaut
    re
    Mixage avec la proposition de Philippe (bonjour au passage) teste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub t()
     Dim f1 As Worksheet
      Dim f2 As Worksheet
     Dim t As Variant
     Set f1 = ThisWorkbook.Worksheets("Feuil1")
     Set f2 = ThisWorkbook.Worksheets("Feuil2")
     t = f1.Range("C4:D18").Value
     f2.Range("A1:B15").Value = t
    f2.Range("A1:B15").Sort f2.Range("A1"), xlAscending, f2.Range("A1"), , xlAscending
    f2.Range("A1:B15").Copy
    f1.Cells(4, 3).PasteSpecial Paste:=xlPasteValues
     Set f1 = Nothing
     Set f2 = Nothing
    End Sub

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mai 2020
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mai 2020
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci Bennasr pour ce retour

    Ce que je comprends dans ce code est qu'il s'agit d'une copie entre deux feuilles d'un même classeur
    Est ce que cela peut fonctionner avec ma variable tableau ?

    Au plaisir
    Daniel

  8. #8
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 954
    Points : 5 183
    Points
    5 183
    Par défaut
    normalement oui
    dans l'exemple ci joint un tableau structuré, je copie les données de c4 à d18 dans une nouvelle feuille, je fais le trie et je recopie les données triées dans le tableau structuré
    Fichiers attachés Fichiers attachés

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 095
    Points : 9 583
    Points
    9 583
    Par défaut
    Hello,
    Citation Envoyé par Toutes les C Voir le message
    Au sein d'une variable tableau (deux dimensions), je souhaite pouvoir trier des données
    La plage de données est par exemple de TabPlanning (4,3) à TabPlanning(200,4). Il y a des données sur les lignes supérieures et d'autres colonnes qu'il ne faut pas impacter
    Je souhaite trier ses données par ordre croissant de la colonne 4.
    tout n'est pas très clair dans la demande.Dis nous si ce qui suit est bien ce que tu veux faire :
    1 - Tu as une plage d'une feuille qui va de la cellule ligne 4 colonne 3 à la cellule ligne 200 colonne 4 (plage C4 : D200 ? )
    2 - Tu mets toutes les données dans une variable tableau. Cette variable est alors un tableau à 2 dimensions.
    3 - Tu tries ces données suivant la deuxième colonne
    4 - Ensuite que veux -tu faire des données triées ?

    Ami calmant, J.P

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mai 2020
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mai 2020
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Jurassic

    Mes données ne sont pas dans une feuille mais dans une variable à 2 dimensions nommée TabPlanning, par exemple dans la zone suivante : TabPlanning (4,3) à TabPlanning(200,4)

    Comme je veux trier ces données selon l'ordre de la colonne 4, il semble que la méthode la plus simple soit
    - de "sortir" ces données de la variable et de les coller sur une feuille
    - de faire le tri sur la feuille
    - de "ramener" ces données triées depuis la feuille dans la variable

    J'espère avoir été plus clair

    Cordialement
    Daniel

  11. #11
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 095
    Points : 9 583
    Points
    9 583
    Par défaut
    oui mais alors ta variable TabPlanning fait quelle taille en tout (taille des deux dimensions)? Montre nous le code où elle est dimensionnée. Et si tu fais le tri sur la colonne 4, tu veux que toutes les lignes de ta variable suivent ce tri sur toutes les colonnes ?

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mai 2020
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mai 2020
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Re bonjour

    La Variable TabPlanning fait 204 lignes et 10 colonnes

    Il faut juste que cette zone "centrale" soit triée. les autres colonnes et lignes ne sont pas touchées

    Cordialement
    Daniel

  13. #13
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 095
    Points : 9 583
    Points
    9 583
    Par défaut
    Alors je crois que le plus simple c'est de copier toutes les données de ta variable dans une feuille vierge. Cela devient une plage de données. Sélectionner les 2 colonnes qui doivent être triées (3 et 4). Faire un tri sur la 4ème colonne. Seules les données des colonnes 3 et 4 sont triées. Rapatrier l'ensemble des données dans la variable. Effacer la feuille utilisée.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mai 2020
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mai 2020
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci Jurassic
    Je tente cette option et reviens quand cela fonctionnera

    Daniel

  15. #15
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 095
    Points : 9 583
    Points
    9 583
    Par défaut
    Sinon voici du code vite fait pour t'aiguiller un peu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TriCol()
    Dim Ret As Variant
    Dim TabPlanning(1 To 204, 1 To 10) As String, MaPlage As Range, SousPlage As Range
    TabPlanning(1, 1) = "FirstCell"
    TabPlanning(204, 10) = "LastCell"
    Set MaPlage = Worksheets("Temp").Range("A1").Resize(UBound(TabPlanning, 1), UBound(TabPlanning, 2))
    Set SousPlage = MaPlage.Parent.Range(MaPlage.Cells(4, 3), MaPlage.Cells(204, 4))
    MaPlage.Value = TabPlanning
    SousPlage.Select
    SousPlage.Sort Range("C4")
    Ret = MaPlage.Value
    End Sub
    Le seui souci c'est le retour. Je ne peux pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabPlanning = MaPlage.Value
    Mais normalement Ret est l'équivalent de TabPlanning

    [EDIT]
    Sinon on peut faire comme cela aussi :
    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 TriCol()
    Dim MaPlage As Range, SousPlage As Range
    Dim TabPlanning As Variant
    ReDim TabPlanning(1 To 204, 1 To 10)
    TabPlanning(1, 1) = "FirstCell"
    TabPlanning(4, 2) = 1: TabPlanning(4, 3) = 10: TabPlanning(4, 4) = 100
    TabPlanning(5, 2) = 2: TabPlanning(5, 3) = 5: TabPlanning(5, 4) = 200
    TabPlanning(204, 10) = "LastCell"
    Set MaPlage = Worksheets("Temp").Range("A1").Resize(UBound(TabPlanning, 1), UBound(TabPlanning, 2))
    Set SousPlage = MaPlage.Parent.Range(MaPlage.Cells(4, 3), MaPlage.Cells(204, 4))
    MaPlage.Value = TabPlanning
    SousPlage.Select
    SousPlage.Sort Range("C4")
    TabPlanning = MaPlage.Value
    End Sub

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mai 2020
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mai 2020
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Bonjour Jurassik

    Mille mercis pour tous ces éléments.
    J'ai réussi à mettre à jour mon code avec ces éléments et tout fonctionne parfaitement

    Cordialement
    Daniel

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

Discussions similaires

  1. [XL-2010] Actualiser plage de données dans tableau croisé dynamique
    Par Billou265 dans le forum Excel
    Réponses: 2
    Dernier message: 28/12/2011, 08h17
  2. Réponses: 5
    Dernier message: 22/09/2008, 11h57
  3. Comparaison cellules avec une plage de données dans un autre fichier
    Par Jibi64 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/08/2008, 17h22
  4. Réponses: 2
    Dernier message: 06/02/2007, 16h05

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