Executer une macro suite à un calcul avec worksheet calculate
#1
Aspirant XLPages

Inscription: 03/06/2010

Messages: 21

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 08-06-2010 14h32
Bonjour à tous,


Je reviens à la charge avec mes questions de débutant ;)


Suite à un calcul, la valeur de la cellule C1 de la feuille "Feuil1" est modifiée.
Lorsque cette cellule est modifiée, le code ci dessous affiche un message: "coucou" ;)

Ce que je voudrai faire, c'est qu'à la place du message sympathique "coucou" se lance une Macro.

J'ai essayé de remplacer Msgbox par Call Macro1, application.run "macro1" et d'autres syntaxes, la macro se lance mais un message d'erreur apparait et fait planter Excel:
"la méthode select range a échoué" ou "espace pile insuffisant" etc.

Quelle ligne de code faudrait-il mettre à la place de Msgbox pour lancer une Macro?

Cette fonction semble etre très utile pour détecter le changement de valeur d'une cellule suite à un calcul, apparemment avec la fonction Target ça ne marche pas, sauf si on modifie la cellule manuellement, ce qui n'est pas le cas ici.



Public ValPrec

Private Sub Worksheet_Calculate()
  Verif
End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  If Intersect(Target, Range("c1")) Is Nothing Then Exit Sub
  Verif
End Sub

Private Sub Verif()
  If VarType(Range("c1")) = VarType(ValPrec) Then _
    If ValPrec = Range("c1") Then Exit Sub
  MsgBox "coucou"
  ValPrec = Range("c1")
End Sub


Private Sub Workbook_Open()
  Feuil1.ValPrec = Feuil1.Range("c1")
End Sub

Merci à tous pour votre aide!

Hors Ligne
Rapport   Haut 

Re: Executer une macro suite à un calcul avec worksheet calculate
#2
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 08-06-2010 15h43
Bonjour lunebleue91, Mireille, Didier, le forum,

J'ai modifié le code présenté ainsi :

' Cette directive est requise dans tous les modules.
Option Explicit

' Même si une variable sans type est dimensionnée en
' Variant par défaut, l'indiquer clairement dans le
' code n'est pas un luxe.
Public ValPrec As Variant

Private Sub Worksheet_Calculate()

  Verif
 
End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

  ' On n'utilise Exit Sub que très parcimonieusement pour des raisons
  ' de clarté dans le code. D'ordinaire on s'arrange pour éviter
  ' de multiples points de sortie de procédure. Certaines conventions
  ' de codage les interdisent carrément. Je souscris à ces conventions.
  ' Voir Sub Verif() sur le même sujet.
 
'  If Intersect(Target, Range("c1")) Is Nothing Then Exit Sub
 
  ' On élimine Exit Sub en modifiant Si Est Rien Alors Sortie
  ' par Si Non Est Rien Alors Exécution.
  If Not Intersect(Target, Range("c1")) Is Nothing Then
 
    Verif
   
  End If
 
End Sub

Private Sub Verif()
 
  ' Le code suivant, assez bancal, a été modifié
'  If VarType(Range("c1")) = VarType(ValPrec) Then _
'    If ValPrec = Range("c1") Then Exit Sub

  ' Logique dépoussiérée : Si Condition1 Alors Si Condition2 Alors Sortie Sinon Exécution
  ' remplacée par Si Condition1 et Non Condition2 Alors Exécution.
  ' Cette formulation élimine Exit Sub et rend le code plus lisible
  ' en plus de quelques autres problèmes potentiels.
 
  If VarType(Range("c1")) = VarType(ValPrec) And Not (ValPrec = Range("c1")) Then
   
    ' Ici on passe la main à la procédure ExecutionC1 du module modProc
    modProc.ExecutionC1
   
    ValPrec = Range("c1")

  End If
 
End Sub


Private Sub Workbook_Open()

  Feuil1.ValPrec = Feuil1.Range("c1")
 
End Sub
 

À noter que l'écriture originale de la portion de code
If VarType(Range("c1")) = VarType(ValPrec) Then _
    If ValPrec = Range("c1") Then Exit Sub
relève de la méthode Perlinpinpin. Prenons par exemple le code suivant :
Sub Perlinpinpin()

  If Contition1 Then If Condition2 Then If Condition3 Then Execution

End Sub
 
La ligne de code porte trois (3) If et aucun End If!

Si nous développons cette ligne en :
Sub Perlinpinpin()

  If Contition1 Then
    If Condition2 Then
      If Condition3 Then Execution

End Sub
 
Tout semble identique. Pas du tout. La première ligne compilera sans problèmes justement parce que composée d'un trait, sans passage à la ligne. Dans le second exemple les passages à la ligne provoquent une erreur à la compilation parce qu'il manque des fins de conditionnelle (End If).

Noter dans le code original le caractère de soulignement "_" à la fin de la ligne :
If VarType(Range("c1")) = VarType(ValPrec) Then _
Ce caractère simule une ligne continue. S'il était manquant le codeur mettrait inutilement un temps précieux à dé-Perlinpinpiner ce code.

Avant de poursuivre il est tout à fait indiqué de lire le document suivant : Cours Excel VBA

Cordialement,

Guy



Edité par Guy le 08/06/2010 21:05:35

Hors Ligne
Rapport   Haut 

Re: Executer une macro suite à un calcul avec worksheet calculate
#3
Aspirant XLPages

Inscription: 03/06/2010

Messages: 21

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 08-06-2010 16h20
Bonjour,

merci d'avoir pris le temps d'expliquer toutes les étapes et d'avoir corrigé le code!

