Msgbox confirmer modification cellule VBA
Bonjour encore,
Je crée un autre sujet pour ne pas se mélanger les pinceaux
J'ai fait cette macro pour envoyer un message de confirmation si oui on valide la cellule si non on remet la cellule précédente qui a été enregistrée.
Cette macro fonctionne très bien pour Range("D6:D2000") mais rien ne se passe pour Range("F6:BXY2000")
Quelqu'un peut m'éclairer?
Merci d'avance vous êtes les meilleurs !
Option Explicit
Dim ValCell As Variant
Dim PreviousValue As Variant
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("D6:D2000")) Is Nothing _
Or Application.Intersect(Target, Range("F6:BXY2000")) Is Nothing Then
Application.EnableEvents = False
If MsgBox("Êtes-vous certain de modifier la révision", vbYesNo + vbExclamation + vbDefaultButton2) = vbNo Then
Target.Value = ValCell
End If
Application.EnableEvents = True
End If
If Target.Value <> PreviousValue Then
Worksheets("QQOQCCP").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Environ("Username")
Worksheets("QQOQCCP").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Value = Cells(Target.Row, 2).Value
Worksheets("QQOQCCP").Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Value = ValCell
Worksheets("QQOQCCP").Cells(Rows.Count, 4).End(xlUp).Offset(1, 0).Value = Target.Value
Worksheets("QQOQCCP").Cells(Rows.Count, 5).End(xlUp).Offset(1, 0).Value = Date
Worksheets("QQOQCCP").Cells(Rows.Count, 6).End(xlUp).Offset(1, 0).Value = Hour(Now) & ":" & Minute(Now)
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("D6:D2000")) Is Nothing _
Or Application.Intersect(Target, Range("F6:BXY2000")) Is Nothing Then
ValCell = Target
End If
End SubBonsoir,
Qui, Quoi, Où, Quand, Comment,...
Essayez de remplacer :
If Not Application.Intersect(Target, Range("D6:D2000")) Is Nothing _
Or Application.Intersect(Target, Range("F6:BXY2000")) Is Nothing Then
Par
If Not Application.Intersect(Target, Range("D6:D2000"), Range("F6:BXY2000")) Is Nothing Then
@ bientôt
LouReeD
Bonjour,
If Not Application.Intersect(Target, Range("D6:D2000")) Is Nothing _
Or Not Application.Intersect(Target, Range("F6:BXY2000")) Is Nothing ThenEt salut LouReed ! (tu dormais déjà un peu ?
Merci LouReed et MFerrand ! Je me suis aperçue de mon erreur en effet et ai un peu revu mon fichier
Seulement des problèmes des persistent : rien ne s'affiche dans la colonne "pourquoi"
Si je supprime une cellule cela n'apparaît pas dans l'historique elle est juste supprimée
Au lancement et (uniquement au lancement) du fichier si je modifie une cellule et que je choisi "non" elle disparaît (je ne comprends pas pourquoi) et en conséquence du premier point n'apparaît pas dans l'historique (je ne vois pas d'où vient l'erreur)
Option Explicit
Dim ValCell As Variant
Dim PreviousValue As Variant
Dim MaLigne As Long
Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("D6:D2000")) Is Nothing _
Or Not Application.Intersect(Target, Range("F6:BXY2000")) Is Nothing Then
Application.EnableEvents = False
With Worksheets("QQOQCCP")
' calcul de la première ligne vide sur les 8 colonnes
MaLigne = .UsedRange.Resize(, 8).Find("*", , , , xlRows, xlPrevious).Row + 1
If MsgBox("Êtes-vous certain de modifier la révision", vbYesNo + vbExclamation + vbDefaultButton2) = vbNo Then
Target.Value = ValCell
.Cells(MaLigne, 8).Value = "Pas de modification"
Else
Pourquoi.Show
End If
' on injecte les 7 valeurs directement en passant un tableau
If Target.Value <> PreviousValue Then
.Cells(MaLigne, 1).Resize(1, 8).Value = Array(Environ("USERNAME"), _
Cells(Target.Row, 2).Value, _
ValCell, Target.Value, _
IIf(Target.Column = 4, _
"Révision du document " & Cells(Target.Row, 2).Value, _
"Prise en compte du document " & Cells(2, Target.Column).Value), _
Date, _
Hour(Now) & ":" & Minute(Now), Pourquoi.TextBox1.Value)
End If
End With
End If
Application.EnableEvents = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("D6:D2000")) Is Nothing _
Or Not Application.Intersect(Target, Range("F6:BXY2000")) Is Nothing Then
ValCell = Target
End If
End SubBonjour,
xlByRows (au lieu de xlRows)
Je ne vois pas où est définie PreviousValue.
Pour le reste, pas d'élément d'appréciation.
j'ai allégé le code,
le dernier problème qui persiste est que rien ne s'affiche dans la colonne "pourquoi" (8ème colonne de la worksheet("QQOQCCP")) je voudrais y faire apparaître le message du textbox1 inclu dans le userform appelé "pourquoi"
Option Explicit
Dim Continuer As Integer, MaLigne As Long
Dim ValCell As Variant
Dim PreviousValue As Variant
Private Sub Worksheet_Change(ByVal Target As Range)
' on vérifie qu'on est sur l'une des deux plages, et on demande de continuer ou non
If Not Application.Intersect(Target, Range("D6:D2000")) Is Nothing _
Or Not Application.Intersect(Target, Range("F6:BXY2000")) Is Nothing Then
Continuer = MsgBox("Êtes-vous certain de modifier la révision ", vbYesNo + vbExclamation + vbDefaultButton2)
Else
Exit Sub
End If
Application.EnableEvents = False
With Worksheets("QQOQCCP")
' calcul de la première ligne vide sur les 8 colonnes
MaLigne = .UsedRange.Resize(, 8).Find("*", , , , xlRows, xlPrevious).Row + 1
' si on ne continue pas
If Continuer = vbNo Then
Target.Value = ValCell
' si on continue
Else
Pourquoi.Show
' on injecte les 8 valeurs directement en passant un tableau
.Cells(MaLigne, 1).Resize(1, 8).Value = Array(Environ("USERNAME"), _
Cells(Target.Row, 2).Value, _
ValCell, Target.Value, _
IIf(Target.Column = 4, "Révision ligne", "Révision matrice"), _
Date, _
Hour(Now) & ":" & Minute(Now), Pourquoi.TextBox1.Text)
End If
End With
Application.EnableEvents = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("D6:D2000")) Is Nothing _
Or Not Application.Intersect(Target, Range("F6:BXY2000")) Is Nothing Then
ValCell = Target
End If
End SubVérifie que tu n'as pas fermé (déchargé) ton Userform.
La commande de mon bouton "valider" sur mon userform
Les unload me "décharge" le userform ?
Private Sub CommandButton1_Click()
If TextBox1.Text <> "" Then
Unload Me
Else
MsgBox "Veuillez saisir un argument"
End If
End SubDonc, en y faisant référence, tu le rappelles, mais ayant été réinitisalisé, la TextBox est vide... Pas d'erreur mais la valeur est "" !
A la place de Unload : Me.Hide
Et après ton affectation, tu peux faire : Unload Pourquoi (dans la proc. Change).
Mille merci mes sauveurs !
Je suis venu à bout de ce petit code !!!!!!!!
Juste une dernière question : le hide.me prend beaucoup de place ou pas? Car ça me parraît bien pratique de pouvoir réutiliser le texte précédent sans avoir à le retaper (si jamais l'argument est le même).
Si j'enregistre et que je referme le classeur, le userform se réinitialisera tout de même ? Car même si c'est pratique ça porte à confusion si ce n'est pas la même personne qui ré ouvre le fichier.
Merci encore
C'est : Me.Hide
et tu le mets simplement à la place de : Unload Me
Et dans ta procédure Change, tu as le fragment :
Else
Pourquoi.Show
.Cells(MaLigne, 1).......
Unload Pourquoi
End If[Si tu indentais correctement, on lirait plus vite... !]
Bonsoir,
merci de vos mercis !
Bonsoir MFerrand
Et salut LouReed ! (tu dormais déjà un peu ?
)
Pourquoi ?
ma ré écriture ne marche pas ?
Pour ce qui est du Hide :
Hide cache le USF mais garde les données entrée.
Unload le ferme et vide les données, et l'initialisation sera lancée au "rallumage".
Dans les deux cas si le fichier est fermé, puis ouvert aucunes données n'est conservées.
@ bientôt
LouReeD
Salut LouReed !
Oh ! Je n'ai pas testé, mais l'intersection de 3 plages dont 2 ne peuvent avoir aucune instersection, est forcément nulle (Nothing en l'occurrence comme réponse).
Cordialement.
HA ok ! j'en apprend tous les jours !!!
je dois avouer que pour mois je le prener comme étant :
target intersection avec le premier range, puis target avec le deuxième range etc
Alors qu'en fait c'est l'intersection des différent range !!!!
Pauvre de moi
@ bientôt
LouReeD