macro évenementielle tourne en boucle

  • Initiateur de la discussion Initiateur de la discussion fifi
  • Date de début Date de début

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 !

fifi

XLDnaute Occasionnel
Bonjour 🙂

j'ai un petit pb de macro qui tourne en boucle 😀

j'aimerai que suite à la modification des champs d'un TCD (plage A6:B12)
ma macro qui remet en forme le tableau ansi que toute la feuille, s'execute...
mais le pb c'est que cela tourne en boucle 🙁

un exempl du code que j'ai testé , et qui tourne en boucle :/


Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Application.ScreenUpdating = False
Application.DisplayAlerts = False

If Not Application.Intersect(Target, Range("a6:B12")) Is Nothing Then
call mise_en_forme
End If

end sub



merci de me dire si peux arreter de me mordre la queue par un quelconque moyen..
 
Re : macro évenementielle tourne en boucle

Bonsoir fifi

tu peux placer le code ci dessous avant et apres le lancement de ta macro "mise en forme" ca doit éviter de déclancher l'evenement selectionchange généré par cette macro.

Code:
Application.EnableEvents = False
call mise_en_forme
Application.EnableEvents = true

Si ca ne va pas met ton fichier en pièce jointe, ce sera plus facile pour détecter les anomalies.

Bonne soirée
@+
 
Re : macro évenementielle tourne en boucle

une methode est la suivante

1) declaration en variable publique d'un booleen ex : noevent
Public noevent As Boolean

2) ensuite
au debut de misenforme
noevent=True

a la fin
noevent=False

3) au debut de Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

if not noevent

.....
end if

mais il doit y en avoir d'autres
 
Re : macro évenementielle tourne en boucle

fifi à dit:
Bonjour 🙂

j'ai un petit pb de macro qui tourne en boucle 😀

j'aimerai que suite à la modification des champs d'un TCD (plage A6:B12)
ma macro qui remet en forme le tableau ansi que toute la feuille, s'execute...
mais le pb c'est que cela tourne en boucle 🙁

un exempl du code que j'ai testé , et qui tourne en boucle :/


Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Application.ScreenUpdating = False
Application.DisplayAlerts = False

If Not Application.Intersect(Target, Range("a6:B12")) Is Nothing Then
call mise_en_forme
End If

end sub



merci de me dire si peux arreter de me mordre la queue par un quelconque moyen..
Salut à tous
Bien joué callaghan
je suppose que ta macro mise_en_forme use et abuse de select ou Activate ?

Tu utilises une macro evénementielle => Application.EnableEvents = False souvent nécessaire : Elle bloque les événements tant que l'instruction Application.EnableEvents = True n'est pas rencontrée, et évite au serpent de se mordre la queue

Par contre, j'espère pour toi que tu fais un minimum de gestion d'erreur, surtout avec l'emploi de DisplayAlerts

