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?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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" <julienzrb@free.fr> a écrit dans le message de news: c6c0ba27.0408222257.9f2d094@posting.google.com...
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?
' 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
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.
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.
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.
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.
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" <julienzrb@free.fr> a écrit dans le message de news:
c6c0ba27.0408230524.5516b114@posting.google.com...
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.
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.