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 - Selection 2 premiers de chaque valeur


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 25
    Points : 17
    Points
    17
    Par défaut VBA - Selection 2 premiers de chaque valeur
    Bonjour à tous

    J'ai un grand tableau de données, et j'aimerais pouvoir sélectionner les lignes des 2 premiers (et uniquement ceux là) portant chaque valeur d'un champ donné pour les mettre dans une autre feuille et travailler sur ces seules données.

    Voir le fichier joint pour les exemples

    Pour clarifier, j'ai donc dans le fichier exemple :
    - différentes villes : je veux pouvoir sélectionner et copier dans une autre feuille les 2 meilleures notes pour chaque ville (donc ABC et QSD pour Paris, DEF et YTJ pour Marseille, RET et ERT pour Lyon et GFD pour Lille - il peut donc n'y avoir qu'une seule note comme dans le cas de Lille)
    - et faire la même chose pour les classes, en mettant dans une autre feuille les seuls 2 meilleurs par classe, ie ABC et DEF en sixième, QSD et GFD en cinquième, RET et ERT en quatrième, et YTF en troisième (seul candidat également))


    Je n'y arrive pas en VBA, je suis encore un grand débutant, et je suis un peu rouillé (je n'en ai presque pas fait depuis plus d'un an)

    Pourriez-vous me mettre sur la bonne piste ?

    Ah que j'aimerais pouvoir utiliser un petit SELECT en SQL pour faire ce boulot...

    Edit : ré-envoi du fichier-joint, sous format xlsx au début. Désolé...
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 549
    Points : 556
    Points
    556
    Par défaut
    Bonjour,
    déjà, si tu veux faire du SQL, faut tout passer sous Access.....

    JE regarde ton fichier et voit comment je peux t'aiguiller
    Eventuellement, te propsoer une solution access

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut laurentcr et le forum
    sur sheet2 ou sheet3, ou autre
    A2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(GRANDE.VALEUR((SOMMEPROD((Sheet1!$D2=Sheet1!$D$2:$D2)*1)<3)*Sheet1!$C2;1)>0;Sheet1!$D2 & " " & Sheet1!$B2;"")
    tu recopies vers le bas.
    on ^peut adapter le principe au retour qu'on veut, et soit mettre une liste dans la feuille, en testant cette liste et en adaptant la formule, soit en triant sur la colonne C de sheet1 (mais c'est moins bon)
    Si besoin d'explication, les demander
    A+
    Nota : si 3 résultat d'une même ville on la même valeur, sul le premier dans l'ordre des lignes sera pris.
    OUPS! J'avais commencé le sujet et je suis parti. On peut évidemment faire la même chose en VBA

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 549
    Points : 556
    Points
    556
    Par défaut
    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
     
    Public Const nomFeuille1 As String = "Sheet1"
    Public Const nomFeuille2 As String = "Sheet2"
    Public Const nomFeuille3 As String = "Sheet3"
    Public Const colVille As Integer = 4
    Public Const colClasse As Integer = 5
     
     
    Sub triDonnees(col As String)
        Sheets(nomFeuille1).Select
        Selection.Sort Key1:=Range(col), Order1:=xlAscending, Key2:=Range("C2") _
            , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
            False, Orientation:=xlTopToBottom
    End Sub
     
    Sub traitement()
        Call traiterBest(nomFeuille2, colVille)
        Call traiterBest(nomFeuille3, colClasse)
    End Sub
     
    Sub traiterBest(nomFeuille As String, colDonnees As Integer)
        Dim i, j, cpt As Integer
        Dim str As String
     
        Call triDonnees(Chr(colDonnees + 64) & "2")
     
        i = 2
        j = 0
        str = ""
        cpt = 0
        While Trim(Sheets(nomFeuille1).Cells(i, colDonnees).Value) <> ""
            If Sheets(nomFeuille1).Cells(i, colDonnees).Value <> str Then
                cpt = 1
                str = Sheets("Sheet1").Cells(i, colDonnees).Value
            Else
                cpt = cpt + 1
            End If
            If cpt <= 2 Then
                j = j + 1
                Sheets(nomFeuille).Cells(j, 1).Value = Sheets(nomFeuille1).Cells(i, 2).Value
                Sheets(nomFeuille).Cells(j, 2).Value = Sheets(nomFeuille1).Cells(i, colDonnees).Value
            End If
            i = i + 1
        Wend
     
    End Sub
    Voilà, tu peux faire ceci
    je t'ai mis en constante le nom des feuilles et le numéroe de la colonne des données que tu veux réécrire pourque çà soit plus simple à maintenir

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Merci beaucoup pour les réponses, version VBA ET version Excel, wow !
    Je vais tester tout ça dès maintenant et je vous dis.

    PS : la version SQL n'est pas souhaitée, c'était juste pour dire qu'en SQL, cela ne posait pas de problèmes, alors que sous Excel, je ne m'en sortais pas (et pour l'instant, le programme tourne sous excel, on le convertira plus tard en base de données et requêtes SQL).

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Bon, j'ai finalement pu tester en détail seulement ce dimanche...

    A ce sujet :
    - la solution par fonctions excel ne fait pas tout à fait ce que je cherchais dans l'état, à savoir ne garder que les deux "meilleures notes". Je n'avais pas du tout à fait être clair. Mais on doit pouvoir m'en sortir pour l'adapter, donc ça doit pouvoir marcher. Néanmoins, le fait d'avoir des "blancs" au milieu ne me paraît pas idéal, j'ai donc tendance à préférer pour l'instant la version "VBA" (Gorfael, ne m'en veux pas, hein...)
    - la solution en VBA d'helios77 est quasi parfaite (quasi parce qu'il fallait les 2 meilleures notes et non les 2 plus mauvaises ), donc après avoir changé le xlAscending en xlDescending, tout marchait nickel !

    Pour la suite, je devrais pouvoir me débrouiller...

    Je vous remercie encore pour les deux solutions !

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

Discussions similaires

  1. [XL-2007] VBA Selection find avec valeur non trouvé
    Par WAS92 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2013, 15h02
  2. Réponses: 1
    Dernier message: 18/05/2005, 18h18
  3. [débutant] select du premier record.
    Par Anonymous dans le forum Langage SQL
    Réponses: 5
    Dernier message: 25/06/2004, 09h17
  4. requete select avec AS remplacement de valeur
    Par pi3141563 dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/04/2004, 22h15
  5. selection selon premier caractere d un champ
    Par jack-daniel dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/08/2003, 12h25

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