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 :

Boucle de plusieurs conditions pour un calcul de moyenne


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Boucle de plusieurs conditions pour un calcul de moyenne
    Bonjour à tous! je suis étudiante à l'université et j'ai un travail à rendre pour bientôt sur un projet de covoiturage. Mes notions d'informatique s'arrêtaient il y a peu à allumer un pc, je suis donc en galère pour la programmation.
    J'ai importé une table venant d'Access portant sur des évaluations (de 1 à 5) faite par des passagers sur: les trajets, les voitures et les conducteurs; et faites par des conducteurs sur des passagers. J'ai donc un champs "concerne" avec 3 choix: "passager", "une voiture", "un trajet", "un conducteur" et les 4 items sont nommé par leur ID Access

    Nom : CaptureGreenTravel.PNG
Affichages : 1224
Taille : 28,7 Ko

    Je dois créer un code VBA me permettant de calculer la moyenne de chaque conducteur, de chaque trajets, chaque voiture et chaque passagers. J'aimerais donc créer une boucle For puis une sous boucle IF vérifiant le type d'item évalué et que dans cette condition, si la case vaut un certain numéro j'ai:
    1) le nombre d'évaluations que cet item particulier a reçue augmenté de 1
    2) Ses évaluations qui s'additionnent
    Avec c'est 2 informations je pourrais donc faire ma moyenne
    je pensais d'abord mettre les numéros un à un mais ayant minimum 25 enregistrements par items c'est très répétitif. En plus, j'ai essayé de mettre une boucle While mais elle ne marche pas. J'ai mis en pièce jointe ma table et mon code (je n'ai fais l'exemple que pour 5conducteurs).

    Je m'excuse d'avance si ma requête n'est pas claire, j'essaye de faire au mieux
    Merci d'avance de me répondre en cette veille de festivités et bonne fêtes!
    Images attachées Images attachées  

  2. #2
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Je ne sais pas si cela va beaucoup t'aider, mais si j'avais à faire cela je ferais avec des requêtes. Les données de départ sont en table et tu pourrais avoir directement le résultat avec 4 requêtes de regroupement, une pour les conducteurs, une pour les voitures, une pour les trajets et une pour les passagers.
    Par exemple pour les conducteurs, si le champ qui contient le nom est "ConducteurNom" et celui qui contient les évaluations "ConducteurEval", la requête s'écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sSQL = "SELECT ConducteurNom, Avg(ConducteurEval) AS MoyenneConducteur"
    sSQL = sSQL & " FROM LaTable"
    sSQL = sSQl & " (WHERE ConducteurEval > 0)"
    sSQL = sSQL & " GROUP BY ConducteurNom;"
    Tu auras directement la liste des conducteurs et en regard la moyenne de leurs évaluations. Tu peux même ajouter un tri.

    D'Access ça s'écrit en utilisant plutôt DAO, mais d'Excel plutôt avec ADO. Comme le chinois, c'est finalement assez simple...

    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour ta réponse! j'ai juste un seul souci, je n'arrive pas à exporter cette requête vers Excel (je pense que c'est pcq mon classeur est en mode macro)

  4. #4
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 468
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 468
    Points : 16 348
    Points
    16 348
    Par défaut
    Bonjour

    Tu peux sans doute réaliser cela simplement par Tableaux croisés dynamiques sans VBA.
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  5. #5
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour,

    78Chris a raison : avec des TCD tu vas pouvoir faire l'équivalent des requêtes voulues sans une ligne de code. Sympa, non ?

    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  6. #6
    Membre averti
    Homme Profil pro
    retraité enseignement
    Inscrit en
    Mars 2013
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : retraité enseignement
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 213
    Points : 442
    Points
    442
    Par défaut une solution...
    bonjour,

    je pense d'abord que vous devriez faire la moyenne par ID, il semble que vous n'avez pas pris les bonnes colonnes!

    j'ai essayé de résoudre le problème en éliminant les doublons puis calculer la moyenne par ID

    j'ai mis les résultats dans une feuille2

    c'est vrai que si le travail n'est pas en VBA on peut passer plus facilement par les TCD...

    J'ai mis en collection les différents noms et ID pour les parcourir facilement avec For Each... plutôt que While ... Wend

    Pour débuter en VBA c'est complexe mais vous pouvez voir les itérations pour apprendre le fonctionnement (utiliser les fonctions de pas à pas)...

    Voici le code :
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    Sub moyenne()
     
    Dim zone As Range
     
    Dim c As Variant
     
    Dim n As Variant
    Dim deja As Boolean
     
    'pour mise en collection des noms et ID en enlevant les doublons
     
    Dim noms As New Collection
    Dim cond As New Collection
    Dim pass As New Collection
    Dim traj As New Collection
    Dim voit As New Collection
     
     
    'zone concernée
    Set zone = Feuil1.Range("D2", Feuil1.Range("D2").End(xlDown))
     
    For Each c In zone 'entrées des collections
      If c.Value <> "" Then
              If noms.Count = 0 Then
                    noms.Add (c.Value) 'premier nom
                                Else
                    deja = False
                    i = 0
                    For Each n In noms  'voir si doublon
                    deja = n = c.Value
                    If deja Then i = 1
                    Next n
                    If i = 0 Then noms.Add (c.Value) 'nom suivant
              End If
      End If
      If c.Offset(0, 3).Value <> "" Then     'idem autres collections...
              If cond.Count = 0 Then
                    cond.Add (c.Offset(0, 3))
                                Else
                    deja = False
                    i = 0
                    For Each n In cond
                    deja = n = c.Offset(0, 3)
                    If deja Then i = 1
                    Next n
                    If i = 0 Then cond.Add (c.Offset(0, 3))
              End If
      End If
      If c.Offset(0, 1).Value <> "" Then
              If pass.Count = 0 Then
                    pass.Add (c.Offset(0, 1))
                                Else
                    deja = False
                    i = 0
                    For Each n In pass
                    deja = n = c.Offset(0, 1)
                    If deja Then i = 1
                    Next n
                    If i = 0 Then pass.Add (c.Offset(0, 1))
              End If
      End If
      If c.Offset(0, 2).Value <> "" Then
              If traj.Count = 0 Then
                    traj.Add (c.Offset(0, 2))
                                Else
                    deja = False
                    i = 0
                    For Each n In traj
                    deja = n = c.Offset(0, 2)
                    If deja Then i = 1
                    Next n
                    If i = 0 Then traj.Add (c.Offset(0, 2))
              End If
      End If
      If c.Offset(0, 4).Value <> "" Then
              If voit.Count = 0 Then
                    voit.Add (c.Offset(0, 4))
                                Else
                    deja = False
                    i = 0
                    For Each n In voit
                    deja = n = c.Offset(0, 4)
                    If deja Then i = 1
                    Next n
                    If i = 0 Then voit.Add (c.Offset(0, 4))
              End If
      End If
    Next c
    i = 1
    For Each n In noms   'ecriture sur feuill2 des titres
        Feuil2.Cells(i, 2) = Right(n, Len(n) - 3) & "s"
        Feuil2.Cells(i + 1, 1) = "ID"
        Feuil2.Cells(i + 2, 1) = "moyenne"
     
        Select Case n              'ecriture et calcul des moyennes de chacun
           Case "un conducteur"
                j = 2
                For Each c In cond
                   Feuil2.Cells(i + 1, j) = c.Value       'ecriture de l'ID
                   Call moy(n, c, Feuil2.Cells(i + 2, j)) 'routine de moyenne
                   j = j + 1
                Next c
     
            Case "un passager"
                j = 2
                For Each c In pass
                   Feuil2.Cells(i + 1, j) = c.Value        'idem...
                   Call moy(n, c, Feuil2.Cells(i + 2, j))
                   j = j + 1
                Next c
            Case "un trajet"
                j = 2
                For Each c In traj
                   Feuil2.Cells(i + 1, j) = c.Value
                   Call moy(n, c, Feuil2.Cells(i + 2, j))
                   j = j + 1
                Next c
            Case "une voiture"
                j = 2
                For Each c In voit
                   Feuil2.Cells(i + 1, j) = c.Value
                   Call moy(n, c, Feuil2.Cells(i + 2, j))
                   j = j + 1
                Next c
            End Select
     
        i = i + 4 '4 ligne après
    Next n
    End Sub
     
     
    'procédure de calcul de la moyenne
    Sub moy(ByVal s As String, ByVal id As Integer, ByRef cel As Range)
    '            s pour le nom       id en cours       cellule destination
     
    Dim zone As Range
    Dim c As Range
    Dim col As Integer
    Dim nbeval As Integer, v As Integer
     
    col = 7
    Set zone = Feuil1.Range("D2", Feuil1.Range("D2").End(xlDown))
    Select Case s                  'zone de l'id en cours
        Case "un conducteur"
            col = 7
        Case "un passager"
            col = 5
        Case "un trajet"
            col = 6
        Case "une voiture"
            col = 8
    End Select
     
    nbeval = 0
    cel.Value = 0
    v = 0
     
    For Each c In zone 'calcul somme et nombre d'eval
        If c = s And id = Feuil1.Cells(c.Row, col) Then
           v = v + Feuil1.Cells(c.Row, 3)
           nbeval = nbeval + 1
        End If
    Next c
        If nbeval = 0 And v = 0 Then
            cel.Value = ""           'si pas d'évaluation
        Else
            cel.Value = v / nbeval   'moyenne enfin ....
        End If
    End Sub
    J'ai utilisé les mises en forme conditionnelle pour les résultats...

    Nom : resultmoy.jpg
Affichages : 1014
Taille : 57,3 Ko

    Je joins le fichier :conducteur.xlsm

    bonne année

    geogeo70

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup j'ai finalement réussi à utiliser le tableau dynamique croisé et tout fonctionne!
    Vraiment un énorme merci pour avoir passé du temps à faire ce code (je ne l'ai vu que maintenant). Malheureusement vu que je dois rendre ce travail à l'université, je suis un minimum censée savoir faire ça moi même et là je doute que dans un cours d'introduction à la programmation ils m'en pensent capable. Mais un tout grand merci d'y avoir passé du temps et je vais pouvoir m'en servir pour un peu mieux comprendre tout ce que n'ai pas assimilé jusque là (autrement dit, beaucoup de choses)
    Bonne soirée et bonnes fêtes à vous

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

Discussions similaires

  1. boucle avec plusieurs conditions
    Par kharraz dans le forum Débuter
    Réponses: 3
    Dernier message: 24/03/2012, 12h57
  2. Macro avec plusieurs conditions pour ouverture formulaire
    Par Jacques-Henri dans le forum IHM
    Réponses: 2
    Dernier message: 05/08/2008, 22h44
  3. Réponses: 3
    Dernier message: 11/04/2008, 09h31
  4. Plusieurs conditions pour le If ne fonctionne pas.
    Par beegees dans le forum Langage
    Réponses: 11
    Dernier message: 21/01/2007, 14h41
  5. Mettre plusieurs conditions pour ouverture d'un état
    Par L'Oracle dans le forum Access
    Réponses: 2
    Dernier message: 01/07/2006, 15h33

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