Microsoft 365 Target souci avec mon code

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à toutes et à tous :)

J'ai un souci dans mon code TARGET :
Code:
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 :po_O

Pourriez-vous m'aider ?
En cas, je joins le fichier test.
Un grand merci par avance...
:)
 

Pièces jointes

  • test.xlsm
    19.8 KB · Affichages: 8
Solution
RE,

Non, non,
Comme ça :
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
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.

Hasco

XLDnaute Barbatruc
Repose en paix
Bonsoir,

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.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Usine à gaz ;),

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) :
  1. 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
  2. aller dans la fenêtre d'exécution (Ctrl + G dans VBA) et tapez Application.EnableEvents = True puis Entrée
  3. Sauvegarder votre classeur, fermer =Excel et rouvrir le classeur
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
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
 

Jacky67

XLDnaute Barbatruc
Bonjour à toutes et à tous :)

J'ai un souci dans mon code TARGET :
Code:
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 :po_O

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
**Edit Hello mapomme
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re,

Il faut bien lire les réponses
Application.EnableEvents = False C'est APRES le test , pas avant !
Oui, c'est vrai :
Code:
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
Encore merci :)
 

Hasco

XLDnaute Barbatruc
Repose en paix
RE,

Non, non,
Comme ça :
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
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.
 

patricktoulon

XLDnaute Barbatruc
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?
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 947
Membres
101 849
dernier inscrit
florentMIG