OVH Cloud OVH Cloud

pb avec worksheet_change

3 réponses
Avatar
julienzrb
bonjour à tous,

j'ai un petit problème avec une macro que j'aimerais partager avec
vous (lol)!

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:
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


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

' dans le cas où la cellule modifiée n'est pas vide
If target.Previous.Value <> "" 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

Else: Application.EnableEvents = False
target.Value = target.Previous.Value
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. je crois que c'est le test pour savoir si
la cellule est vide qui n'est pas bien mis en oeuvre car sinon, le
code fonctionne.
est ce que quelqu'un a une idée?

merci d'avance

izzario

3 réponses

Avatar
Alain CROS
Bonjour.

' dans le cas où la cellule modifiée n'est pas vide
If target.Previous.Value <> "" Then

Sur cette ligne, tu ne testes pas la valeur de la cellule avant son changement :

Previous, propriété
Renvoie un objet Chart, Range ou Worksheet qui représente la cellule ou la feuille précédente. En lecture seule.

Remarques

Si l'objet est une plage, cette propriété simule la combinaison de touches MAJ+TABULATION mais, à l'inverse de celle-ci, renvoie la
cellule précédente sans la sélectionner.
Dans le cas d'une feuille protégée, cette propriété renvoie la cellule précédente non verrouillée. Dans le cas d'une feuille non
protégée, cette propriété renvoie toujours la cellule située immédiatement à gauche de la cellule spécifiée.

AMA, il faut que tu conserves les valeurs de ta plage dans un coin par exemple dans une autre colonne.

Alain CROS

"Izzario" a écrit dans le message de news:
bonjour à tous,

j'ai un petit problème avec une macro que j'aimerais partager avec
vous (lol)!

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:
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


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

' dans le cas où la cellule modifiée n'est pas vide
If target.Previous.Value <> "" 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

Else: Application.EnableEvents = False
target.Value = target.Previous.Value
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. je crois que c'est le test pour savoir si
la cellule est vide qui n'est pas bien mis en oeuvre car sinon, le
code fonctionne.
est ce que quelqu'un a une idée?

merci d'avance

izzario


Avatar
julienzrb
merci alain

en effet j'avais mal compris cette propriété. donc en VBA, il ne
serait pas possible de récupérer la précédente valeur d'une cellule
quel'on vient de modifier?
j'ai cherché dans les posts du newsgroup mais je n'ai rien trouvé de
satisfaisant.
Avatar
ru-th
Salut

un peu barge mais
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
rep = Target.Value
Application.Undo
rep1 = Target.Value
Application.Undo
If rep <> rep1 Then rep2 = MsgBox("confirmation", vbYesNo)
If rep2 = vbNo Then Application.Undo
Application.EnableEvents = True
End Sub

a+
rural thierry
"Izzario" a écrit dans le message de news:

merci alain

en effet j'avais mal compris cette propriété. donc en VBA, il ne
serait pas possible de récupérer la précédente valeur d'une cellule
quel'on vient de modifier?
j'ai cherché dans les posts du newsgroup mais je n'ai rien trouvé de
satisfaisant.