Fonction if sur colonne
je remet ici ma procédure, que Jean-Eric a critiqué :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
With Target
If .CountLarge > 1 Then Exit Sub
If .Row < 5 Then Exit Sub
If .Column <> 1 Then
Unload Calendrier: Err.Clear: On Error GoTo 0
If .Column = 6 Then
Application.EnableEvents = False
.HorizontalAlignment = 3
If .Value = "" Then .Value = "X" Else .Value = ""
Application.EnableEvents = True
End If
Else
Calendrier.Show 0
End If
End With
End Sub
Jean-Eric a écrit :Une gestion d'erreur qui me semblait inutile
faux ! On Error Resume Next
est là pour éviter le plantage causé par la fermeture d'un formulaire non chargé.
ensuite, On Error Goto 0
désactive la gestion des erreurs dans la procédure en cours (source Microsoft).
rappel : dans ce post, Ronibo a écrit :
« à l'ouverture du fichier, vu que l'usf calendrier est pas ouvert ça plante ici : Unload Calendrier »
c'est exactement pour ça que j'ai ajouté ma gestion d'erreur !
Jean-Eric a écrit :Une procédure qui commence par 2 Exit Sub
et alors ?
* le 1er Exit Sub est pour sortir de la procédure si la sélection comporte plus d'une cellule
* le 2ème Exit Sub est pour sortir de la procédure si le n° ligne de la cellule active < 5
et si un autre cas fait que la suite de la procédure ne devrait pas s'exécuter, j'aurais mis un 3ème Exit Sub.
il est fait pour ça, et la remarque de Jean-Eric est un faux reproche, donc sans objet.
Jean-Eric a écrit :L'utilisation de EnableEvents
là, je suis d'accord : j'ai testé sans et ça marche ; j'avais pensé qu'il fallait le mettre car on modifie Target ; mais comme c'est avec Worksheet_SelectionChange() et non pas Worksheet_Change(), EnableEvents effectivement inutile ; d'où ce nouveau code VBA :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
With Target
If .CountLarge > 1 Then Exit Sub
If .Row < 5 Then Exit Sub
If .Column <> 1 Then
Unload Calendrier: Err.Clear: On Error GoTo 0
If .Column = 6 Then
.HorizontalAlignment = 3
If .Value = "" Then .Value = "X" Else .Value = ""
End If
Else
Calendrier.Show 0
End If
End With
End Sub
voici maintenant la sub de Jean-Eric :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.CountLarge = 1 Then
Select Case True
Case Target.Column = 1 And Target.Row > 4: Calendrier.Show 0
Case Target.Row < 5: Unload Calendrier
Case Target.Column = 6 And Target.Row > 4:
Target.Value = IIf(IsEmpty(Target), "X", "")
Unload Calendrier
Case Else: Unload Calendrier
End Select
End If
End Sub
* 3 instructions Unload Calendrier
quand je l'avais mis une seule fois ? je n'appelle pas ça une simplification de code !
* comme il n'y a pas de gestion d'erreur, Ronibo risque de rencontrer le même problème que précédemment :
à l'ouverture du fichier, comme l'usf calendrier n'est pas ouvert, Unload Calendrier
plante !
dhany
@Ronibo
merci d'avoir passé le sujet en résolu !
bonne continuation !
dhany
bonsoir à vous deux,
désolé du retard je viens seulement me libérer, j'ai pas eu le temps de tester de façon approfondi le code de JEAN ERIC, première vu il fonctionnait comme une horloge, après dhany a repéré les failles
se qui compte c'est que je comprends un peu les écriture et que mon problème soit résolu
merci à vous deux
Bonsoir Ronibo,
je suis d'accord avec toi : l'essentiel est que le problème soit réglé.
tu peux faire la fête !
dhany
c'est moi qui paye la bouteille