Macro pour éviter des ref circulaires

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

chasseur44

XLDnaute Occasionnel
Bonjour à tous
J'ai un problème de syntaxte pour faire une macro sur un petit fichier. je souhaite modifier des formules selon un critères !
ce critère est positionné ds une cellule mais je n'arrive pas à modifier ma macro quand la valeur change
Tout est dans la PJ
Merci de votre aide
 

Pièces jointes

Re : Macro pour éviter des ref circulaires

Bonjour chasseur44,

Votre affaire ne va pas.

Il est clair que si l'on entre des formules dans la plage E7:F29, les valeurs qui s'y trouvent seront écrasées...

La solution est une macro évènementielle Worksheet_Change sur cette plage :

- si l'on entre une valeur en colonne E => la cellule en colonne F sera calculée

- si l'on entre une valeur en colonne F => la cellule en colonne E sera calculée.

Les 2 boutons d'options ne servent strictement à rien.

A+
 
Re : Macro pour éviter des ref circulaires

Re,

La macro dans le code de la feuille (clic droit sur l'onglet et Visualiser le code) :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If [Total].Row < 8 Then Exit Sub
Dim plage As Range
Set plage = Range("E7:F" & [Total].Row - 1)
Set Target = Intersect(Target, plage)
If Target Is Nothing Then Exit Sub
On Error Resume Next 'sécurité
Application.EnableEvents = False 'désactive l'action des évènements
For Each Target In Target 'si plusieurs valeurs sont entrées simultanément
  If Target.Column = plage.Column Then
    Target.Offset(, 1) = IIf(Target = "", "", Target / Target.Offset(, -1))
  ElseIf Target.Column = plage.Column + 1 Then
    Target.Offset(, -1) = IIf(Target = "", "", Target * Target.Offset(, -2))
  End If
Next
Application.EnableEvents = True
End Sub
Fichier joint.

Noter le nom défini Total.

A+
 

Pièces jointes

Re : Macro pour éviter des ref circulaires

Re,

Une amélioration, pour répercuter en colonnes E et F les modifications faites en colonne D :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If [Total].Row < 8 Then Exit Sub
Dim plage As Range
Set plage = Range("D7:F" & [Total].Row - 1)
Set Target = Intersect(Target, plage)
If Target Is Nothing Then Exit Sub
On Error Resume Next 'sécurité
Application.EnableEvents = False 'désactive l'action des évènements
For Each Target In Target 'si plusieurs valeurs sont entrées simultanément
  If Target.Column = plage.Column Then 'colonne D
     Application.EnableEvents = True
     Target.Offset(, 1) = Target.Offset(, 1) 'pour recalcul des cellules
     Application.EnableEvents = False
  ElseIf Target.Column = plage.Column + 1 Then 'colonne E
    Target.Offset(, 1) = IIf(Target = "", "", Target / Target.Offset(, -1))
    If Target.Offset(, -1) = 0 Then Target.Offset(, 1) = ""
  ElseIf Target.Column = plage.Column + 2 Then 'colonne F
    Target.Offset(, -1) = IIf(Target = "", "", Target * Target.Offset(, -2))
  End If
Next
Application.EnableEvents = True
End Sub
Fichier (2).

A+
 

Pièces jointes

Re : Macro pour éviter des ref circulaires

Bonjour chasseur44,

Si vous avez du mal à comprendre cette ligne qu'est-ce que ce doit être pour le reste 🙂

Si le numéro de ligne de la cellule nommée "Total" est inférieur à 8 on sort de la macro...

[Total] c'est la même chose que Range("Total").

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
XL 2021 Macro
Réponses
6
Affichages
315
Réponses
9
Affichages
508
Retour