Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/02/2012, 16h40   #1
Invité de passage
 
Étudiant
Inscription : juin 2011
Messages : 9
Détails du profil
Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 0
Points : 0
Par défaut calcul la moyenne

Bonjour

je souhaite faire une marco en vba pour calculer la moyenne de mes valeur (pkoi pas un bouton click). je dois calculer la moyenne des cellules de cette colonne en fonction 3 variables enregistrées chacune dans une colonne
ex Col2 = Nom d'éleve Col3 = nom de matiere et COl4 = notes de tous les controles
il faut calculer en Col5 = Moyenne pour chaque matière et par eleve
voici ce que j'ai fait mais ça marche pas et la 1ere fois que je touche du vba, qlq'un veut m'aider, Merci

Code :
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
Sub Moyenne()
Dim Cell As Range
Dim i As Integer
Dim N As Integer
Dim somme As Long
'Dim Moyenne As Double
Dim E As Variant
Dim M As Variant
Dim C As Variant
Worksheets("Feuil1").Range("I1") = "Moyenne"
 somme = 0
 N = 0
'Set Moyenne = 0
 E = Range("E2").Value 'le 1er nom d'ecole
 M = Range("D2").Value 'le 1ere matiere
 C = Range("F2").Value 'note du controle
 
For i = 2 To Cell("I2:I" & Range("L65536").End(xlUp).Row)
 If E = Range("Ei").Value And M = Range("Di").Value And C = Range("Fi").Value Then
 somme = somme + Cell("Ii").Value
 N = N + 1
 Else
 Range("J(i -1)").Value = somme / N
 Set E = Range("Ei").Value
 Set M = Range("Di").Value
 Set C = Range("Ci").Value
 End If
Next i
 
End Sub
sagere est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 16h47   #2
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 775
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 775
Points : 2 095
Points : 2 095
Bonjour,

J'ai pas testé, juste modifié ton code. A voir :
Code :
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
 
Sub Moyenne()
 
    Dim i As Long
    Dim N As Long
    Dim somme As Long
    Dim E As Double
    Dim M As Double
    Dim C As Double
 
    Worksheets("Feuil1").Range("I1") = "Moyenne"
 
    E = Range("E2").Value 'le 1er nom d'ecole
    M = Range("D2").Value 'le 1ere matiere
    C = Range("F2").Value 'note du controle
 
    For i = 2 To Range("L65536").End(xlUp).Row
 
        If E = Range("E" & i).Value And M = Range("D" & i).Value And C = Range("F" & i).Value Then
 
            somme = somme + Cell("I" & i).Value
            N = N + 1
 
        Else
 
            Range("J" & i - 1).Value = somme / N
 
            E = Range("E" & i).Value
            M = Range("D" & i).Value
            C = Range("C" & i).Value
 
        End If
 
    Next i
 
End Sub
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 17h04   #3
Invité de passage
 
Étudiant
Inscription : juin 2011
Messages : 9
Détails du profil
Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 0
Points : 0
Merci pour votre aide

Malheureusement ça pas marché
au fait les champs E et M sonc des string (noms) par contre C sont des nombre

j'attend votre aide
sagere est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 17h15   #4
Membre du Club
 
