OVH Cloud OVH Cloud

worksheet_change et insertion d'une ligne

1 réponse
Avatar
julienzrb
milles excuses, je crois avoir envoyé un post précédent que je n'avais
pas terminé (je sais pas comment d'ailleurs)

dans le cas contraire, je répète ma requête:

eh puis, d'abord, bonsoir à tous!

je renvoie un nouveau post concernant un problème précédent, je m'en
excuse par avance, mais j'ai rencontré une difficulté inattendue, donc
je souhaite avoir l'avis du plus grand nombre.
je remet les choses dans leur contexte:

en fait, dans mon tableau XL je souhaiterais controler les modifs dans
un champ particulier. si la valeur d'une cellule est modifiée, une
boite de dialogue s'affiche demandant à l'utilisateur s'il est bien
sur de vouloir effectuer cette modif. s'il repond oui, la nouvelle
valeur s'affiche en bleu, sinon, la cellule revient à sa valeur
initiale. toutefois, si la cellule est initialement vide, la boite de
dialogue ne s'affiche pas et la nouvelle valeur s'affiche en noir,
comme si de rien n'était.


pour cela, j'ai mis en oeuvre le code suivant:
subtilité: pour pouvoir évaluer les modifs avec quelque chose de
"stable", j'ai recopié le contenu initial de mon champ dans une
colonne cachée, avec 10 colonnes de décalage de mon champ initial.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
'permet d'agir sur la modification de cellule(s) de la feuille de
calcul

Dim message1 As String
Dim baseline

'dans le cas où la cellule modifiée appartient à la plage spécifiée
If Not Intersect(Target, Range("baseline")) Is Nothing Then

' dans le cas où la cellule modifiée n'est pas vide
If Target <> Target.Offset(0, 10) Then

' dans le cas où la cellule modifiée n'est pas vide
If Target.Offset(0, 10) <> "" Then

'l'utilisateur doit faire un choix dans une boîte de dialogue
message1 = MsgBox("Modification of the baseline date is
not harmless and requires a customer approbation." & Chr(10) &
"Confirm modification ?", vbYesNo + vbQuestion, "Warning!")

'si la modif est acceptée, le texte de la cellule devient bleu
If message1 = vbYes Then
Target.Font.ColorIndex = 5

' si la modif est refusée, la cellule retrouve sa valeur initiale
(avant modif)
Else: Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If

' si la cellule testée est initialement vide, il est inutile de
changer la couleur
' de la police
Else: Application.EnableEvents = False
Target.Font.ColorIndex = 1
Application.EnableEvents = True
End If

Else: Application.EnableEvents = False
ActiveCell = Target.Offset(1, 0)
Application.EnableEvents = True
End If
' on sort de la macro, ce qui évite une boucle infinie
Else: Exit Sub
End If

End Sub


seulement, ca ne marche pas tout le temps. en effet, lorsqu'un usager
veut insérer une ligne dans le tableau, ca buggge! je crois que c'est
parce qu'en insérant une ligne en sélectionnant au préalable une ligne
entière, le programme ne peut pas identifier de cellule modifiée dans
la feuille (la sélection portant justement sur une ligne entière). je
pense que le mieux serait d'exclure le cas d'une insertion (et d'une
suppression d'ailleurs) de la procédure worksheet_change, mais pour le
faire, ca, je n'y suis pas encore arrivé.

j'espère etre clair et ne pas vous avoir embrouillé.

est ce que quelqu'un a une idée? le ciel vous le rendra au centuple
(si, si, je vous assure...)
merci d'avance à tous ceux qui transpirent sur cette question à la con
(mais qui pourrit bien la vie ... lol)

izzario

1 réponse

Avatar
papou
Bonjour
If Target.Cells.Count > 1 Then Exit Sub
Cordialement
Pascal

"Izzario" a écrit dans le message de
news:
milles excuses, je crois avoir envoyé un post précédent que je n'avais
pas terminé (je sais pas comment d'ailleurs)

dans le cas contraire, je répète ma requête:

eh puis, d'abord, bonsoir à tous!

je renvoie un nouveau post concernant un problème précédent, je m'en
excuse par avance, mais j'ai rencontré une difficulté inattendue, donc
je souhaite avoir l'avis du plus grand nombre.
je remet les choses dans leur contexte:

en fait, dans mon tableau XL je souhaiterais controler les modifs dans
un champ particulier. si la valeur d'une cellule est modifiée, une
boite de dialogue s'affiche demandant à l'utilisateur s'il est bien
sur de vouloir effectuer cette modif. s'il repond oui, la nouvelle
valeur s'affiche en bleu, sinon, la cellule revient à sa valeur
initiale. toutefois, si la cellule est initialement vide, la boite de
dialogue ne s'affiche pas et la nouvelle valeur s'affiche en noir,
comme si de rien n'était.


pour cela, j'ai mis en oeuvre le code suivant:
subtilité: pour pouvoir évaluer les modifs avec quelque chose de
"stable", j'ai recopié le contenu initial de mon champ dans une
colonne cachée, avec 10 colonnes de décalage de mon champ initial.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
'permet d'agir sur la modification de cellule(s) de la feuille de
calcul

Dim message1 As String
Dim baseline

'dans le cas où la cellule modifiée appartient à la plage spécifiée
If Not Intersect(Target, Range("baseline")) Is Nothing Then

' dans le cas où la cellule modifiée n'est pas vide
If Target <> Target.Offset(0, 10) Then

' dans le cas où la cellule modifiée n'est pas vide
If Target.Offset(0, 10) <> "" Then

'l'utilisateur doit faire un choix dans une boîte de dialogue
message1 = MsgBox("Modification of the baseline date is
not harmless and requires a customer approbation." & Chr(10) &
"Confirm modification ?", vbYesNo + vbQuestion, "Warning!")

'si la modif est acceptée, le texte de la cellule devient bleu
If message1 = vbYes Then
Target.Font.ColorIndex = 5

' si la modif est refusée, la cellule retrouve sa valeur initiale
(avant modif)
Else: Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If

' si la cellule testée est initialement vide, il est inutile de
changer la couleur
' de la police
Else: Application.EnableEvents = False
Target.Font.ColorIndex = 1
Application.EnableEvents = True
End If

Else: Application.EnableEvents = False
ActiveCell = Target.Offset(1, 0)
Application.EnableEvents = True
End If
' on sort de la macro, ce qui évite une boucle infinie
Else: Exit Sub
End If

End Sub


seulement, ca ne marche pas tout le temps. en effet, lorsqu'un usager
veut insérer une ligne dans le tableau, ca buggge! je crois que c'est
parce qu'en insérant une ligne en sélectionnant au préalable une ligne
entière, le programme ne peut pas identifier de cellule modifiée dans
la feuille (la sélection portant justement sur une ligne entière). je
pense que le mieux serait d'exclure le cas d'une insertion (et d'une
suppression d'ailleurs) de la procédure worksheet_change, mais pour le
faire, ca, je n'y suis pas encore arrivé.

j'espère etre clair et ne pas vous avoir embrouillé.

est ce que quelqu'un a une idée? le ciel vous le rendra au centuple
(si, si, je vous assure...)
merci d'avance à tous ceux qui transpirent sur cette question à la con
(mais qui pourrit bien la vie ... lol)

izzario