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 :

Mise à jour instantanée du résultat d'une macro [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juillet 2008
    Messages : 50
    Points : 34
    Points
    34
    Par défaut Mise à jour instantanée du résultat d'une macro
    Bonjour tout le monde !

    J'ai fabriqué une très jolie macro qui me donne des valeurs de poids en fonction d'autres valeurs entrées dans plusieurs autres feuilles Excel. Le but du fichier, c'est de pouvoir comparer plusieurs cas en faisant varier certaines valeurs, donc j'aurais besoin que les cases données par la macro se mettent à jour automatiquement dès que je modifie une des cases "source".

    Y a-t-il moyen de faire ça ? Sachant que la macro n'est pas lourde du tout, donc que ça ne me dérange pas qu'elle tourne entièrement à chaque fois qu'on modifie une valeur.

    Merci !

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Bonjour je te renvoi vers les tutoriels du site. Le tutoriel évènement de la feuille de calcul, plus précisément l'évènement worksheet change
    voir ici http://excel.developpez.com/cours/?page=prog#evenement
    Pour tester la plage
    de changement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if not intersect(target,range("Taplage")) is nothing then
    'ton code
    end if
    end sub

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juillet 2008
    Messages : 50
    Points : 34
    Points
    34
    Par défaut
    Merci pour ton aide. J'ai trouvé ce qui semble correspondre dans le lien que tu m'as donné, mais je n'arrive pas à comprendre comment marche cette procédure. Mon essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Change(ByVal Target As Range)
        CalculMasse()
    End Sub
    CalculMasse est la procédure qui doit avoir lieu quand on modifie une cellule de la feuille. Mais à mon avis, ce n'est pas du tout comme ça que ça marche... Dans l'aide de VBA, je n'ai pas cette procédure, par contre j'ai quelque chose qui s'appelle Workbook_SheetChange. Je n'arrive pas à comprendre non plus comment elle marche. Pour info, l'exemple qu'ils donnent est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Workbook_SheetChange(ByVal Sh As Object, _
            ByVal Source As Range)
        ' runs when a sheet is changed
    End Sub
    Si tu avais des précisions, ça m'aiderait beaucoup...

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    essaye
    Tu met le code dans le code de l'onglet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Change(ByVal Target As Range)
        CalculMasse
    End Sub
    A chaque changement la macro s'execute et apelle ta macro masse (que tu devrais déclarer en public)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public sub calculmasse()
    'ton code
    end sub
    Ensuite tu peux effectuer un test entre sur la position du changement avant de lancer ta macro.

    ps : la deuxième solution va se déclencher en cas de changement surn'importe quelle feuille.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juillet 2008
    Messages : 50
    Points : 34
    Points
    34
    Par défaut
    J'ai essayé ça, ça marche dans le sens où quand je modifie quelque chose dans la feuille, il commence à exécuter la procédure, le problème c'est qu'il se bloque sur une instruction Next, et qu'il n'avance plus... Donc ça me bloque tout.

    Ca vient peut-être du fait que la macro est également dans la page de l'onglet (elle ne s'applique qu'à lui, j'en aurai d'autres équivalentes pour les autres feuilles), mais j'en doute...

    A tout hasard, voilà le code de la feuille en entier :

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Option Explicit
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        CalculMasse
    End Sub
     
     
    Public Sub CalculMasse()
     
        'Calcule la masse de batteries nécessaire au bon fonctionnement du cas.
        'Raisonnement par dichotomie : on pose minf = 0, msup = 1000, et on teste
        'si ça peut marcher avec la masse mbatt qui vaut (minf + msup)/2.
        'Si OK, on peut réduire le poids de batteries, donc on pose msup = mbatt.
        'Si pas OK, il faut augmenter le poids de batteries, donc minf = mbatt.
        'Puis on repose mbatt = (minf + msup)/2, et on recommence jusqu'à ce que
        'l'écart entre minf et msup soit < à 0.001. On a alors la bonne masse.
     
        '''Déclarations
        Dim minf As Single, msup As Single, mbatt As Single         'Masses de batteries (encadrement inf, sup, et moyenne)
        Dim Evoy As Single                                          'Energie nécessaire à un voyage
        Dim N1 As Integer, N2 As Integer, N3 As Integer             'Nombre de trajets avant pause 1, avant pause 2, et avant la nuit
        Dim t1 As Single, t2 As Single                              'Temps des pauses 1 et 2
        Dim Eps1 As Single, Eps2 As Single                          'Energie chargée par les panneaux solaires lors des pauses 1 et 2
        Dim Earret1 As Single, Earret2 As Single                    'Energie dépensée à l'arrêt pendant les pauses 1 et 2 (chauffage...)
        Dim Espec As Single, Pspec As Single, Pmax As Single        'Energie spécifique, puissance spécifique de charge, puissance max disponible à quai
        Dim ProfDech As Single, MargeVieil As Single                'Profondeur de décharge, Marge de vieillissement
        Dim MyCell As Range                                         'Cellule qui servira pour les calculs
        Dim Edep1 As Single, Edep2 As Single, Edep3 As Single       'Energie dépensée pendant tronçons 1, 2 et 3
        Dim Echarg1 As Single, Echarg2 As Single                    'Energie chargée pendant les pauses 1 et 2
     
        '''Initialisations
        Evoy = Range("B38").Value
        N1 = Range("B4").Value
        N2 = Range("B8").Value
        N3 = Range("B12").Value
        t1 = Range("B6").Value
        t2 = Range("B10").Value
        Eps1 = t1 * Worksheets("Données").Range("B68").Value
        Eps2 = t2 * Worksheets("Données").Range("B68").Value
        Earret1 = t1 * Worksheets("Données").Range("B33").Value
        Earret2 = t2 * Worksheets("Données").Range("B33").Value
        Espec = Range("C50").Value
        Pspec = Range("C55").Value
        Pmax = Range("B45").Value
        ProfDech = Worksheets("Données").Range("J33").Value
        MargeVieil = Worksheets("Données").Range("J31").Value
     
        '''Calcul de la masse
        For Each MyCell In Range("B85:E87").Cells
            minf = 0                                                'Initialisation des masses inf et sup pour la dichotomie
            msup = 1000
            Espec = MyCell.Offset(-36, 0).Value
            Pspec = Cells(55, MyCell.Column).Value
            Do While msup - minf > 0.001
                mbatt = (minf + msup) / 2
                Edep1 = N1 * Evoy
                Echarg1 = Min(Pmax * t1 + Eps1 - Earret1, Edep1, mbatt * Pspec * t1)
                Edep2 = N2 * Evoy
                Echarg2 = Min(Pmax * t2 + Eps2 - Earret2, mbatt * Pspec * t1, Edep2 + Edep1 - Echarg1)
                Edep3 = N3 * Evoy
                If (Edep1 <= ProfDech * mbatt * Espec) And _
                   (Edep1 - Echarg1 + Edep2 <= ProfDech * mbatt * Espec) And _
                   (Edep1 - Echarg1 + Edep2 - Echarg2 + Edep3 <= ProfDech * mbatt * Espec) Then
                    msup = mbatt
                Else
                    minf = mbatt
                End If
                If minf >= 500 Then
                    MsgBox "La quantité de batteries nécessaire est supérieure à 500 tonnes. Vérifiez vos données d'entrée."
                End If
            Loop
     
            mbatt = 1 / (1 - MargeVieil) * mbatt
            MyCell.Value = mbatt
        Next
     
    End Sub

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each MyCell In Range("B85:E87")
    'blablabla
    next MyCell
    Sinon quel est l'erreur qu'il te fait?
    ps: pas sur de pouvoir répondre longtemps si quelqu'un veut prendre le relais

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juillet 2008
    Messages : 50
    Points : 34
    Points
    34
    Par défaut
    Pour la partie de code, avec Range("B85:E87").Cells ou Range("B85:E87") ça ne change rien pour la procédure seule.

    En rajoutant le bout de code pour actualiser dès qu'il y a modification, il ne se passe pas la même chose :
    • avec Range("B85:E87").Cells il calcule la première cellule, puis s'arrête au Next (d'après le débogage, quand j'ai fait Echap pour interrompre l'exécution)
    • avec Range("B85:E87") il calcule toutes les cellules, puis s'arrête sur le Next


    Dans les 2 cas, quand je dis qu'il s'arrête sur le Next, je veux dire que malgré que le calcul qu'il effectue soit fini, l'ordinateur continue à "réfléchir", jusqu'à ce que je fasse Echap pour interrompre l'exécution. Et à ce moment, quand je clique sur Débogage, il me dit qu'il en était sur le Next.

    Dans le deuxième cas, apparemment, il réussit à faire tous les calculs (toutes les cellues sont modifiées, et pourtant il plante quand même... En tout cas ce n'est pas un problème de convergence de l'algorithme, là-dessus, pas de souci.

    Si quelqu'un a la moindre idée de ce qu'il se passe...

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Donc il ne plante pas il mouline. Grosse différence

    Pour ton problème
    essaye le mode pas a pas ou avec des pause et regarde un peu comment cela évolue.

    Ou alors met un fichier exemple ca peut valoir le coup si vraiment tu n'y arrive pas met essaye, je risque de ne pas pouvoir continuer la discution et certain risque de ne pas l'ouvrir

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je pense connaître la raison de ce problème. J'ai eu ce cas il n'y a pas très longtemps et je ne me souviens plus comment je l'ai solutionné, et pourtant je l'ai solutionné !!!

    Comme je n'ai pas le temps de rechercher maintenant, peut-être que cette réponse mettra quelqu'un sur la voie, peut-être Krovax.

    Lorsque ces lignes de code sont exécutées dans la procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mbatt = 1 / (1 - MargeVieil) * mbatt
    MyCell.Value = mbatt
    Next
    Le fait d'avoir modifié la cellule avec la valeur de "mbatt" c'est la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Change(ByVal Target As Range)
        CalculMasse
    End Sub
    qui est relancée puis qui relance la procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Sub CalculMasse()
    à son début et donc "boucle infinie" car les variables sont réinitialisées.

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Effectivement jacques jean on tourne en boucle.

    Commence ta macro par
    appliction.EnableEvents = False
    met le à true la fin
    et je te conseil une gestion d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Worksheet_Change(ByVal Target As Range)
    on error goto gest
    appliction.EnableEvents = False
        CalculMasse
    gest::
    appliction.EnableEvents = True
    msgbox "Erreur numéro : " & Err.Number & Chr(13) & "Description : " & Err.Description
    End Sub

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juillet 2008
    Messages : 50
    Points : 34
    Points
    34
    Par défaut
    Merci beaucoup à tous les deux, ça marche impec' !

    Par contre Krovax, je ne comprends pas la partie gestion d'erreurs : à quoi sert-elle ? Et comment est-elle implémentée ?

    (Et au passage, le Ch(13), il te permet d'aller à la ligne, mais il fait quoi normalement ?)

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/12/2013, 14h29
  2. [XL-2003] Mise à jour d'un module avec une macro
    Par Alain69140 dans le forum Contribuez
    Réponses: 0
    Dernier message: 23/03/2013, 10h00
  3. [XL-2003] Mise à jour des résultats d'une macro
    Par martinmacfly dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/12/2009, 15h44
  4. Mise à jour de données à partir d'une autre table
    Par rsc dans le forum Langage SQL
    Réponses: 7
    Dernier message: 05/04/2006, 10h53
  5. Probleme de mise à jour et de modification d'une base
    Par flambo88 dans le forum Requêtes
    Réponses: 17
    Dernier message: 07/12/2005, 14h27

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