Rapport de message :*
 

Re: Executer une macro suite à un calcul avec worksheet calculate

Titre du sujet : Re: Executer une macro suite à un calcul avec worksheet calculate
par Guy le 08/06/2010 15:43:34

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