Développeur informatique
Inscription : janvier 2008
Messages : 45
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2008
Messages : 45
Points : 43
Points : 43
commence déjà par t'assurer que les variables ont le bon type :
le nom d'une école n'est pas numérique

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Sub Moyenne()
 
    Dim i As Long
    Dim N As Long
    Dim somme As Long
    Dim E As String        ' chaine de caractère, c'est le nom de l'école non ?
    Dim M As String       ' chaine de caractère, c'est la matière (sauf si c'est un code numérique
    Dim C As Double
 
    Worksheets("Feuil1").Range("I1") = "Moyenne"
 
    E = Range("E2").Value 'le 1er nom d'ecole
    M = Range("D2").Value 'le 1ere matiere
    C = Range("F2").Value 'note du controle
 
End Sub
Par contre, tu es sûr que tu as besoin d'aller jusqu'à la fin du fichier excel ?? tu peux t'arrêter avant (avec un compte de nombre de ligne)

utilise aussi la fonction suivante pour vérifier que les valeurs sont bien ajoutées
cdt

oups, tu as répondu entre temps

donne-nous ton code corrigé
et mets le dans les balise code (bouton icone #) c'est plus clair pour nous

qu'as-tu dans la colonne L ?

parce que si elle est vide, Range("F65536").End(xlUp).Row retournera la valeur 0
for i=2 à 0 => jamais executé

Code :
 For i = 2 To Range("F65536").End(xlUp).Row
asteroide26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 17h42   #5
Invité de passage
 
Étudiant
Inscription : juin 2011
Messages : 9
Détails du profil
Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 0
Points : 0
Merci je sais pas c koi le probleme, qd j'execute rien n'affiche voici mon code
Code :
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
Sub Moyenne()
 
    Dim i As Long
    Dim N As Long
    Dim somme As Long
    Dim E As String
    Dim M As String
    Dim C As Double
 
    Worksheets("Feuil1").Range("I1") = "Moyenne"
 'initialiser ces valeurs
    E = Range("E2").Value 'le 1er nom d'ecole
    M = Range("D2").Value 'le 1ere matiere
    C = Range("F2").Value 'note du controle
 
    For i = 2 To Range("L65536").End(xlUp).Row 'la longueur de ma colonne est variable selon les fichiers
 
        If E = Range("E" & i).Value And M = Range("D" & i).Value And C = Range("F" & i).Value Then
 
            somme = somme + Range("I" & i).Value
            N = N + 1
 
        Else
 
            Range("J" & i - 1).Value = somme / N
 
 'j'attribue les nouvelles valeurs à mes variables
 
            E = Range("E" & i).Value
            M = Range("D" & i).Value
            C = Range("C" & i).Value
 
        End If
 
    Next i
 
End Sub
mon nouveau code, il marche pour la 1ere ecole , 1ere matiere et la serie des notes de controle, mais apres il m'affiche cette valeur dans toutes les cellules sans exception
Code :
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
Sub Moyenne()
 
    Dim i As Long
    Dim N As Long
    Dim somme As Long
    Dim E As String
    Dim M As String
    Dim C As Double
 
    Worksheets("Feuil1").Range("I1") = "Moyenne"
 'initialiser ces valeurs
    E = Range("E2").Value 'le 1er nom d'ecole
    M = Range("D2").Value 'le 1ere matiere
    C = Range("F2").Value 'note du controle
 
    For i = 2 To Range("I65536").End(xlUp).Row 'la longueur de ma colonne est variable selon les fichiers
 
        If E = Range("E" & i).Value And M = Range("D" & i).Value And C = Range("F" & i).Value Then
 
            somme = somme + Range("I" & i).Value
            N = N + 1
 
        Else
 
            Range("J" & i - 1).Value = somme / N
 
 'j'attribue les nouvelles valeurs à mes variables
 
            E = Range("E" & i).Value
            M = Range("D" & i).Value
            C = Range("C" & i).Value
 
        End If
 
    Next i
 
End Sub
sagere est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 17h47   #6
Membre Expert
 
Avatar de Daranc
 
Inscription : janvier 2007
Messages : 1 166
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 1 166
Points : 1 244
Points : 1 244
Bonjour
ce que je ne comprends pas c'est pourquoi passer par VBA
l'affaire ne peut elle pas se résoudre avec une formule matricielle
je te suppose sur 2003 ( ou 2000) vu le nombre de ligne
je ne vois pas trop la sortie que tu comptes obtenir en colonne 5 : une moyenne par rapport à l’élève? la matière?
le résultat souhaité n'est pas des plus clair.
la recherche de solution n'est donc pas évidente .
ssi on comprend ce que tu veux on aura plus de facilité à te proposer une solution
__________________
Cordialement
Daranc
Daranc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 17h57   #7
Invité de passage
 
Étudiant
Inscription : juin 2011
Messages : 9
Détails du profil
Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 0
Points : 0
j'ai pensé au vba car mes fichiers peuvent comprendre parfois 3000 lignes que je dois calculer la moyenne manuellement pour chaque serie de valeurs en fonction de 3 variables, un autre ex

groupe A, B, .....F
chaque groupe contient par ex 3 produits X1, X1 X3
chaque produit a 2 concentrations C1 et C1
chaque concentration est utilisée pour calculer une vitesse de reaction v1 v2 v3...vx

je veux calculer la moyenne des vitesses pour chaque concentration par produit part groupe

j'espère que je suis claire
sagere est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 18h32   #8
Membre chevronné
 
Inscription : octobre 2006
Messages : 541
Détails du profil
Informations personnelles :
Localisation : France, Ardèche (Rhône Alpes)

Informations forums :
Inscription : octobre 2006
Messages : 541
Points : 760
Points : 760
Bonjour
Ton 2° exemple embrouille plutôt qu'autre chose...

tu veux le résultat eleve, matière, moyenne sur 1 seule colonne ?
je suppose que l'élève est notée dans plusieurs matières et qu'il a plusieurs notes dans cette matière ?

Mets un extrait de ton classeur, sans données confidentielles sinon on tournera en rond...
__________________
Michel_M
Michel_M est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 21h40   #9
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Bonjour,

Voici un exemple de code, en espérant que j’aie bien compris le problème .
Code :
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
 Option Explicit
Sub Moyenne()
Dim i As Long, N As Long, DerLig As Long
Dim Somme As Single, Note As Single, Moy As Single
Dim E As String, M As String, Matiere As String, Nom As String
 
With Worksheets("Feuil1")
    .Range("I1") = "Moyenne"
    'initialiser ces valeurs
    E = .Range("E2").Value 'le 1er nom d'ecole
    M = .Range("D2").Value 'la 1ere matiere
    DerLig = .Range("F65536").End(xlUp).Row 'Dernière ligne renseignée dans la colonne F
 
    'Effacement des moyennes
    .Range(Cells(2, "I"), Cells(DerLig, "I")).ClearContents
 
    'Calcul des moyennes
    For i = 2 To DerLig
        Nom = .Range("E" & i)
        Matiere = .Range("D" & i)
        Note = .Range("F" & i)
        'Si le nom et la matière ne changent pas, j'effectue le cumul et le compte des notes.
        If Nom = E And Matiere = M Then
            Somme = Somme + Note
            N = N + 1
        'Dans le cas contraire, j'effectue le traitement de la moyenne
        Else
            'Je calcule la moyenne
            Moy = Somme / N
            'Je copie cette moyenne
            .Range("I" & i - 1) = Moy
            'Je réinitialise mon cumul et mon compteur
            Somme = .Range("F" & i)
            N = 1
            'j'attribue les nouvelles valeurs à mes variables
            M = .Range("D" & i) 'Matière
            E = .Range("E" & i) 'Nom
        End If
    Next i
    'Avant de sortir de ma procédure, je copie la dernière moyenne
    .Range("I" & i - 1) = Somme / N
End With
End Sub
Je joints le fichier Test afin que tu puisses adapter le code si ton besoin est différent.

Cordialement.
Fichiers attachés
Type de fichier : xls Moyenne.xls (47,0 Ko, 0 affichages)
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 10h31   #10
Invité de passage
 
Étudiant
Inscription : juin 2011
Messages : 9
Détails du profil
Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 0
Points : 0
Par défaut calcule de la moyenne "résolu"

Bonjour

je vous remercie bcp gFZT82, ça marche
j'ai reconnu mon erreur, j'ai oublié de l'initialiser la somme et le N :p

Merci pour tout le monde et pour votre aide
sagere est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h33.


 
 
 
 
Partenaires

Hébergement Web