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 :

Réaliser un classement VBA


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Stagiaire base de données
    Inscrit en
    Mai 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Stagiaire base de données

    Informations forums :
    Inscription : Mai 2018
    Messages : 23
    Points : 11
    Points
    11
    Par défaut Réaliser un classement VBA
    Bonjour à tous !

    Je suis actuellement confronté à un problème. Pour décrire mon fichier Excel, celui-ci contient deux colonnes : une avec des catégories de produit ( la même catégorie peut revenir plusieurs fois ), et une autre avec le montant dépensé par une personne dans cette catégorie de produits. Je souhaite réaliser deux classements :

    Dans un premier temps il me faudrait le classement des catégories de produits revenant le plus souvent dans le fichier.
    Dans un second temps, il me faudrait le classement des catégories de produits en fonction du montant total dépensé dans cette catégorie. La difficulté vient du fait que les catégories reviennent plusieurs fois dans la même colonne, il faut donc sommer le montant pour chaque catégorie et renvoyer le classement.

    Tout ceci doit être codé en VBA, étant donné que cette analyse devra être réalisée pour plusieurs clients je veux juste avoir à relancer le code.

    J'ai fait des recherches sur ce sujet sur internet, cependant je n'ai pas compris le peu que j'ai trouvé...
    Si quelqu'un pouvait me donner un coup de main je lui en serais très reconnaissant !

  2. #2
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour Nosnoz, bonjour le forum,

    Ce qui serait bien c'est, qu'a défaut d'un fichier exemple, tu nous dises dans quelle colonnes se trouvent les données. Ça nous permettrait de recréer ton environnement pour pouvoir tester la macro avant de t'envoyer une proposition... Le code ci-dessous fonctionne si les données se trouvent en colonne A et B. Les classements sont fait dans les colonnes D/E et G/H :

    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
    Sub Macro1()
    Dim O As Worksheet
    Dim TV As Variant
    Dim D As Object
    Dim TMP As Variant
    Dim I As Integer
    Dim TT() As Variant
     
    Set O = Worksheets("Feuil1")
    O.Range("D1").CurrentRegion.Clear
    O.Range("G1").CurrentRegion.Clear
    TV = O.Range("A1").CurrentRegion
    Set D = CreateObject("Scripting.Dictionary")
    For I = 2 To UBound(TV)
        D(TV(I, 1)) = D(TV(I, 1)) + 1
    Next I
    TMP = D.keys
    ReDim TT(0 To UBound(TMP), 1 To 2)
    For j = 0 To UBound(TMP)
        T = 0
        For I = 2 To UBound(TV, 1)
            If TV(I, 1) = TMP(j) Then
                TT(j, 1) = TMP(j)
                TT(j, 2) = TT(j, 2) + TV(I, 2)
            End If
        Next I
    Next j
    O.Range("D1").Value = "Produit"
    O.Range("E1").Value = "Occurrence"
    O.Range("D2").Resize(D.Count, 1) = Application.Transpose(D.keys)
    O.Range("E2").Resize(D.Count, 1) = Application.Transpose(D.items)
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("E:E"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange O.Range("D1").CurrentRegion
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    O.Range("G1").Value = "Produit"
    O.Range("H1").Value = "Dépense"
    O.Range("G2").Resize(D.Count, 2).Value = TT
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("H:H"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange O.Range("G1").CurrentRegion
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    End Sub
    À plus,

    Thauthème

    Je suis Charlie

  3. #3
    Membre à l'essai
    Homme Profil pro
    Stagiaire base de données
    Inscrit en
    Mai 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Stagiaire base de données

    Informations forums :
    Inscription : Mai 2018
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    Tout d'abord merci pour ta réponse.

    J'ai essayé le programme que tu m'as envoyé mais au moment de l'exécuter je reçois une erreur d'exécution 6 : dépassement de capacité.
    Mes données se trouvent bien dans les colonnes A et B, je t'envoie un fichier exemple pour que tu vois à quoi il ressemble.
    Fichiers attachés Fichiers attachés

  4. #4
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Salut,

    Regarde ta déclaration de variables.
    Tutoriel fondamental
    Les variables par Silkyroad/

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  5. #5
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    A Thautem,

    En évoquant la déclaration de variables, je pense que trop souvent l'on voit des dictionnaires mal déclarés (Variant,...)
    Mieux vaut les déclarer comme tel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim D as Scripting.Dictionary
    Au préalable, activer la référence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Microsoft Scripting Runtime
    Ce processus a le grand avantage de disposer de toutes les propriétés et méthodes des dictionnaires lors d'une saisie semi automatique du code.

    Bien Cordialement.

    Marcel

    Dernier billet:
    Suppression des doublons d'un tableau structuré, gestion d'un array

    Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


  6. #6
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour le fil, bonjour le forum,

    @Marcel Merci du tuyau !...
    @Nosnoz, remplace
    Dim I As Integer par Dim I As Long.
    À plus,

    Thauthème

    Je suis Charlie

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour nosnoz,Marcel et Robert,

    Robert heureux de te revoir!

    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
    Sub test()
    With CreateObject("Adodb.connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        ThisWorkbook.Sheets("Feuil2").Range("A2").CopyFromRecordset .Execute("select [categorie],count([categorie]) from [Feuil1$] group by [categorie] order by count([categorie]) desc")
         ThisWorkbook.Sheets("Feuil3").Range("A2").CopyFromRecordset .Execute("select [categorie],sum([montant]) from [Feuil1$] group by [categorie] order by sum([montant]) desc")
     
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:= _ 
    Application.transpose(.Execute("select. [categorie] from (select [categorie],sum([montant]) from [Feuil1$] group by [categorie] order by sum([montant]) desc)").getrows)
     
    , _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
     
        .Close
    End With
    End Sub
    Dernière modification par Invité ; 22/06/2018 à 16h45.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Stagiaire base de données
    Inscrit en
    Mai 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Stagiaire base de données

    Informations forums :
    Inscription : Mai 2018
    Messages : 23
    Points : 11
    Points
    11
    Par défaut
    Mon problème est résolu, merci à vous tous pour votre aide

  9. #9
    Invité
    Invité(e)
    Par défaut
    Penses à ceux qui pourraient rencontrer le même problème !

Discussions similaires

  1. Réaliser un classement automatique
    Par AlboRobie10 dans le forum Excel
    Réponses: 7
    Dernier message: 11/03/2012, 23h20
  2. Réaliser un classement automatique
    Par AlboRobie dans le forum Excel
    Réponses: 2
    Dernier message: 02/06/2010, 00h53
  3. Réaliser un classement de performances par personne
    Par stephk dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/06/2008, 20h56
  4. Réponses: 8
    Dernier message: 30/05/2007, 21h32

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