Si je te suis bien, il va falloir créer à présent à la suite de ton code, un module Modproc qui va permettre au programme d'ouvrir la macro voulu?

Comme tu le vois, je suis un grand débutant, ton lien est très bien mais il va falloir des semaines pour aborder tout ça. Je compte bien le faire car c'est très intéressant et on évite aussi comme ça d'embeter tout le monde :):)

Merci encore pour ta disponibilité!


Hors Ligne
Rapport   Haut 

Re: Executer une macro suite à un calcul avec worksheet calculate
#4
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 08-06-2010 16h34
Oups,

Désolé j'ai oublié le code pour l'exécution :

Option Explicit

Public Sub ExecutionC1()

  ' Placer ici le code à exécuter en lieu et place du message "coucou"
 
  MsgBox "Coucou"

End Sub
 
Le nom du module portant ce code doit être modProc.

Si tu laisses le nom par défaut, Module1 par exemple, il suffira de corriger en conséquence l'appel de la procédure.

Cordialement,

Guy

Hors Ligne
Rapport   Haut 

Re: Executer une macro suite à un calcul avec worksheet calculate
#5
Aspirant XLPages

Inscription: 03/06/2010

Messages: 21

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 08-06-2010 17h40

merci pour la suite ;)

cependant, désolé pour le niveau de mes questions, mais comment faire pour que le nom du module porte le nom modProc?

doit-on écrire:
Private sub modProc()?
puis la fin de ton code?

Ou alors, pourrais tu poster l'intégralité du code s'il te plait?
ça sera un peu plus simple pour moi ;)
Car là, il me met "erreur de compilation, variable non définie" pour modProc.

Encore désolé et merci pour ta patience!

Hors Ligne
Rapport   Haut 

Re: Executer une macro suite à un calcul avec worksheet calculate
#6
Aspirant XLPages

Inscription: 03/06/2010

Messages: 21

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 08-06-2010 17h46
et puis aussi dernière petite requete, que dois-je mettre à la place de Msgbox "coucou" pour lancer la "macro1", simplement call "macro1" par exemple?

merci encore ;)
Hors Ligne
Rapport   Haut 

Re: Executer une macro suite à un calcul avec worksheet calculate
#7
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 08-06-2010 18h42
Bonjour,

Effectivement j'ai forcé un peu avec le nom complet des procédures.

Quel que soit le nom du module il suffit de poser ExecutionC1 au lieu de modProc.ExecutionC1.

Citation :

et puis aussi dernière petite requete, que dois-je mettre à la place de Msgbox "coucou" pour lancer la "macro1", simplement call "macro1" par exemple?


Non. La procédure ExecutionC1 est là pour recevoir le code que tu veux exécuter. Suffit d'effacer MsgBox "Coucou" et de remplacer par le code que tu désires.

Petit classeur joint.

Cordialement,

Guy


Pièce jointe:
xls Classeur exemple.xls   [ Taille: 25.00 Ko - Téléchargements: 723 ]

Hors Ligne
Rapport   Haut 

Re: Executer une macro suite à un calcul avec worksheet calculate
#8
Aspirant XLPages

Inscription: 03/06/2010

Messages: 21

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 08-06-2010 19h11
Merci pour le fichier ;)

Mais désolé, ça ne semble pas fonctionner...
En fait, le code tel quel du fichier joint n'affiche plus la fenetre "coucou" lorsque C1 est modifié.


J'ai fait un test (juste pour voir) en remplaçant cette ligne de code:

If VarType(Range("c1")) = VarType(ValPrec) And Not (ValPrec = Range("c1")) Then

par l'ancienne et la fenetre "coucou" réapparait bien à chaque modification de C1.

Avec ce code modifié, par contre toujours le meme probleme du lancement de la macro, dans le module modproc, lorsque je remplace Msgbox par Macro1:

Option Explicit

Public Sub ExecutionC1()

  ' Placer ici le code à exécuter en lieu et place du message "coucou"
 
  macro1 'Ou call macro1

End Sub



les messages de bug réapparaissent et je retourne au meme point qu'au premier message :(

Première question: peux tu tester le fichier que tu m'as joint pour voir si ça marche chez toi et que tu vois la fenetre "coucou" s'afficher à chaque changement de C1?

Seconde question: qu'elle est la ligne de commande exacte qu'il faut marquer à la place de Msgbox pour lancer une macro dont le lom est "Macro1"?


merci infiniment pour ta patience!

cordialement


Hors Ligne
Rapport   Haut 

Re: Executer une macro suite à un calcul avec worksheet calculate
#9
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 08-06-2010 19h27
Re-bonjour,
  1. Effectivement il y avait une petite embrouille dans le code fourni. Classeur de nom identique qui devra écraser le précédent en pièce jointe.
  2. Il ne sert à rien d'appeler Macro1, il suffit de coller le code de Macro1 à la place de MsgBox "Coucou". D'où la note en commentaire :
    Public Sub ExecutionC1()

      ' Placer ici le code à exécuter en lieu et place du message "coucou"
     
      MsgBox "Coucou"

    End Sub
Cordialement,

Guy

Pièce jointe:
xls Classeur exemple.xls   [ Taille: 27.00 Ko - Téléchargements: 698 ]

Hors Ligne
Rapport   Haut 

Re: Executer une macro suite à un calcul avec worksheet calculate
#10
Aspirant XLPages

Inscription: 03/06/2010

Messages: 21

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 08-06-2010 20h19
Re ;)

merci encore, mais malheureusement il ne se passe toujours rien quand on modifie C1 :(
La fenetre ne s'affiche pas...

ça marche bien chez toi?


cordialement ;)




Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes