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 :

Moyenne mobile en fonction cellule du tableau, avec "remise zero" chaque année [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Profession indépendande
    Inscrit en
    Octobre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Profession indépendande
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2014
    Messages : 102
    Par défaut Moyenne mobile en fonction cellule du tableau, avec "remise zero" chaque année
    Bonjour
    Malgré mes recherche, je ne trouve pas de solution à mon problème mathématique. J'ai transposer en VBA, non sans mal vu mon niveau et avec beaucoup d'aide sur ce forum, les formules (simple) que j'ai dans mes tableaux de données en VBA.
    Il m'en reste une sur laquelle je sèche complétement, mais vraiment complétement.

    Ma formule Excel, fait un calcul de moyenne glissante sur une campagne et je la remet à zéro chaque 1er avril. Formule EXCEL : '=MOYENNE(G$7:G7), qui en glissant s'incrémente jusqu'à '=MOYENNE(G$7:G18), puis '=MOYENNE(G$19:G19) est ainsi de suite chaque année. Cf classeur joint. Se pose également le problème en début de tableau qui ne commence pas forcement un 1er avril.

    Et pour corser le tout, j'ai un formulaire "créer" qui dans mon classeur initial à environ 200 données et des formulaire "modifier" qui me permet des mise en jour par catégorie. Pour les autre opération j'ai réussi à tous faire calculer, mais là je ne sait même pas par quel bout commencer.

    Merci de votre aide, si ma demande est techniquement possible.
    Joël
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonsoir,

    Je ne sais pas si ça aide, mais ça fait ce que j'attendais / compris (non optimisé): je fais juste une RAZ du compteur et moyenne quand le mois '4' est détecté
    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
     
    Sub Test1()
     
    Dim DMonth As Integer
    Dim SrcRng As Range
    Dim SumVal  As Double, CntVal As Integer
    Dim RowN As Integer, ColN As Integer
     
    Set SrcRng = ThisWorkbook.Worksheets("Données").Range("A3").CurrentRegion
    CntVal = 0
    SumVal = 0
     
    For RowN = 2 To SrcRng.Rows.Count
     
        If IsDate(SrcRng(RowN, 1)) Then     'Peut être supprimé si c'est toujours une date
     
            DMonth = Month(SrcRng(RowN, 1))
            Debug.Print RowN, SrcRng(RowN, 1), DMonth
     
            If DMonth = 4 Then
                CntVal = 0
                SumVal = 0
            End If
     
            CntVal = CntVal + 1
            SumVal = SumVal + SrcRng(RowN, 7)
            SrcRng(RowN, 9) = SumVal / CntVal
     
        End If
     
    Next RowN
     
    End Sub
    Bonne soirée
    Vincent

  3. #3
    Membre confirmé
    Homme Profil pro
    Profession indépendande
    Inscrit en
    Octobre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Profession indépendande
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2014
    Messages : 102
    Par défaut
    Bonsoir Vincent et merci
    Bonsoir à tous

    Je vais tester et essayer de comprendre pour l'intégrer à mon code et je donne des nouvelles (peut être pas ce soir).
    Bonne soirée
    Joël

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    J'ajoute à la volée quelques commentaires dans 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
     
    Sub Test1()
     
    Dim DMonth As Integer
    Dim SrcRng As Range
    Dim SumVal  As Double, CntVal As Integer
    Dim RowN As Integer, ColN As Integer
     
    Set SrcRng = ThisWorkbook.Worksheets("Données").Range("A3").CurrentRegion 'Ca revient à faire un CTLR+ * excel sur le range A3
    CntVal = 0
    SumVal = 0
     
    ' Attention, ça ne marche que si données d'entrées sont triée par date croissante (col A), sinon, il faut lz faire
    For RowN = 2 To SrcRng.Rows.Count
     
        If IsDate(SrcRng(RowN, 1)) Then     'Peut être supprimé si c'est toujours une date
     
            DMonth = Month(SrcRng(RowN, 1)) ' On extrait le mois de la date, cf la sortie debug juste après
            Debug.Print RowN, SrcRng(RowN, 1), DMonth
     
            If DMonth = 4 Then 'Si c'est avril, on reset les compteur nb de valeurs et somme des valeurs
                CntVal = 0
                SumVal = 0
            End If
     
            CntVal = CntVal + 1 ' Dans tous les cas, on incrémente le compteur et la somme (pour le calcul de la moyenne)
            SumVal = SumVal + SrcRng(RowN, 7)
            SrcRng(RowN, 9) = SumVal / CntVal ' et on sort la moyenne sur la 9eme colonne du range (col "I")
     
        End If
     
    Next RowN
     
    End Sub
    Bonne journée

  5. #5
    Membre confirmé
    Homme Profil pro
    Profession indépendande
    Inscrit en
    Octobre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Profession indépendande
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2014
    Messages : 102
    Par défaut
    Bonjour à tous

    Merci Vincent

    Ca marche super, c'est même plus que j’espérais, le code recalcule la colonne entière à chaque modif, alors que je pensais devoir repasser sur chaque lige individuellement en cas de modif sur une ligne du tableau qui n’était pas la dernière et adapté à mon tableur sans trop de mal avec les commentaires.

    Je ne m’était jamais vraiment penché sur VBA auparavant, je ne soupçonnais pas une infime partie de ces capacités, de là à mettre en place les codes pour un néophyte, c'est autre chose, heureusement que les forums et surtout les contributeurs existent.
    Excellent

    Merci
    Joël

  6. #6
    Membre confirmé
    Homme Profil pro
    Profession indépendande
    Inscrit en
    Octobre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Profession indépendande
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2014
    Messages : 102
    Par défaut
    Bonjour à tous
    Je ré-ouvre mon post concernant cette partie de code.
    Pas de souci, dans cette configuration, il fonctionne très bien.
    Je m'aperçois cependant à l'utilisation sur mon classeur qu'il ne correspond pas à mon attente et me génère une erreur de calcul.
    Dans mon classeur, la 1 ère colonne est bien chronologique mais pas régulière , c'est à dire qu'il y a une fiche (représentant une ligne) en moyenne tous les 2 mois, donc il arrive de passer de mars à mai, donc pas de remise à zéro en mois 4. Ou à l'inverse, il peut arrivé qu'il y est 2 ligne sur un même mois, donc 2 remise à zéro consécutive.
    J'espère être à peu près clair.
    Il faudrait que le base de la remise à zéro soit la colonne F dans l'exemple, comment doit je modifier mon code afin de changer la référence de départ?
    Merci
    Joël
    Ci-dessous code fourni par Vinc_bilb que je ne parvient pas à adapter

    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
     
    Sub Test1()
     
    Dim DMonth As Integer
    Dim SrcRng As Range
    Dim SumVal  As Double, CntVal As Integer
    Dim RowN As Integer, ColN As Integer
     
    Set SrcRng = ThisWorkbook.Worksheets("Données").Range("A3").CurrentRegion 'Ca revient à faire un CTLR+ * excel sur le range A3
    CntVal = 0
    SumVal = 0
     
    ' Attention, ça ne marche que si données d'entrées sont triée par date croissante (col A), sinon, il faut lz faire
    For RowN = 2 To SrcRng.Rows.Count
     
        If IsDate(SrcRng(RowN, 1)) Then     'Peut être supprimé si c'est toujours une date
     
            DMonth = Month(SrcRng(RowN, 1)) ' On extrait le mois de la date, cf la sortie debug juste après
            Debug.Print RowN, SrcRng(RowN, 1), DMonth
     
            If DMonth = 4 Then 'Si c'est avril, on reset les compteur nb de valeurs et somme des valeurs
                CntVal = 0
                SumVal = 0
            End If
     
            CntVal = CntVal + 1 ' Dans tous les cas, on incrémente le compteur et la somme (pour le calcul de la moyenne)
            SumVal = SumVal + SrcRng(RowN, 7)
            SrcRng(RowN, 9) = SumVal / CntVal ' et on sort la moyenne sur la 9eme colonne du range (col "I")
     
        End If
     
    Next RowN
     
    End Sub
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Fonction de calcul avec des cellules de tableau HTML
    Par Gannox dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/09/2012, 07h28
  2. Ajouter une cellule à un tableau avec div
    Par DarkPoster14 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 21/05/2012, 13h37
  3. Modifier des cellules de tableau avec un sélecteur
    Par Jim_Nastiq dans le forum jQuery
    Réponses: 4
    Dernier message: 15/02/2012, 15h39
  4. Réponses: 2
    Dernier message: 16/02/2011, 14h59
  5. Tableau avec listes déroulantes(récupération de chaque selection faite)
    Par claire63 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/01/2008, 17h27

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