Partage
  • Partager sur Facebook
  • Partager sur Twitter

Modification automatique de valeurs d'une cellule

Sujet résolu
    15 octobre 2018 à 5:15:49

    Bonjour à vous.

    Je rencontre actuellement un problème avec un code sous VBA. 

    Je m'explique : J'ai besoin pour l'école de créer un fichier excel "automatisé" où de nombreuses cellules interagissent ensemble lors de la modification d'une valeur quelconque. Je dois, par exemple, modifier mes valeurs de "T°consigne" et "DKevap" afin que ces valeurs renvoient un résultat dans la cellule "puissance frigorifique" comme présenté ci-après :

    Pour cela, je suis aidé du tableau ci-dessous ainsi que de la formule d'interpolation pour trouver les valeurs comprises entre ces nombres (valeurs constantes).

    La formule est la suivante : x3 = x1+(y3-y1) * ((x2-x1) / (y2-y1)).

    En codant, j'ai réussi pour les DKevap (compris en 5 et 15) à interpoler les valeurs avec les t° de consigne correspondantes (entre -5 et 0) et à faire intéragir mon tableau excel de façon dynamique. Cependant, lorsque j'essaie de faire correspondre les DKevap avec les t° de consigne comprises en 0 et 5, celui-ci n'est pas dynamique entre ces valeurs... C'est pourtant exactement les mêmes codes, ce ne sont que les emplacements des cellules qui changent. Je dois obligatoirement exécuter la macro pour avoir le résultat.

    Voici le code :

    Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Range("B9").Value <= 0 And Range("B9").Value >= -5 And Range("B10").Value = 5 Then 'Pour T°consigne entre (-5;0) et DKevap =5
    If Target.Address = Range("B9").Address Then
    Run ("negatifCinq")  'Pour T°consigne entre (-5;0) et DKevap =5 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("negatifCinq")  'Pour T°consigne entre (-5;0) et DKevap =5 quand on agit sur B10 (DK Evap)
    End If
    
    ElseIf Range("B9").Value <= 0 And Range("B9").Value >= -5 And Range("B10").Value = 6 Then
    If Target.Address = Range("B9").Address Then
    Run ("negatifSix")  'Pour T°consigne entre (-5;0) et DKevap =6 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("negatifSix")  'Pour T°consigne entre (-5;0) et DKevap =6 quand on agit sur B10 (DK Evap)
    End If
    
    ElseIf Range("B9").Value <= 0 And Range("B9").Value >= -5 And Range("B10").Value = 7 Then
    If Target.Address = Range("B9").Address Then
    Run ("negatifSept")  'Pour T°consigne entre (-5;0) et DKevap =7 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("negatifSept")  'Pour T°consigne entre (-5;0) et DKevap =7 quand on agit sur B10 (DK Evap)
    End If
    
    ElseIf Range("B9").Value <= 0 And Range("B9").Value >= -5 And Range("B10").Value = 8 Then
    If Target.Address = Range("B9").Address Then
    Run ("negatifHuit")  'Pour T°consigne entre (-5;0) et DKevap =8 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("negatifHuit")  'Pour T°consigne entre (-5;0) et DKevap =8 quand on agit sur B10 (DK Evap)
    End If
    
    ElseIf Range("B9").Value <= 0 And Range("B9").Value >= -5 And Range("B10").Value = 9 Then
    If Target.Address = Range("B9").Address Then
    Run ("negatifNeuf")  'Pour T°consigne entre (-5;0) et DKevap =9 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("negatifNeuf")  'Pour T°consigne entre (-5;0) et DKevap =9 quand on agit sur B10 (DK Evap)
    End If
    
    ElseIf Range("B9").Value <= 0 And Range("B9").Value >= -5 And Range("B10").Value = 10 Then
    If Target.Address = Range("B9").Address Then
    Run ("negatifDix")  'Pour T°consigne entre (-5;0) et DKevap =10 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("negatifDix")  'Pour T°consigne entre (-5;0) et DKevap =10 quand on agit sur B10 (DK Evap)
    End If
    
    ElseIf Range("B9").Value <= 0 And Range("B9").Value >= -5 And Range("B10").Value = 11 Then
    If Target.Address = Range("B9").Address Then
    Run ("negatifOnze")  'Pour T°consigne entre (-5;0) et DKevap =11 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("negatifOnze")  'Pour T°consigne entre (-5;0) et DKevap =11 quand on agit sur B10 (DK Evap)
    End If
    
    ElseIf Range("B9").Value <= 0 And Range("B9").Value >= -5 And Range("B10").Value = 12 Then
    If Target.Address = Range("B9").Address Then
    Run ("negatifDouze")  'Pour T°consigne entre (-5;0) et DKevap =12 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("negatifDouze")  'Pour T°consigne entre (-5;0) et DKevap =12 quand on agit sur B10 (DK Evap)
    End If
    
    ElseIf Range("B9").Value <= 0 And Range("B9").Value >= -5 And Range("B10").Value = 13 Then
    If Target.Address = Range("B9").Address Then
    Run ("negatifTreize")  'Pour T°consigne entre (-5;0) et DKevap =13 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("negatifTreize")  'Pour T°consigne entre (-5;0) et DKevap =13 quand on agit sur B10 (DK Evap)
    End If
    
    ElseIf Range("B9").Value <= 0 And Range("B9").Value >= -5 And Range("B10").Value = 14 Then
    If Target.Address = Range("B9").Address Then
    Run ("negatifQuatorze")  'Pour T°consigne entre (-5;0) et DKevap =14 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("negatifQuatorze")  'Pour T°consigne entre (-5;0) et DKevap =14 quand on agit sur B10 (DK Evap)
    End If
    
    ElseIf Range("B9").Value <= 0 And Range("B9").Value >= -5 And Range("B10").Value = 15 Then
    If Target.Address = Range("B9").Address Then
    Run ("negatifQuinze")  'Pour T°consigne entre (-5;0) et DKevap =15 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("negatifQuinze")  'Pour T°consigne entre (-5;0) et DKevap =1 quand on agit sur B10 (DK Evap)
    End If
    
    ElseIf Range("B9").Value <= 5 And Range("B9").Value >= 0 And Range("B10").Value = 5 Then
    If Target.Address = Range("B9").Address Then
    Run ("NulCinq")  'Pour T°consigne entre (0;5) et DKevap =5 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("NulCinq")  'Pour T°consigne entre (0;5) et DKevap =5 quand on agit sur B10 (DK Evap)
    End If
    
    ElseIf Range("B9").Value <= 5 And Range("B9").Value >= 0 And Range("B10").Value = 6 Then
    If Target.Address = Range("B9").Address Then
    Run ("NulSix")  'Pour T°consigne entre (0;5) et DKevap =6 quand on agit sur B9 (T°consigne)
    ElseIf Target.Address = Range("B10").Address Then
    Run ("NulSix")  'Pour T°consigne entre (0;5) et DKevap = 5 quand on agit sur B10 (DK Evap)
    End If
    
    End If
    End Sub

    Je vous joint également le code d'un module type car ils sont très répétitifs, ce ne sont également que les emplacements des cellules qui diffèrent.

    Sub NegatifSix()
    Dim eFormule
    eFormule = Range("P5").Value + (-Range("B9").Value + Range("P3").Value) * ((Range("Q5").Value - Range("P5").Value) / (Range("Q3").Value + Range("P3").Value))
    Range("L5") = eFormule
    End Sub


    J'espère avoir été assez clair, j'ai dû mal à exposer le problème car je ne maîtrise pas le VBA. 

    Merci d'avance pour vos réponses, astuces et conseils.

    Bonne journée

    -
    Edité par BrownM 15 octobre 2018 à 5:21:16

    • Partager sur Facebook
    • Partager sur Twitter
      15 octobre 2018 à 12:09:34

      Salut,

      Pour la macro, utilise une boucle pour pas avoir 15 fois exactement le même code à une valeur près, indente le code, pas besoin d'utiliser une routine différente pour chaque calcul que tu dois faire, utilise-en une seule en passant les bons arguments et tu peux utiliser Range.Offset pour  utiliser la cellule qui t'intéresse.

      Sinon pour ce que tu veux faire pas besoin du VBA dans l'absolu (ça te paraîtra peut-être plus facile, tu me diras ce que tu préfères). Tu peux utiliser les formules avec des INDEX et EQUIV pour faire l'interpolation, il faut juste faire attention à bien décomposer les formules et pas tout faire d'un coup, par exemple dans une cellule tu récupères la valeur de x1, y1 dans la suivante, idem pour x2 et y2.

      • Partager sur Facebook
      • Partager sur Twitter
        15 octobre 2018 à 13:51:59

        Salut, 

        Merci beaucoup pour ta réponse et tes remarques. 

        Je suis novice en langage informatique et j'apprends un peu "sur le tas", du coup, je ne maîtrise pas totalement les boucles  l'indentation, etc pour le moment. J'y travaille cependant car je sais que ça peut grandement le facilité la tâche. Alors, merci pour tes conseils.

        Mais du coup, j'aimerais savoir ce qui ne vas pas dans le code que j'ai écris car tout fonctionnait bien jusqu'à ce que je change l'écart de température de consigne dans la condition. Pourtant, lorsque je rentre une T° de consigne comprise entre  -5 et 0 avec un Dkevap de 5 à 15K, le tableau est dynamique et les formules fonctionne parfaitement. Je ne comprends pas pourquoi, lorsque je change l'écart de T° de consigne de 0 à 5°C pour une Dkevap de 5K par exemple, le tableau n'est pas dynamique et je dois exécuter manuellement la macro pour que cela fonctionne... Peut-être un problème dans mes conditions ?

        Merci d'avance pour vos réponses. 

        • Partager sur Facebook
        • Partager sur Twitter
          15 octobre 2018 à 14:13:37

          J'ai testé chez moi et ça marche aussi bien pour les couples (T;DKevap) = (-5;15) que pour (5;5).

          Quand tu fais les tests sur ces couples, tu ne changes absolument rien à la macro et l'exécution manuelle que tu lances est bien celle de Worksheet_Change ?

          Tu n'as pas deux versions de la macro dans les différents onglets du projet VBA ? (par exemple tu modifies et exécutes une version dans la feuille "ThisWorkbook" mais celle qui s'exécute automatiquement est celle de la feuille "Feuil1").

          Autre chose à tester : utiliser le débogueur. Tu fais un clic droit sur la ligne de code qui t'intéresse (par exemple la condition qui teste (5;5)) puis Basculer -> Point d'arrêt. Modifie les valeurs pour lancer macro et elle arrêtera son exécution à cette ligne là si elle y parvient, et tu pourras appuyer sur F8 pour faire de l'exécution pas à pas et voir vraiment ce qui est exécuté.

          • Partager sur Facebook
          • Partager sur Twitter
            15 octobre 2018 à 22:16:58

            j'ai essayé ce que tu m'as dis mais toujours rien, je me retrouve toujours avec le même soucis.

            J'ai constaté que les macros non automatique était défini entre guillemets comme ceci :

            Il y a t-il un rapport avec le dysfonctionnement ?

            -
            Edité par BrownM 15 octobre 2018 à 22:17:13

            • Partager sur Facebook
            • Partager sur Twitter
              16 octobre 2018 à 10:13:25

              Les guillemets simples veulent seulement dire que ça renvoie à un autre classeur Excel dont le nom contient des espaces ("Exercice CoolProp.xlsx" en l'occurence).

              Et avec le débogueur ? Tu ne rentres même pas dans la macro ? Place un point d'arrêt au début de celle-ci pour le vérifier, tu devrais rentrer dedans avec les tests à  T=-5.

              • Partager sur Facebook
              • Partager sur Twitter
                17 octobre 2018 à 19:04:10

                Alors,

                J'ai supprimé tous les modules pour n'essayer qu'avec "NégatifCinq" et je me rend compte que l'on ne rentre pas dedans.

                J'ai vérifié, que l'accent soit sur le "e" de Négatif ou non ne change pas le problème, le programme ne rentre toujours pas dans le module...

                J'avoue que je ne comprends pas pourquoi cela fonctionnait bien avant, et plus maintenant visiblement avec les mêmes codes.

                Merci d'avance pour les réponses.

                -
                Edité par BrownM 17 octobre 2018 à 19:04:55

                • Partager sur Facebook
                • Partager sur Twitter
                  18 octobre 2018 à 9:47:46

                  Utilise le bouton code </> au dessus de la zone de texte pour poster du code.

                  Et enlève quand même les accents, c'est en général déconseillé et chez moi un "é" ou un "e" ne lance pas la même macro donc c'est bien reconnu différemment par le code.

                  Où est-ce que l'exécution s'arrête ? Est-ce que tu rentres dans la première condition ? Dans la deuxième ? Quelles sont les valeurs des variables (par exemple Range("B9").Value) ? Pour voir leur valeur pendant le debug tu sélectionnes la variable que tu veux voir puis clic droit -> Ajouter un espion... -> OK.

                  Les valeurs seront affichées dans un module "Variables locales" (Affichage (dans la barre d'outils) -> Fenêtre variables locales si tu ne la vois pas).

                  Aussi est-ce que toutes les valeurs sont dans la même feuille ou tu as séparé dans des feuilles différentes ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 octobre 2018 à 9:53:13

                    J'ai finalement réussi à faire fonctionner le code pour toutes mes valeurs.

                    Après plusieurs recherches sur le web, le problème était tout simple... Je nommais mes modules de la même manière que mes fonctions...

                    Après avoir remplacer le noms des modules par "Module 1", Module 2", "Module 3", etc... tout fonctionne à merveille.

                    De plus, j'ai également appris que je pouvais placer toutes mes fonctions dans un même module... Je perdais du temps à recréer un module constamment. 

                    Stormweaker, merci beaucoup pour le temps que tu m'as accordé, cela m'a été très utile !

                    J'aimerais à l'avenir raccourcir le code. Quelqu'un a t-il une astuce avec une boucle par exemple ? Je ne vois pas très bien comment faire...

                    Bonne journée à tous.

                    -
                    Edité par BrownM 20 octobre 2018 à 16:15:34

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 octobre 2018 à 11:59:43

                      Ha c'était donc ça, je ne savais pas que ça pouvait poser problème.

                      Tu as tout mis dans le même module du coup ?

                      Crée un  nouveau sujet avec tout ton code pour le raccourcir, le problème de ce sujet est résolu :).

                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 octobre 2018 à 16:17:46

                        Exactement, j'ai tout mis dans le même module.

                        Merci encore.

                        Bonne journée.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Modification automatique de valeurs d'une cellule

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown