Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("i6:i12")) Is Nothing Then
Target.Activate
If Target > [k6] Then
Target = [k6].Value
[a1].Select
Exit Sub
Else
Target.Activate
Target = Target.Value
[a1].Select
Exit Sub
End If
End If
End Sub
Contexte
j'ai à saisir des valeurs dans les cellules de I6 à I12
par exemple pour I6 que si la valeur saisie est supérieure à K6 alors I6 prend la valeur de K6
I6 prend bien la valeur de K6
Mais le fichier beug en se refermant. J'ai du zapper un truc lol
Pourriez-vous m'aider ?
En cas, je joins le fichier test.
Un grand merci par avance...
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("i6:i12")) Is Nothing Then
'Avant de changer la valeur d'une cellule dans l'évènement Change
Application.EnableEvents = False
Target.Activate
If Target > [k6] Then
Target = [k6].Value
[a1].Select
Else
Target.Activate
Target = Target.Value
[a1].Select
End If
Application.EnableEvents = True
' pour rétablir la gestion normale des l'évènements
End If
End Sub
voyez la différence
En tous cas je salue vos progrès apparents.
Sans avoir ouvert le fichier, je vois que vous changez des valeurs de cellules lors d'un évènement Change, impliquant ainsi des appels à Worksheet_Change(ByVal Target As Range) incessants qui tournent en rond.
Le serpent se mord la queue.
VB:
Application.EnableEvents = False 'Avant de changer la valeur d'une cellule dans l'évènement Change
Application.EnableEvents = True ' pour rétablir la gestion normale des l'évènement.s
Dans votre code je mettrais sans doute le premier juste après le test d'intersection de plage et le second juste avant le end if final.
Si on utilise l'évènement Worksheet_Change, il faut faire attention à ne pas passer dans une boucle de la mort.
On exécute Worksheet_Change
On y change une valeur de cellule => on exécute une nouvelle fois Worksheet_Change. Dans cette nouvelle exécution, on change encore la valeur d'une cellule => on exécute une nouvelle fois Worksheet_Change
et ainsi de suite jusqu'à saturation de la mémoire de l'ordinateur et plantage.
Il existe l'instruction Application.EnableEvents = False qui désactive les traitements des évènements.
Ensuite on peut donc changer les valeurs de la feuille en évitant les réitérations successives.
Attention !Ne pas oublier d’exécuter l’instruction Application.EnableEvents = True avant de sortir de la procédure. Sinon plus aucun évènement ne sera plus traité.
Nota : si une erreur se produit avant l'exécution de Application.EnableEvents = True , votre macro s'arrêtera avant cette instruction et vos évènements ne seront plus traités même après correction.
Trois solutions (au moins) :
Inclure le code dans un bloc de correction d'erreur qui va exécuter automatiquement Application.EnableEvents = True avant d'arrêter le code suite à l'erreur
aller dans la fenêtre d'exécution (Ctrl + G dans VBA) et tapez Application.EnableEvents = True puis Entrée
Sauvegarder votre classeur, fermer =Excel et rouvrir le classeur
Bonjour et Merci Hasco
C'est beaucoup mieux comme ça : c'est nickel
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
'Avant de changer la valeur d'une cellule dans l'évènement Change
If Not Intersect(Target, Range("i6:i12")) Is Nothing Then
Target.Activate
If Target > [k6] Then
Target = [k6].Value
[a1].Select
Application.EnableEvents = True
' pour rétablir la gestion normale des l'évènement.s
Else
Target.Activate
Target = Target.Value
[a1].Select
Application.EnableEvents = True
' pour rétablir la gestion normale des l'évènement.s
End If
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("i6:i12")) Is Nothing Then
Target.Activate
If Target > [k6] Then
Target = [k6].Value
[a1].Select
Exit Sub
Else
Target.Activate
Target = Target.Value
[a1].Select
Exit Sub
End If
End If
End Sub
Contexte
j'ai à saisir des valeurs dans les cellules de I6 à I12
par exemple pour I6 que si la valeur saisie est supérieure à K6 alors I6 prend la valeur de K6
I6 prend bien la valeur de K6
Mais le fichier beug en se refermant. J'ai du zapper un truc lol
Pourriez-vous m'aider ?
En cas, je joins le fichier test.
Un grand merci par avance...
Bonjour,
Sans vraiment comprendre le fonctionnement dans le classeur.
Néanmoins le code pourrait ressembler à ceci
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("i6:i12")) Is Nothing Then Exit Sub
Application.EnableEvents = False
If Target.Value > Target.Offset(, 2).Value Then Target.Value = Target.Offset(, 2).Value
[a1].Select
Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
'Avant de changer la valeur d'une cellule dans l'évènement Change
If Not Intersect(Target, Range("i6:i12")) Is Nothing Then
Target.Activate
If Target > [k6] Then
Target = [k6].Value
[a1].Select
Else
Target.Activate
Target = Target.Value
[a1].Select
End If
Application.EnableEvents = True
' pour rétablir la gestion normale des l'évènements
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("i6:i12")) Is Nothing Then
'Avant de changer la valeur d'une cellule dans l'évènement Change
Application.EnableEvents = False
Target.Activate
If Target > [k6] Then
Target = [k6].Value
[a1].Select
Else
Target.Activate
Target = Target.Value
[a1].Select
End If
Application.EnableEvents = True
' pour rétablir la gestion normale des l'évènements
End If
End Sub
voyez la différence
En tous cas je salue vos progrès apparents.
bonjour @Usine à gaz , @Hasco
perso j'ai une règle d'or
en effet pour une raison ou une autre vba peut buguer ,une condition if peut être mal fagoté et j'en passe et des meilleures
il est donc pour moi evident de remettre le le enableevents a true en dehors de cette condition comme ca de toute les manières les events sont opérationnels
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("i6:i12")) Is Nothing Then
'Avant de changer la valeur d'une cellule dans l'évènement Change
Application.EnableEvents = False
Target.Activate
If Target > [k6] Then
Target = [k6].Value
[a1].Select
Else
Target.Activate
Target = Target.Value
[a1].Select
End If
' pour rétablir la gestion normale des l'évènements
End If
'dans tout les cas a la fin le event sont operationels car on est en dehors de toute conditions '
Application.EnableEvents = True
End Sub
une dernière chose a quoi sert le activate de la target puisque aussitôt après on select la "A1" c'est quoi l'intérêt?
Bonjour Patrick, le Forum
Mes bons vœux Patrick pour cette nouvelle année
Je te remercie pour m'avoir répondu.
Merci pour te conseils que je garde précieusement... et le code aussi lol