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 :

Calculer moyenne de chiffres d'une colonne


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut Calculer moyenne de chiffres d'une colonne
    Bonjour tout le monde,

    Je suis débutant en vba, je me permet de vous solliciter pour me donner un petit coup de pouce dans la réalisation de moyennes grace a une macro...

    Voila ce que je veux faire :

    Dans un premier temps je souhaite appliquer la condition :

    Si la valeur de la cells(i,16) et la valeur de cells(i,21) sont de signe différent alors la valeur à mettre dans la cells(i,23) est 0, sinon (valeur cells(i,16)/cells(i,21))*100

    Je souhaite faire par la suite la moyenne de tous les chiffres de la colonne 23 correspondant à la catégorie A puis B puis C, etc.

    Merci d'avance

    NB : Voir fichier joint c’est très lisible sur la feuille excel.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    Pour faire la moyenne j'ai testé ce bout de code simple qui marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(2, 24).Value = Application.WorksheetFunction.Average(Range(Cells(2, 23), Cells(40, 23)))
    mais je souhaite insérer mes conditions (catégorie et le calcul du pourcentage avant de faire la moyenne)

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    bonjour
    essaies:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Cells(i, 16) * Cells(i, 21) < 0 Then
        Cells(i, 23) = 0
    Else
        Cells(i, 23) = Cells(i, 16) / Cells(i, 21)
    End If

  4. #4
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    Merci Michel_M pour ton aide

    mais qu'en est il pour :

    faire par la suite la moyenne de tous les chiffres de la colonne 23 correspondant à la catégorie A puis B puis C, etc.

    je ne vois pas comment je peux faire cela...


    Merci d'avance

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    Bonjour

    Es tu sûr de vouloir traiter ce problème par VBA ? il se résout facilement avec des formules...
    dans l'attente

  6. #6
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    Bonjour Michel_M,

    dans un premier temps si je peux avoir la formule a utilisé sur excel ca serait bien...
    Merci d'avance Michel_M

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    Bonjour,

    Désolé mais je n'étais pas devant mon ordi hier pm...

    Ci joint solution par formules: calcul de la moyenne sans les antécédents=0 pour colonne=500 lignes

    solution à envisager par VBA si colonnes très longues (les formules matricielles sont lentes...)

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    Bravo!

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    re,

    ci joint proposition
    sheets(1) avec formules corrigées suite à mes habituelles étourderies (les $!!!)
    feuil1= par vba macro: calculer_moyenne
    si tu travailles sur un excel anglais il faudra traduire cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("W2:W" & derlig).FormulaLocal = "=si((estvide(U2))+(P2*U2<0);0;P2/U2)"
    je pense que c'est isempty(U2) mais...

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut test ça c'est du tout vb
    bonsoir,


    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
    Dim result As Variant
    Dim val1 As Variant
    Dim val2 As Variant
    Dim i As Byte
     
    Sub signe()      'Attribuer la valeur de la cellule C23
     
    i = 2
        For i = 2 To ActiveWorkbook.Sheets("sheet1").Range("P2").End(xlDown).row
            val1 = Cells(i, 16).Value
            val2 = Cells(i, 21).Value
            result = (val1 * val2)
            If result < 0 Then
            Cells(i, 23).Value = 0
            Else
            Cells(i, 23).Value = (Cells(i, 16) / Cells(i, 21)) * 100
            End If
        Next i
    End Sub
    pour la suite je travaille dessus quand mon fils m'aura laché...

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut la solution complète par VBA
    bonjour ou bonne nuit

    Je te transmets une solution complète par VBA, je t'invite toutefois à t'imprégnier des différentes boucles qui existe et qui bien que lourdes permettent de faire beaucoup de chose.

    J'ai développé pour xl2000 mais ça ne doit pas beaucoup changer en 2003.
    Je te transmets la macro à importer sur vb
    Fichiers attachés Fichiers attachés

  12. #12
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    Merci iceman7592, Michel_M

    j'ai bien testé ton code iceman7592 ca marche bien sur l'exemple de tableau que je vous ai donné....
    Le problème est que mon vrai tableau est énorme dans les 60000 lignes, quand j'essaye la macro ya un message d'erreur overflow qui s'affiche.....

    bug au niveau de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 2 To ActiveWorkbook.Sheets("sheet1").Range("P2").End(xlDown).Row
    est ce que c'est normal ?

    Précision : les noms présents dans la colonne V (A B C...dans l'exemple) sont en fait des noms très long

  13. #13
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    J'ai pas regardé le code mais si tu a beaucoup de ligne dans la déclaration de variable
    met a la place Les variable déclaré en integer sont limité a 32765 (enfin 2^15) si tu a plus de ligne que ca tu ne peux pas sotcker le numéro en long la limite est bien plus élevé
    Si tu veux te simplifier les chose remplace tout tes integer par des long, si tu veux faire les chose bien ne remplace que ce qui peuve dépasser cette valeur de 32765

  14. #14
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    je viens de tester Krovax
    meme avec i as long ca ne marche pas
    on me dit subscript out of range (erreur 9)


    Merci pour l'intervention

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut Solution
    Jean Charles,

    J'ai testé pour toi et cela fonctionne avec les variables i et lignestart en as long.

    J'espère que cela fonctionnera pour toi aussi. Sinon refais un post et je te repondrai dès que possible...

  16. #16
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    Merci iceman7592, j'ai changé en long i et lignestart mais j'ai cette fois un
    Bug a ce niveau la (quand i=889) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Cells(i, 23).Value = (Cells(i, 16) / Cells(i, 21)) * 100
    Merci d'avance pour l'aide

  17. #17
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Que vaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Cells(889, 16) / Cells(889, 21))
    ??

  18. #18
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    tu as raison Krovax, j'ai pas fait attention ca bugger à cause du 0 au dénominateur dsl

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    Merci Krovax,

    En effet, je n'ai pas prévu le cas de la division par 0 et jean charles, cela posera aussi un problème pour la moyenne. Est ce que cette division par 0 est à traité comme un cas redondant ,

  20. #20
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut
    Merci iceman7592 et Krovax pour votre aide.

    Je souhaite maintenant copier toute la ligne 1 sauf la cells(1,23) et la coller au niveau de la ligne 1 d’une feuille appelée Resultat.

    A partir de la ligne 2 de cette feuille coller toutes les lignes de la sheet 1 correpondant à une consommation moyenne <= 50 (biensur toutes les lignes de la sheet1 sauf les cells(i,23)).
    J’essaye depuis tout à l’heure mais je n’arrive pas à introduire la condition sur la colonne 23 à ne pas copier….

    En gros je veux faire un onglet où j’ai toutes mes consommation moyenne <= 50.
    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
    Sub moyenne()
    
    lignestart = 2
    i = 2
    cumul = 0
    Sheets("sheet1").Select
    For i = 2 To ActiveWorkbook.Sheets("sheet1").Range("V2").End(xlDown).Row
        If Cells(i, 22).Text = Cells(i + 1, 22).Text Then
            cumul = cumul + Cells(i, 23).Value
        Else
            cumul = cumul + Cells(i, 23).Value
            Cells(i, 24).Value = cumul / (i - lignestart + 1)
            lignestart = i + 1
            cumul = 0
            
        End If
    Next i
    
    If Cells(i, 24).Value <= 50 Then
            Cells(i, 24).EntireRow.Select
            Selection.Copy
            Sheets("Resultat").Select
            Rows("2:2").Select
            ActiveSheet.Paste
            Application.CutCopyMode = False
    End Sub
    Merci d'avance pour votre aide

    @+

    j'ai supprimé le cas ou le dénominateur = 0 donc le code est bien adapté à mes besoins...
    Il me reste la partie que je viens de préciser.

    Merci d'avance pour l'aide

Discussions similaires

  1. additionner certains chiffres d'une colonne
    Par christyn45 dans le forum Excel
    Réponses: 14
    Dernier message: 23/06/2009, 16h40
  2. Calculer la valeur maximum d'une colonne
    Par chip_2008 dans le forum Fortran
    Réponses: 2
    Dernier message: 19/12/2008, 11h10
  3. Suite de chiffre dans une colonne
    Par hassan1234 dans le forum Excel
    Réponses: 1
    Dernier message: 08/08/2008, 12h24
  4. Valeur calculée:retirer l'heure d'une colonne date
    Par gracouille dans le forum SharePoint
    Réponses: 1
    Dernier message: 30/05/2008, 11h35
  5. Réponses: 4
    Dernier message: 13/07/2007, 14h46

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