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 :

Alternative aux references circulaires?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 192
    Par défaut Alternative aux references circulaires?
    Bonjour a tous,

    Je m'en remet à la communauté car cela fait une bonne quinzaine de jours que je me prend la tete avec un probleme de reference circulaire.

    JE vous explique:

    A1.....10000
    B1.....10000
    C1..... (l'apport)
    D1.....=somme(A1:C1) (les rentrées d'argent)

    F1.....15000
    G1.....15000
    H1.....=F1+G1 (les sorties d'argent)
    I1.....=D1-H1 (le résultat)
    J1.....=si(I1<0;I1;0)

    Le but du jeu est que J1 soit toujours égal à 0.J'ai donc pensé qui si J1 est <0, je recopie la valeur de J1 dans C1 est la somme me donnera 0.
    Pour etre plus clair, si le résultat (les rentrées - les sorties) est négatif, faire un apport (C1) pour que le résultat soit égal à 0.
    J'ai donc été confronté aux references circulaires qui, quelles que soient le nombre d'itérations et d'ecart maximal, me donnent des résultats complètement farfelus.
    Ayant quelques connaissances en vba (mais plutot pour access), je me suis demandé s'il n'étais pas possible d'écrire un truc du genre:

    -laisser le calcul se faire en laissant C1 vide,
    -si J1 est négatif, recopier sa valeur dans C1,
    -redemmander le calcul de la feuille.

    Mais si je met ce genre de truc sur l'evenement "apres mise à jour" d'une cellule, je suppose que je vais tourner en rond.

    Quelqu'un d'entre vous aurait-il déja été confronté à ce genre de probleme?
    A votre avis quelle est la meilleure solution?

    Merci d'avance à tous pour votre aide.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut santacrus et le forum
    Mais si je met ce genre de truc sur l'evenement "apres mise à jour" d'une cellule, je suppose que je vais tourner en rond.
    oui! Pour éviter ça tu as plusieurs possibilités :
    Tu crées une variable globale que tu testes en entrée => si elle est à True => Tu sors et tu la mets à true juste après et à False quand tu as fini tes opérations.

    Autre possibilité : tu utilises l'instruction "Application.EnableEvents" à False en entrée et True en sortie, mais ça nécessite une gestion des erreurs et une sortie unique de la macro : une erreur provoquera un arrêt de la macro et un sortie, sans remettre à True la gestion des évènements, sauf si tu obliges excel, même en cas d'erreur, à repasser sur "Application.EnableEvents=true"
    A+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 192
    Par défaut
    Salut Gorfael et merci du coup de main!

    Pourrais tu m'en dire un peu plus sur la première solution? Je comprend le principe mais bloque sur la mise en oeuvre.
    Je continue néanmoins à chercher de mon coté sur le forum.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut santacrus et le forum
    Chaque fois qu'on met un nombre en A1, on l'augmente de 1. Facile comme programme, non ?
    Sauf que si je touche à la feuille, ça relance la macro qui aumente de 1, qui relance la macro, etc...
    Les deux solutions que je propose sur la feuille macro liée à la feuille :
    Première solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Explicit
    Dim Flag As Boolean
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0) <> "A1" Then Exit Sub
    If Flag Then Exit Sub
    Flag = True
    [A1] = [A1] + 1
    Flag = False
    End Sub
    Un point d'arrêt sur le titre de la macro permettra de la suivre pas à pas avec <F8>
    Deuxième solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Err1
    If Target.Address(0, 0) <> "A1" Then Exit Sub
    Application.EnableEvents = False
    [A1] = [A1] + 1
    Sortie:
    Application.EnableEvents = True
    Exit Sub
    Err1:
    MsgBox Err.Description, vbCritical + vbOKOnly, "ERREUR EXCEL N°" & Err.Number
    Resume Sortie
    End Sub
    Même méthode de test

    Dans la première solution, le curseur VBA (surlignage) saute de la ligne de modification de A1 au début de la macro qu'il n'effectue que jusqu'au test de la variable flag, avant de finir la première instance de la macro. La deuxième instance de la macro est lancée par la modification de A1, mais avortée par la variable qui est à True

    Dans la seconde solution, on a qu'une seule instance de la macro, puisqu'on interdit la gestion des évènement.
    A+
    PS : étant feignant je n'ai pas commenté d'aussi simples macros, mais si ça nécessite des explications complémentaires, les demander

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 192
    Par défaut
    Houlala!!!!
    J'en attendait pas tant!

    Je viens d'essayer ca marche au poil!
    Je vais étudier ca dans le détail

    Merci beaucoup Gorfael

  6. #6
    Expert confirmé
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Par défaut
    Hello,

    Contrairement à ton cas apparement, parfois les références circulaires sont nécessaires et dans ce cas :
    Outils/Options/Calcul
    cocher Itérations.


Discussions similaires

  1. alternatives aux curseurs sans succès
    Par maxtin dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 21/09/2006, 14h15
  2. Alternative aux sockets
    Par rezuss dans le forum Langage
    Réponses: 2
    Dernier message: 08/08/2006, 14h06
  3. alternatives aux propriétés filter sous mozilla
    Par rol666 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 29/08/2005, 19h23
  4. [Applet] alternative aux applets
    Par topaze dans le forum Applets
    Réponses: 18
    Dernier message: 09/12/2004, 16h03

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