Si excel rencontre une erreur => il sort directement de l'endroit où le pointeur de ligne macro se trouve pour mettre un message et faire un End Sub
Si tu as executer un DisplayAlerts = false, tant que tu ne fermes pas Excel (pas le fichier en cours, l'application complête) tu ne le sauras pas, puisse qu'Excel est en grêve et ne te retourne aucun message d'alerte 🙂
Alors, soit tu fais une gestion d'erreur avec une remise en route des gestions écran, alerte et événements,
soit tu te prépares à t'acheter une perruque pour camoufler tous les cheveux que tu vas t'arracher
A+
 
Re : macro évenementielle tourne en boucle

euh 🙂
j'ai certe pas mal de chose à faire dans la macro "Mise_en_forme" qui peuvent être amélioré niveau languistique VB 🙂

mais ca passe sans probléme 😀 (je met le code de la mise à jour si ca peut interesser..

sinon concernant le code fourni pour ,j'en a fait ca mais ca marche pas :x
Enfin ca marche uniquement quand je clique dans les cellule concernée et pas lorsque je change les champs du TCD 🙁 via les listes déroulantes du TCD
en A6.B12.


Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Application.ScreenUpdating = False
Application.DisplayAlerts = False

If Not Application.Intersect(Target, Range("A6:B12")) Is Nothing Then
Application.EnableEvents = False
Call Tranche_TCD
Application.EnableEvents = True
End If
End Sub





----------------------------------------------------------------------------------
Sub Mise_en_forme()

On Error Resume Next
Application.ScreenUpdating = False
'''''''''''''''''''''''''''''''''''''''''Mise à jour du TCD
ActiveSheet.PivotTables("TDC_tranche").PivotCache.Refresh
ActiveSheet.PivotTables("TDC_tranche").PivotSelect "",
'''''''''''''''''''''''''''''''''''''''Format du TCD

xlDataAndLabel, True
ActiveSheet.PivotTables("TDC_tranche").Format xlReport6


''''''''''''''''''''''''''''''''''''''''format des colonnes
Columns("C:CM").ColumnWidth = 5
Dim col, I As Variant
For I = 13 To 60
If Cells(7, I) = 0 Then Columns(I).Hidden = True
Next I


'''''''''''''''''''''''''''''''''''''''format des champ du TDC (saleté de texte qui se met en écriture vertical à chaque rafraichissement du TCD)

Range("A6").Copy
Range("A6:B12").Select
Range("B6").Activate
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False

''''''''''''''''''''''''''''''''orientation des cellules du TCD

ActiveSheet.PivotTables("TDC_Tranche").PivotSelect "", xlDataAndLabel, True
With Selection
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With


''''''''''''''''''''format de ligne de champ du TDC à mettre verticales
Range("INTITULE").Select 'intitule = ligne 13:13
With Selection
.Orientation = 90
End With

Range("A7:B11").Select
With Selection
.HorizontalAlignment = xlLeft
End With


''''''''''''''''''''''''''''''''''''''réécritures des entéte de colonne du TDC
Rows("6:6").UNMERGE

Dim R1, P1, I1, M1, C1 As Variant
R1 = Range("IV1")
P1 = Range("IV2")
I1 = Range("IV3")
M1 = Range("IV4")
C1 = Range("IV5")

Cells(6, R1).Select
Cells(6, R1)= "RECEPTION"
With Selection.Interior
.ColorIndex = 6
.Pattern = xlSolid
.Value = "RECEPTION"
'End With
'Range(Cells(6, R1), Cells(6, R1 + 10)).Merge

Cells(6, P1) = "PARAGE"
Cells(6, P1).Select
With Selection.Interior
.ColorIndex = 3
.Pattern = xlSolid

End With
Range(Cells(6, P1), Cells(6, P1 + 11)).Merge

Cells(6, I1) = "INJECTION"
Cells(6, I1).Select
With Selection.Interior
.ColorIndex = 41
.Pattern = xlSolid
End With
Range(Cells(6, I1), Cells(6, I1 + 11)).Merge

Cells(6, M1).Select
With Selection.Interior
.ColorIndex = 45
.Pattern = xlSolid
.Value = "MOULAGE"
End With
Range(Cells(6, M1), Cells(6, M1 + 11)).Merge

Cells(6, C1).Select
Cells(6, C1) = "MOULAGE"
With Selection.Interior
.ColorIndex = 4
.Pattern = xlSolid
End With
Range(Cells(6, C1), Cells(6, C1 + 11)).Merge


End Sub
 
Re : macro évenementielle tourne en boucle

héhé J'ai trouvé meme meiux 😀
et plus simple 🙂

---->>>>>>>> Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
ca change tout 😀


Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

Application.ScreenUpdating = False
Application.DisplayAlerts = False


Application.EnableEvents = False
Call Mise_en_forme
Application.EnableEvents = True

End Sub
 
Re : macro évenementielle tourne en boucle

fifi à dit:
héhé J'ai trouvé meme meiux 😀
et plus simple 🙂

---->>>>>>>> Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
ca change tout 😀


Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

Application.ScreenUpdating = False
Application.DisplayAlerts = False


Application.EnableEvents = False
Call Mise_en_forme
Application.EnableEvents = True

End Sub
Salut
Elle marche sans doute mieux, mais tu vas droit dans le mur quand même
Application.ScreenUpdating = False
Application.DisplayAlerts = False

Ok. Déjà, je vois pas l'utilité de supprimer les messages, mais chacun son truc

Mais nulle part dans le code donné, je ne vois les instructions
Application.ScreenUpdating = True
Application.DisplayAlerts = True

Remarque, ça évite qu'Excel t'avertisse que tu as un problème et comme tu ne fais jamais d'erreur, c'est sans doute pas utile 😉

A+
 
Re : macro évenementielle tourne en boucle

Les displayalert et screenupdate = false me sont utile car il peut qu'il y ait des erreurs. mais pas d'erreurs grave..juste des erreurs d'affichage de graph, ou relatif à un TCD.

je développe mes macros sans ces codes pour vérifier si tout marche 😀 mais comme on ne sait jamais ce que peu nous fait l'utilisateur et qu'on ne peut pas penser à tout, je préserve le pauvre utilisateur du fichier de désagréable messages. (genre la macro modifie un graph à la demande de l'utilisateur mais le graph va etre faux avec des données qui générent une erreur (!div/0) , ainsi avec le displayalerte= false , l'utilisateur n'a pas de message. )

il y a aussi le cas lors de l'utilisation sous excel 98 (berk) que lorsqu'un TCD est raffraichit excel s'acharne à le confirmer... :s


Pour le application.screeen = false je le met partout car les macro pouvant etre longues ou meme changer de feuille... il est inutile qu'elles soient ralenties par un affichage et meme que le changement de feuille rapide donne des maux de tetes 😀. d'une façon générale c'est pour rendre l'execution plus rapide.
 
Re : macro évenementielle tourne en boucle

fifi à dit:
Les displayalert et screenupdate = false me sont utile car il peut qu'il y ait des erreurs. mais pas d'erreurs grave..juste des erreurs d'affichage de graph, ou relatif à un TCD.

je développe mes macros sans ces codes pour vérifier si tout marche 😀 mais comme on ne sait jamais ce que peu nous fait l'utilisateur et qu'on ne peut pas penser à tout, je préserve le pauvre utilisateur du fichier de désagréable messages. (genre la macro modifie un graph à la demande de l'utilisateur mais le graph va etre faux avec des données qui générent une erreur (!div/0) , ainsi avec le displayalerte= false , l'utilisateur n'a pas de message. )

il y a aussi le cas lors de l'utilisation sous excel 98 (berk) que lorsqu'un TCD est raffraichit excel s'acharne à le confirmer... :s


Pour le application.screeen = false je le met partout car les macro pouvant etre longues ou meme changer de feuille... il est inutile qu'elles soient ralenties par un affichage et meme que le changement de feuille rapide donne des maux de tetes 😀. d'une façon générale c'est pour rendre l'execution plus rapide.
Salut

Je pense qu'on a pas le même mode de raisonnement 🙂
Pour les message d'alerte, je comprendrais que tu géres les erreurs en resume next, même si je n'aime pas, mais là, tu verrouilles tous les messages d'alerte , même ceux des autres classeurs ouverts.... Et tu ne le dis pas. Bon on va clore le sujet, c'est ton projet et pas le mien, donc on suit ta méthode
A+
 
Re : macro évenementielle tourne en boucle

Re bonjour, pas d'inquietude je ne prends pas mal les remarques au contraire , cela permet toujours d'améliorer les projets.

les personnes qui utilisént le classeurs ne sont censés ne faire que ça sur le pc.
donc ne pas avoir de message d'erreur d'autre classeurs ne me géne pas.

ayant pris l'habitude de désactiver les messages d'erreur en début de macro , je peux prendre l'habitude des les réactiver en fin de macro 😀

Comme ca tout le monde est content 😀

(d'ailleurs peut etre il y aurait une macro qui à chaque début de macro lancerait le codes suivants:
application.ScreenUpdating = false
application.DisplayAlerts = false


et une autre qui mettrait en fin de macro
application.ScreenUpdating = true
application.DisplayAlerts = true)
 
- 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

Réponses
7
Affichages
829
W
  • Résolu(e)
Réponses
17
Affichages
2 K
Réponses
3
Affichages
1 K
Retour