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 :

VBA Tableau: appliquer filtre tri renvoyer une valeur d'une colonne [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 74
    Points : 59
    Points
    59
    Par défaut VBA Tableau: appliquer filtre tri renvoyer une valeur d'une colonne
    BONJOUR

    Je suis entrain d'apprendre à gérer les tableaux sous VBA car je manipule des tableaux sous Excel (Tri, filtre, formule etc...). Ces tableaux rendent mon fichier très lourd et l'exécution des macros est lente.

    Du coup j'essaye de créer des tableaux et d'en faire des manipulations standards (tri filtre calcul...).

    A ce jour j'ai réussi à créer le tableau dans VBA depuis un tableau dans Excel et de trouver les 3 valeurs les plus grandes de la 2eme colonne.
    Le tableau est le suivant dans Excel:
    - 1er ligne= Titre (Type, Valeur,Qté,Row)
    - 2er ligne= Valeur (LF7 ,89 ,5 ,20)
    - 3er ligne= Valeur (LF14, 5 ,2 ,35)
    - 4er ligne= Valeur (LF7 , 3 ,4 ,7)
    - 5er ligne= Valeur (LF7 ,14 ,8 ,65)
    - 6er ligne= Valeur (LF14,25 ,7 ,45)

    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
     
    Sub Tableau()
     
    Der = Worksheets("Sheet1").Range("A1048455").End(xlUp).Row
     
    Dim tab_prob(5, 3)
     
    For i = 0 To Der - 1
        For c = 0 To 3
            tab_prob(i, c) = Cells(i + 1, c + 1)
        Next
    Next
    SMax1 = Application.Large(Application.Index(tab_prob, , 2), 1)
    SMax2 = Application.Large(Application.Index(tab_prob, , 2), 2)
    SMax3 = Application.Large(Application.Index(tab_prob, , 2), 3)
     
     End Sub
    Désormais je cherche les fonctions de filtre, tri pour récupérer la valeur de la colonne "Row" correspondant a SMax1 (si plusieurs SMax1 de meme valeur, je tri par la quantité pour prendre la première par défaut) seulement pour les Type LF7.
    L'enchainement des fonctions/Applications se fait comme ci dessous
    1- Filtre colonne Type LF7
    PUIS
    2- Tri colonne Qte par ordre croissant
    PUIS
    3- trouver la ligne du tableau ayant le chiffre le plus grand dans la colonne Valeur
    PUIS
    4- Renvoyer la valeur de la colonne "Row" de la ligne ayant le chiffre le plus grand dans la colonne Valeur

    Merci d'avance poru votre aide
    Jerome

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonsoir,

    Pour filtrer les LF7

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Sub FiltreLF7()
      Tbl = Range("A2:D" & Sheets("Sheet1").Range("A65000").End(xlUp).Row).Value
      Dim tmp(): ReDim tmp(1 To UBound(Tbl))
      For i = LBound(Tbl) To UBound(Tbl)
        If Tbl(i, 1) = "LF7" Then n = n + 1: tmp(n) = i
      Next
      ReDim Preserve tmp(1 To n)
      TblLF7 = Application.Index(Tbl, Application.Transpose(tmp), Application.Transpose(Evaluate("Row(1:" & UBound(Tbl, 2) & ")")))
      [g2].Resize(UBound(TblLF7), UBound(TblLF7, 2)) = TblLF7
    End Sub
    ou

    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 LF7()
      Tbl = Range("A2:D" & Sheets("Sheet1").Range("A65000").End(xlUp).Row).Value
      TblLF7 = FiltreClé(Tbl, "LF7")
      [g2].Resize(UBound(TblLF7), UBound(TblLF7, 2)) = TblLF7
    End Sub
     
    Function FiltreClé(Tbl, clé)
      Dim tmp(): ReDim tmp(1 To UBound(Tbl))
      For i = LBound(Tbl) To UBound(Tbl)
        If Tbl(i, 1) = clé Then n = n + 1: tmp(n) = i
      Next
      ReDim Preserve tmp(1 To n)
      FiltreClé = Application.Index(Tbl, Application.Transpose(tmp), Application.Transpose(Evaluate("Row(1:" & UBound(Tbl, 2) & ")")))
    End Function

    Boisgontier

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 74
    Points : 59
    Points
    59
    Par défaut [XL-2010] VBA Tableau: appliquer filtre tri renvoyer une valeur d'une colonne
    BONJOUR boisgontierjacques

    Un GRAND merci pour ton aide, ca marche très bien .
    En plus j'arrive à lire/comprendre le code

    Quelqu'un aurait il une idée pour le point 2 et 4?

    Reminder:
    2- Tri colonne Qte par ordre croissant
    PUIS
    3- trouver la ligne du tableau ayant le chiffre le plus grand dans la colonne Valeur
    PUIS
    4- Renvoyer la valeur de la colonne "Row" de la ligne ayant le chiffre le plus grand dans la colonne Valeur

    Encore Merci
    Jerome

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    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
     
    Sub TriTableau2D()
      Dim Tbl()
      Tbl = Range("A2:D" & Sheets("Sheet1").Range("A65000").End(xlUp).Row).Value                                             
      Call Tri(Tbl(), 3, LBound(Tbl, 1), UBound(Tbl, 1))
      [G2].Resize(UBound(Tbl, 1), UBound(Tbl, 2)).Value2 = Tbl
    End Sub
     
    Sub Tri(a(), ColTri, gauc, droi) ' Quick sort
      ref = a((gauc + droi) \ 2, ColTri)
      g = gauc: d = droi
      Do
        Do While a(g, ColTri) < ref: g = g + 1: Loop
        Do While ref < a(d, ColTri): d = d - 1: Loop
        If g <= d Then
           For k = LBound(a, 2) To UBound(a, 2)
             temp = a(g, k): a(g, k) = a(d, k): a(d, k) = temp
           Next k
           g = g + 1: d = d - 1
        End If
      Loop While g <= d
      If g < droi Then Call Tri(a, ColTri, g, droi)
      If gauc < d Then Call Tri(a, ColTri, gauc, d)
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 74
    Points : 59
    Points
    59
    Par défaut VBA Tableau: appliquer filtre tri renvoyer une valeur d'une colonne
    Hi boisgontierjacques,

    You are the best!!

    Juste pour mon info,
    => comment on fait pour inverser le tri de décroissant à croissant par exemple?

    Encore MERCI t'es un champion, ton classeur m'a appris l'utilisation des fonctions en plus .

    Thanks a lot

    Jerome

  6. #6
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Voir PJ

    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
     
    Option Compare Text
    Sub Tri()
       Dim a()
       a = [A2:B6].Value
       '-- tri nom croissant
       Call Quick(a(), LBound(a), UBound(a), 1, True)
       [D2:E6].Value2 = a
       '-- tri salaire décroissant
       Call Quick(a(), LBound(a), UBound(a), 2, False)
       [g2:h6].Value2 = a
    End Sub
     
    Sub Quick(a(), gauc, droi, col, ordre) ' Quick sort
     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
    Boisgontier
    Fichiers attachés Fichiers attachés

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 74
    Points : 59
    Points
    59
    Par défaut VBA Tableau: appliquer filtre tri renvoyer une valeur d'une colonne
    Milles Merci t'es un Boss!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. Réponses: 15
    Dernier message: 26/01/2015, 19h37
  3. Réponses: 2
    Dernier message: 18/11/2012, 11h25
  4. Tri d'une requête sur une valeur ou une autre
    Par mims1664 dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/08/2009, 17h40
  5. [VBA Excel] Appliquer une macro sur une celulle contenant une valeur
    Par tchauviere dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/01/2008, 10h21

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