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 :

Débug Macro calcul de consommation [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Support en AMO technique
    Inscrit en
    Avril 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support en AMO technique
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2016
    Messages : 11
    Par défaut Débug Macro calcul de consommation
    Salut,

    Impossible de trouver pourquoi ma macro ne fonctionne pas...
    C'est une macro sensée être toute bête qui doit récupérer des indexs de consommation existants dans mon classeur pour ensuite calculer les consommations en faisant une soustraction.
    La macro n'est pas terminée mais je n'arrive pas à ce que mes 2 dernières lignes fonctionnent...

    Si une âme charitable passe par là et comprend le sujet, l'avis m'intéresse.

    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
    Sub Conso_Mensuel()
        Dim Year, YearPrecedent As Integer
        Dim Feuille_Index, Feuille_IndexPrecedent As Worksheet
        Dim IndexJanvier, IndexFevrier, IndexMars, IndexAvril, IndexMai, IndexJuin As Single
        Dim IndexJuillet, IndexAout, IndexSeptembre, IndexOctobre, IndexNovembre, IndexDecembre As Single
        Dim ConsoJanvier, ConsoFevrier, ConsoMars, ConsoAvril, ConsoMai, ConsoJuin As Single
        Dim ConsoJuillet, ConsoAout, ConsoSeptembre, ConsoOctobre, ConsoNovembre, ConsoDecembre As Single
     
        ' ATTENTION ! Les feuilles sont définies dans le module A_Variables_Globales !!!
        Call Attrib_Variables
     
        'Attribution d'une variable à la feuille de destination
        'L'année affichée par défaut est l'année indiquée dans l'inputbox, elle peut être modifiée
        Year = Application.InputBox("Quelle année d'export ?", , "2015", , , , "Saisie numérique", Type:=1)
        'Year = 2015 'sert à tester le pas à pas
        YearPrecedent = Year - 1
        Set Feuille_Index = Sheets("Conso " & Year)
     
        ' Recherche de la dernière cellule non vide de la feuille de destination
        Feuille_Index.Activate
        FinalRow = Feuille_Index.Cells(Rows.Count, 1).End(xlUp).Row
     
        ' Recherche à partir de la ligne (ici 3) jusqu'à la dernière cellule non vide
        For x = 3 To FinalRow
            ' Données initiales
            IndexJanvier = Feuille_Index.Cells(x, 4).Value
            IndexFevrier = Feuille_Index.Cells(x, 5).Value
            IndexMars = Feuille_Index.Cells(x, 6).Value
            IndexAvril = Feuille_Index.Cells(x, 7).Value
            IndexMai = Feuille_Index.Cells(x, 8).Value
            IndexJuin = Feuille_Index.Cells(x, 9).Value
            IndexJuillet = Feuille_Index.Cells(x, 10).Value
            IndexAout = Feuille_Index.Cells(x, 11).Value
            IndexSeptembre = Feuille_Index.Cells(x, 12).Value
            IndexOctobre = Feuille_Index.Cells(x, 13).Value
            IndexNovembre = Feuille_Index.Cells(x, 14).Value
            IndexDecembre = Feuille_Index.Cells(x, 15).Value
            ' Données à calculer
            ConsoJanvier = Feuille_Index.Cells(x, 16)
            ConsoFevrier = Feuille_Index.Cells(x, 17)
            ConsoMars = Feuille_Index.Cells(x, 18)
            ConsoAvril = Feuille_Index.Cells(x, 19)
            ConsoMai = Feuille_Index.Cells(x, 20)
            ConsoJuin = Feuille_Index.Cells(x, 21)
            ConsoJuillet = Feuille_Index.Cells(x, 22)
            ConsoAout = Feuille_Index.Cells(x, 23)
            ConsoSeptembre = Feuille_Index.Cells(x, 24)
            ConsoOctobre = Feuille_Index.Cells(x, 25)
            ConsoNovembre = Feuille_Index.Cells(x, 26)
            ConsoDecembre = Feuille_Index.Cells(x, 27)
     
            'Vérifie si la feuille contenant les index de l'année précédente existe
            'FeuilleExiste est une fonction public qui est stockée dans le module Variables_Globales
            If FeuilleExiste("Conso " & Year - 1) = True Then
                Set Feuille_IndexPrecedent = Sheets("Conso " & YearPrecedent)
                IndexDecembrePrec = Feuille_IndexPrecedent.Cells(x, 15).Value
                ConsoJanvier = IndexJanvier - IndexDecembrePrec
            End If
            ConsoJanvier = 0 'Cette ligne ne sécrit pas
            ConsoFevrier = IndexFevrier - IndexJanvier 'Cette ligne ne s'écrit pas non plus
     
            'Macro à continuer quand cela fonctionnera au-dessus
     
        Next x
     
    End Sub

    [EDIT]J'ai supprimé la PJ, je me suis rendu compte après qu'elle n'était peut-être pas suffisamment anonyme.[EDIT]

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Février 2015
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Février 2015
    Messages : 118
    Par défaut
    Bonjour,

    Que veux-tu dire par :
    'Cette ligne ne sécrit pas
    ?

    ConsoJanvier & ConsoFevrier sont des variables; il n'y a pas d'écriture visible attendue...

    Je ne comprends pas bien ton problème.

    A+

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Je ne comprends vraiment pas ce que tu essayes de faire avec cette macro.
    Elle semble remplie de choses qui me semblent aberrantes.

    Ta boucle tourne trois fois mais les version successives mettent de nouvelles valeurs dans les mêmes variables que les versions précédentes.
    Donc les nouvelles valeurs écrases les précédentes.
    A priori, ta boucle ne sert à rien.

    Tu renseignes ConsoJanvier dans ton test mais, sans utiliser le contenu de cette variable, tu la remets à 0 juste après.
    Dans ce cas, quelle était l'utilité de l'avoir renseignée ?

  4. #4
    Membre habitué
    Homme Profil pro
    Support en AMO technique
    Inscrit en
    Avril 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support en AMO technique
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2016
    Messages : 11
    Par défaut
    Salut,

    Effectivement, c'est pas forcément bien clair tout ça.

    • L'idée des variables c'est pour avoir une lisibilité de ce que fais la macro si un collègue souhaite la récupérer ou la modifier.
    • La boucle for sert à balayer toutes les lignes de mon tableau car je veux calculer la consommation mensuelle de plusieurs compteurs. Mes variables n'ont pas vocation à conserver les valeurs puisqu'elles sont sensées les restituer dans des cellules.
    • Mon idée des variables ConsoMois, c'est qu'elles soient associées à des cellules pour ensuite remplir ces cellules.
    • Pour l'histoire de remettre ConsoJanvier à 0 juste après le test c'est effectivement une erreur.

    Au final, grace à vos remarques j'ai trouvé la solution, au lieu de dire que les cellules sont affectées aux variables ConsoMois, j'ai fait l'inverse et ça donne :
    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
        For x = 3 To FinalRow
            ' Données initiales
            IndexJanvier = Feuille_Index.Cells(x, 4).Value
            IndexFevrier = Feuille_Index.Cells(x, 5).Value
            IndexMars = Feuille_Index.Cells(x, 6).Value
            IndexAvril = Feuille_Index.Cells(x, 7).Value
            IndexMai = Feuille_Index.Cells(x, 8).Value
            IndexJuin = Feuille_Index.Cells(x, 9).Value
            IndexJuillet = Feuille_Index.Cells(x, 10).Value
            IndexAout = Feuille_Index.Cells(x, 11).Value
            IndexSeptembre = Feuille_Index.Cells(x, 12).Value
            IndexOctobre = Feuille_Index.Cells(x, 13).Value
            IndexNovembre = Feuille_Index.Cells(x, 14).Value
            IndexDecembre = Feuille_Index.Cells(x, 15).Value
     
    'Coder si index vide, alors exit for
    'Nécessite de faire qu'une seule variable Index et qu'une seule variable Conso
     
            'Vérifie si la feuille contenant les index de l'année précédente existe
            'FeuilleExiste est une fonction public qui est stockée dans le module Variables_Globales
            If FeuilleExiste("Conso " & Year - 1) = True Then
                Set Feuille_IndexPrecedent = Sheets("Conso " & YearPrecedent)
                IndexDecembrePrec = Feuille_IndexPrecedent.Cells(x, 15).Value
                ConsoJanvier = IndexJanvier - IndexDecembrePrec
                Else: ConsoJanvier = 0
            End If
     
            ConsoFevrier = IndexFevrier - IndexJanvier
            ConsoMars = IndexMars - IndexFevrier
            ConsoAvril = IndexAvril - IndexMars
            ConsoMai = IndexMai - IndexAvril
            ConsoJuin = IndexJuin - IndexMai
            ConsoJuillet = IndexJuillet - IndexJuin
            ConsoAout = IndexAout - IndexJuillet
            ConsoSeptembre = IndexSeptembre - IndexAout
            ConsoOctobre = IndexOctobre - IndexSeptembre
            ConsoNovembre = IndexNovembre - IndexOctobre
            ConsoDecembre = IndexDecembre - IndexNovembre
     
            ' Affichage des consos
            Feuille_Index.Cells(x, 16) = ConsoJanvier
            Feuille_Index.Cells(x, 17) = ConsoFevrier
            Feuille_Index.Cells(x, 18) = ConsoMars
            Feuille_Index.Cells(x, 19) = ConsoAvril
            Feuille_Index.Cells(x, 20) = ConsoMai
            Feuille_Index.Cells(x, 21) = ConsoJuin
            Feuille_Index.Cells(x, 22) = ConsoJuillet
            Feuille_Index.Cells(x, 23) = ConsoAout
            Feuille_Index.Cells(x, 24) = ConsoSeptembre
            Feuille_Index.Cells(x, 25) = ConsoOctobre
            Feuille_Index.Cells(x, 26) = ConsoNovembre
            Feuille_Index.Cells(x, 27) = ConsoDecembre
        Next x
    Et là ça fonctionne bien.
    Merci !

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Petite info pour toi. Quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Dim Year, YearPrecedent As Integer
    Seule la seconde variable est déclarée Integer.
    Year est déclarée Variant (faute d'autre indication).


    Si j'ai bien compris ton code (ce qui n'est pas sûr), il serait plus simple d'écrire :
    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
    Sub Conso_Mensuel()
        Dim Year As Integer
        Dim Prec As Single
        Dim x As Long, y As Integer
     
        Call Attrib_Variables
     
        Year = Application.InputBox("Quelle année d'export ?", , "2015", , , , "Saisie numérique", Type:=1)
        Sheets("Conso " & Year).Activate
     
        For x = 3 To Cells(Rows.Count, 1).End(xlUp).Row
            Prec = 0
            If FeuilleExiste("Conso " & (Year - 1)) = True Then Prec = Sheets("Conso " & (Year - 1)).Cells(x, 15).Value
     
            For y = 1 to 12        
                Feuille_Index.Cells(x, y+15) = Feuille_Index.Cells(x, y+3).Value - Prec
                Prec = Feuille_Index.Cells(x, y+3).Value
            Next y
        Next x
     
    End Sub

  6. #6
    Membre habitué
    Homme Profil pro
    Support en AMO technique
    Inscrit en
    Avril 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support en AMO technique
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2016
    Messages : 11
    Par défaut
    Menhir, si je m'appelais Obélix je t'aurais surement embrassé !

    C'est exactement ce que je voulais faire comme simplification à terme mais comme tu as pu le constater, je suis assez novice et je m'améliore pas à pas.
    Bon après t'as juste oublié de virer ma variable Feuille_Index pour que la macro fonctionne et tu n'as pas intégré ConsoJanvier = 0 si il n'y a pas d'année précédente.
    Néanmoins, t'as mis 10 minutes à faire un truc qui m'aurait pris une journée, bravo !

    Voilà ce que ça donne au final.
    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
    Sub Conso_Mensuel2()
        Dim Year As Integer
        Dim Prec As Single
        Dim x As Long, y As Integer
     
        Call Attrib_Variables
     
        Year = Application.InputBox("Quelle année d'export ?", , "2015", , , , "Saisie numérique", Type:=1)
        Sheets("Conso " & Year).Activate
     
        For x = 3 To Cells(Rows.Count, 1).End(xlUp).Row
            Prec = Cells(x, 4).Value
            If FeuilleExiste("Conso " & (Year - 1)) = True Then Prec = Sheets("Conso " & (Year - 1)).Cells(x, 15).Value
     
            For y = 1 To 12
                Cells(x, y + 15) = Cells(x, y + 3).Value - Prec
                Prec = Cells(x, y + 3).Value
            Next y
        Next x
    End Sub
    Autre chose, merci pour l'astuce de déclaration des variables, j'étais certain que ça déclarait tout comme je faisais.

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

Discussions similaires

  1. macro calcul factorielle
    Par elimaur dans le forum Macro
    Réponses: 9
    Dernier message: 11/01/2010, 09h44
  2. [Macro] Calcul sur échantillon mobile
    Par jacksparow dans le forum Macro
    Réponses: 2
    Dernier message: 20/09/2008, 14h15
  3. [Macro] Calcul de pourcentage sur table
    Par Ines2013 dans le forum Macro
    Réponses: 9
    Dernier message: 16/09/2008, 16h39
  4. macro calcul de correlation
    Par oliver75 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 29/06/2007, 17h53
  5. [Q] VB Excel: Macros calcul de date jours ouvrés
    Par naouara17 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/05/2007, 13h59

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