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 :

exécution macro sur changement valeur cellule, juste un truc qui cloche.


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    Bonjour à tous,
    je cherche à faire une macro qui s'exécute sur changement d'une cellule(de sa valeur)
    Voici le programme qui me permet de le faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub worksheet_Calculate()
    If Range("Data0!B38").Value = valcel Then
    Else:
    copier_Trend
    End If
    End Sub
     
    Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address = "Data0!$B$38" Then
        worksheet_Calculate
        Else
        valcel = Range("Data0!B38").Value
        End If
    End Sub
    Je remplis petit à petit le fichier data0 et lorsque je change la case B38 toutes les données entrées doivent etre copier et coller dans d'autres feuilles suivant des calculs et des process bien précis (macro copier_trend)!

    Pourquoi sur changement de la case B38 : parce que c'est la dernière case que je remplis dans mon fichier data0.
    SAUF que problème lorsque je change une case (n'importe qu'elle case de la feuille data0 il fait tout le processusqu'il est censé faire et donc les autres feuille ne sont pas rempli avec les bonne données.

    En gros je souhaite changer toutes les semaines les données de ma feuille data0 qui va alors grace à une macro sur changement de la dernière case , servir à remplir les autres feuilles

    Comment faire pour que le programme attende que je finisse de changer toutes les cases(dc que je change la derniere) pour continuer le process...

    Merci à vous

    pour infos
    Dans la feuille data0 il y a des formules et c'est lorsque je remplis les cases concernés par des formules qu'il exécute la macro copier_trend.
    Cela reste tout de même étrange dans la mesure où la cellule B38 n'a aucun rapport avec ces cases ni avec ces formules
    moi pas comprendre !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    bonsoir

    juste en jetant un œil je vois déjà que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Target.Address = "Data0!$B$38"
    ne pourra jamais être vrai car target.address ne renvoi que l'adresse de la feuille ou ce trouve l'instruction, c'est à dire que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Target.Address = "$B$38"
    sera vrai quand tu sera en B38

  3. #3
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Je ne comprend pas le pourquoi de cette procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub worksheet_Calculate()
    If Range("Data0!B38").Value = valcel Then
    '... <-- il manque quelque chose ici
    Else:
    copier_Trend
    End If
    End Sub
    pour cette partie de procédure ta variable valcel = rien
    donc à chaque recalcul la procédure copier_Trend est exécutée

    Si je comprend bien ce que tu veux faire, supprime le code ci-dessus et utilise celui-ci
    Code à insérer dans la feuille "Data0" : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address = "$B$38" Then copier_Trend
    End Sub

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    ben...ça marche
    merci bien !!!!!!!
    En fait j'ai utilisé cette procédure sur conseil apparemment j'ai rien compris !
    Elle est censée me permettre de tester la valeur de la cellule même lors de changement indirect.
    Je m'explique :
    Imaginons que la cellule à tester soit sur la feuil1 et qu'elle soit en fait le résultat d'un calcul utilisant des cellules d'une autre feuille feuil2 par exemple. Si je change la cellule concerné de la feuil2 alors forcément la celulle de la feuil1 également change. C'est pour prendre en compte ce type de changement que j'ai écrit cette procédure...
    voilà

  5. #5
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Citation Envoyé par laatysha Voir le message
    En fait j'ai utilisé cette procédure sur conseil apparemment j'ai rien compris !
    Si tu savais le nombre de trucs que je ne comprend pas sur une journée...

    Le principal c'est d'avoir essayé

  6. #6
    Membre émérite
    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
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut laatysha
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub worksheet_Calculate()
    If Range("Data0!B38").Value = valcel Then
    Else:
    copier_Trend
    End If
    End Sub
     
    Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address = "Data0!$B$38" Then
        worksheet_Calculate
        Else
        valcel = Range("Data0!B38").Value
        End If
    End Sub
    valcel est une variable globale ?
    Je suppose que le changement de B36 induit des calculs ?
    Pourquoi ne pas directement S'affranchir du calculate ? il est sur ordre ?

    SAUF que problème lorsque je change une case (n'importe qu'elle case de la feuille data0 il fait tout le processusqu'il est censé faire et donc les autres feuille ne sont pas rempli avec les bonne données.
    je change A1 => lancement de la macro Change qui effectue
    valcel = Range("Data0!B38").Value
    Si j'ai le calcul en automatique, la macro Calculate se lance et comme le teste mesure l'égalité de ce que je viens de faire, je lance copier_Trend
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address(0,0) = "B38" and [B38]<>"" Then
             activesheet.calculate
             call copier_Trend
        End If
    End Sub
    pas la peine de donner l'a feuille pour l'adresse, puisque c'est la macro qui ne fonctionne qui pour la feuille
    Comme je manque d'infos, j'ai ajouté une 2me condition : B38 doit contenir quelque chose. => si tu l'effaces, le traitement ne se fera pas
    Donc, si on modifie la feuille :
    si l'adresse des cellules modifiées est B38 et que celle-ci n'est pas vide
    On on effectue un calcul sur ordre de la feuille
    on lance la macro copier_Trend

    N'ayant que peu d'infos, je ne comprends pas le raisonnement qui t'as fait employer 2 macro automatiques ?!?
    Il faut que la cellule B38 soit la seule modifiée pour que tu lances ton traitement. Si tu fais un coller de plus d'une cellule comprenant la B38, le traitement ne se fera pas. si tu veux pouvoir le faire, il faudra utiliser :
    if not(intersect(target, [B38]) is nothing) Then
    si l'intersection de target et B38 n'est pas vide, alors

    Un petit conseil : quand tu utilises les macros automatiques, mets un point d'arrêt sur la ligne de titre => quand elle se lance, excel te rend la main => si tu as un déclechement non prévu, tu le vois, ce qui te permet d'éviter de te prendre la tête, puisque eça doit fonctionner, y a pas de raison". une fois que c'est bon, tu les enlèves.
    Avec ça, tu aurais vu directement ton erreur.
    Souvent, on ne pense pas au incidence du code ou de l'action initiale, et Excel fait toujours ce qu'on lui dit de faire et seulement quelques fois ce qu'on veut qu'il fasse
    A+
    EDIT : pris trop de temps et me suis fait grillé

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Points : 22
    Points
    22
    Par défaut
    Salut Gorfael merci pour tes conseils !!
    En fait je modifiais plusieurs cellules et pas que la B38 (d'un coup car je faisais carément le copier coller d'une feuille entère )
    J'ai rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not(intersect(target, [B38]) is nothing) Then
    et ça marche nickel...
    Quant à savoir d'où m'est venu ce raisonnement(de faire deux procédures) euh en fait c'est un ami qui m'a expliqué un truc mais j'ai pas dû bien capté ...
    bref ça marche
    voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim valcel as range
    Set valcel = Range"B38"
    If Not Application.Intersect(valcel, Range(Target.Address)) _
    Is Nothing Then
    copier_trend
     
    End If
    End Sub
    MERCI bien !!!!

  8. #8
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour Laatysha, Gorfael

    Ce que tu as écrit comme code est très bien est fonctionne parfaitement mais juste pour info et pour que tu puisses comprendre le code, tout ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim valcel as range
    Set valcel = Range"B38"
    If Not Application.Intersect(valcel, Range(Target.Address)) _
    Is Nothing Then
    est égale à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Target.Address = "$B$38" Then
    Le résultat est le même mais ça économise de l'encre

    Bonne journée

  9. #9
    Membre émérite
    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
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut fring, Laatysha et le forum

    Laatysha : Range(Target.Address) la plage de cellules qui a l'adresse de la plage de cellule target. c'est la même chose que Target
    Quant à savoir d'où m'est venu ce raisonnement(de faire deux procédures) euh en fait c'est un ami qui m'a expliqué un truc mais j'ai pas dû bien capté ...
    C'est l'inconvénient quand onutilise un code, un raisonnement qu'on "admet". Quand un (bon) prof fait un cours, c'est évident. Et quand on est devant l'interro...
    Même si ça fait paraître bête, ne jamais hésiter à poser des questions. L'important, c'est de comprendre. Et en "programmation", c'est essentiel. D'abord pour soi-même, mais ça oblige le "maître" à "digérer" ce qu'il explique pour trouver le moyen de le faire assimiler à l'autre. Rien n'est plus difficile à expliquer que ce qui te semble évident (ce qui est réellement évident pour toi, pas ce que tu dis être évident" ). Ton cerveau court-circuite la phase de raisonnement pour aller directement au résultat. Et la recherche du raisonnement tu fait comprendre que c'est pas si évident que ça

    fring essaie cette macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address = "$B$1" Then
        MsgBox "Bravo fring"
        Exit Sub
    End If
    If Not (Intersect(Target, [B1]) Is Nothing) Then MsgBox "c'est pas pareil"
    End Sub
    Tu sélectionnes B1, C1, puis A1 et en gardant le doigt sur shift, tu fais un tab
    A+

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

Discussions similaires

  1. Lancer une macro sur changement de valeur cellule
    Par maximilien59 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/01/2012, 11h10
  2. Lancer une macro sur changement de valeur cellule
    Par reyzilin dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 13/12/2011, 17h57
  3. Macro sur changement valeur cellule?
    Par jojo86 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/02/2010, 07h00
  4. lancer macro si changement valeur cellule + condition
    Par tikam75007 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 07/11/2009, 12h25
  5. [VBA-E]Lancer une macro sur changement de valeur cellule ?
    Par jeremiegrenoble dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/03/2006, 14h22

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