Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme VBA sur changement de valeur et touche suppr (Del)

5 réponses
Avatar
Vincent3377
Bonjour à toutes et tous,

Un petit soucis dans une macro de type Private Sub Worksheet_Change(ByVal Target As Range) !

Donc sur des changements de valeur d'une sélection, la macro réalise bien ce qu'on lui demande, sauf que j'ai des restrictions sur les valeurs numériques à gérer par exemple uniquement les valeurs entre 2 et 16.
Le soucis se pose lorsqu'une valeur est supprimée par la touche SUPPR (del) directement sans donc passer par validation, la macro agit sans respecter le fait que la cellule est vide et ne devrait donc pas correspondre à mes conditions.
Effectivement, si j'édite la cellule, efface la valeur puis valide, là elle respecte les conditions!
Si quelqu'un a une idée pour contourner ce problème, ce serait formidable, avec un grand merci d'avance!

5 réponses

Avatar
LSteph
Bonjour,
On comprend l'idée
mais tu sera peut-être plus précis en donnant un lien vers un fi chier exemple en cjoint.com
Cordialement
--
LSteph
Avatar
vincent3377
Le jeudi 04 Août 2016 à 21:00 par LSteph :
Bonjour,
On comprend l'idée
mais tu sera peut-être plus précis en donnant un
lien vers un fi chier exemple en cjoint.com
Cordialement
--
LSteph
Bonjour,
Je remercie LSteph de s’intéresser à mon cas, j'ai pour l'instant contourné le soucis de suppression direct par "SUPPR" ou "DEL" en interdisant purement et simplement la touche DEL dans le classeur!
Ceci dit, c'est pas très propre et je risque de retomber sur ce petit soucis!
Pour tester, je peux te mettre le bout de macro à mettre dans la bonne case:
"Private Sub Worksheet_Change(ByVal Target As Range)"
et donc:
Dim KeyCells1 As Range
Dim CellOrigineXo
'Plage de cellules nommée "niveauH" correspondant à une colonne de 180 lignes
Set KeyCells1 = Range("niveauxH")
CellOrigineXo = ActiveCell.Address
On Error Resume Next
If Not Application.Intersect(KeyCells1, Range(Target.Address)) Is Nothing Then
'Désactive la gestion des évènements d'Excel
Application.EnableEvents = False
ActiveCell.Offset(-1, 0).Select
If Selection < 3 Then Exit Sub
ActiveCell.Offset(0, -2).Select
Selection.Copy
'Selectionne une cellule nommée "TrainingH"
Range("TrainingH").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:úlse, Transpose:úlse
Range(CellOrigineXo).Select
ActiveCell.Offset(-1, 0).Select
If Selection > 2 And Selection < 16 Then
Selection.Copy
'Selectionne une cellule nommée "NewLevelH"
Range("NewLevelH").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:úlse, Transpose:úlse
'Selectionne une cellule nommée "NewDelaiH" (une RechercheV est effectuée dans un autre tableau de la même feuille Excel)
Range("NewDelaiH").Select
Selection.Copy
Range("FinTraining").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:úlse, Transpose:úlse
'Selectionne une cellule nommée "DebutTraining" et met la date à jour
Range("DebutTraining").Value = Now()
'Selectionne une cellule nommée "CalageHautG" pour repositionner la feuille
Range("CalageHautG").Select
ActiveWindow.SmallScroll Down:=5
'Selectionne une cellule nommée "CompteArebour" un bout de macro différent gére une fonction OnTime
Range("CompteArebour").Select
'Réactive la gestion des évènements d'Excel
Application.EnableEvents = True
'Vide la mémoire cache
Application.CutCopyMode = False
End If
End If
'Il y a ensuite d'autres boucles du même type ...
End Sub
Voilà pour le bout de macro, m'enfin le soucis doit se situer dans la gestion de la validation d'Excel je pense?
Ceci dit, j'ai mis une boucle complète, si tu vois des améliorations!
J'ai essayé de faire la recherche verticale avec un bout de code mais finalement je me suis dit plus simple de récupérer le résultat dans la feuille!
Je débute aussi, alors y a peut-être plus simple!
En tout cas, merci de te pencher sur mon cas,
Dans l'attente d'une réponse, y a pas d'urgence non plus, mais j'aimerai bien progresser un peu aussi :)
Encore Merci !!
Avatar
LSteph
Bonjour,
Je vais essayer en mettant des points pour s'y retrouver:
1-En fait j'avais suggéré , pour t'aider
..en donnant un lien vers un fichier exemple en cjoint.com


(j'ajouterais avec Le code complet...)
2-Donc suivant ton précédent post
'Il y a ensuite d'autres boucles du même type ...

Je vois une suite d'instructions .. pas de boucle.
Serait peut-être utile mais..
3- on en sait rien puisque tu donnes une macro sans qu'on connaisse le poin t de départ ni l'objectif. Doncc si tu peux préciser:
3.1 Situation de départ
3.2 Ce que doit faire la macro et dans quel cas*
3.3 Pour arriver à ...quel résultat.
* Exemple que doit faire le change si l'utilisateur colle plusieurs cellule s, dont certaines ou pas seraient incluses dans [niveauxH]
En clair si target n'est pas juste une cellule mais plusieurs.
4- > ...j'aimerai bien progresser un peu aussi
Il y a un truc que tu peux faire déjà: enlever tous les select et les selection qui ne servent pas exemple:
If ActiveCell.Offset(-1, 0) < 3 Then Exit Sub
ActiveCell.Offset(0, -2).Copy
[TrainingH].PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:úlse, Transpose:úlse
Ton code n'a pas besoin d'aller gesticuler partout pour prendre des valeur s et les attribuer à une autre cellule, elles peuvent ainsi y aller di rectement.
...à suivre.
--
LSteph
Le mardi 16 août 2016 12:23:35 UTC+2, vincent3377 a écrit :
Le jeudi 04 Août 2016 à 21:00 par LSteph :
Bonjour,
On comprend l'idÃĩe
mais tu sera peut-ÃĻtre plus prÃĩcis en donnant un
lien vers un fi chier exemple en cjoint.com
Cordialement
--
LSteph
Bonjour,
Je remercie LSteph de s’intéresser à mon cas, j'ai pour l'instant contourné le
soucis de suppression direct par "SUPPR" ou "DEL" en interdisant purement et
simplement la touche DEL dans le classeur!
Ceci dit, c'est pas très propre et je risque de retomber sur ce peti t soucis!
Pour tester, je peux te mettre le bout de macro à mettre dans la bon ne case:
"Private Sub Worksheet_Change(ByVal Target As Range)"
et donc:
Dim KeyCells1 As Range
Dim CellOrigineXo
'Plage de cellules nommée "niveauH" correspondant à une colonne de 180 lignes
Set KeyCells1 = Range("niveauxH")
CellOrigineXo = ActiveCell.Address
On Error Resume Next
If Not Application.Intersect(KeyCells1, Range(Target.Address)) Is Not hing
Then
'Désactive la gestion des évènements d'Excel
Application.EnableEvents = False
ActiveCell.Offset(-1, 0).Select
If Selection < 3 Then Exit Sub
ActiveCell.Offset(0, -2).Select
Selection.Copy
'Selectionne une cellule nommée "TrainingH"
Range("TrainingH").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, S kipBlanks
_
:úlse, Transpose:úlse
Range(CellOrigineXo).Select
ActiveCell.Offset(-1, 0).Select
If Selection > 2 And Selection < 16 Then
Selection.Copy
'Selectionne une cellule nommée "NewLevelH"
Range("NewLevelH").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks
_
:úlse, Transpose:úlse
'Selectionne une cellule nommée "NewDelaiH" (une RechercheV est effe ctuée dans
un autre tableau de la même feuille Excel)
Range("NewDelaiH").Select
Selection.Copy
Range("FinTraining").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks
_
:úlse, Transpose:úlse
'Selectionne une cellule nommée "DebutTraining" et met la date à   jour
Range("DebutTraining").Value = Now()
'Selectionne une cellule nommée "CalageHautG" pour repositionner la feuille
Range("CalageHautG").Select
ActiveWindow.SmallScroll Down:=5
'Selectionne une cellule nommée "CompteArebour" un bout de macro dif férent gére
une fonction OnTime
Range("CompteArebour").Select
'Réactive la gestion des évènements d'Excel
Application.EnableEvents = True
'Vide la mémoire cache
Application.CutCopyMode = False
End If
End If
'Il y a ensuite d'autres boucles du même type ...
End Sub
Voilà pour le bout de macro, m'enfin le soucis doit se situer dans l a gestion de
la validation d'Excel je pense?
Ceci dit, j'ai mis une boucle complète, si tu vois des améliora tions!
J'ai essayé de faire la recherche verticale avec un bout de code mai s finalement
je me suis dit plus simple de récupérer le résultat dans l a feuille!
Je débute aussi, alors y a peut-être plus simple!
En tout cas, merci de te pencher sur mon cas,
Dans l'attente d'une réponse, y a pas d'urgence non plus, mais j'aim erai bien
progresser un peu aussi :)
Encore Merci !!
Avatar
isabelle
bonjour Vincent,
l'événement "Worksheet_Change" se produit même quant la touche "Supprime ou Del"
est pressée
j'ai fais un peu de ménage à ton code, mais je ne comprend pas la question ?
- enlever les select et selection, Target est là
- nul besoin d'utiliser Copy quand le Paste est pour xlPasteValues
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells1 As Range
Dim CellOrigineXo
Set KeyCells1 = Range("niveauxH")
CellOrigineXo = Target.Address
On Error Resume Next
If Not Application.Intersect(KeyCells1, Range(Target.Address)) Is Nothing Then
Application.EnableEvents = False
If Target.Offset(-1, 0) < 3 Then Exit Sub
Range("TrainingH").Value = Target.Offset(-1, -2).Value
If Range(CellOrigineXo).Offset(-1, 0) > 2 And
Range(CellOrigineXo).Offset(-1, 0) < 16 Then
Range("NewLevelH").Value = Range(CellOrigineXo).Offset(-1, 0).Value
Range("FinTraining").Value = Range("NewDelaiH").Value
Range("DebutTraining").Value = Now()
Application.Goto Range("CompteArebour")
End If
End If
Application.EnableEvents = True
'suite ...
End Sub
isabelle
Le 2016-08-16 à 06:23, vincent3377 a écrit :
Le jeudi 04 Août 2016 à 21:00 par LSteph :
Bonjour,
On comprend l'idée
mais tu sera peut-être plus précis en donnant un
lien vers un fi chier exemple en cjoint.com
Cordialement
--
LSteph

Bonjour,
Je remercie LSteph de s’intéresser à mon cas, j'ai pour l'instant contourné le
soucis de suppression direct par "SUPPR" ou "DEL" en interdisant purement et
simplement la touche DEL dans le classeur!
Ceci dit, c'est pas très propre et je risque de retomber sur ce petit soucis!
Pour tester, je peux te mettre le bout de macro à mettre dans la bonne case:
"Private Sub Worksheet_Change(ByVal Target As Range)"
et donc:
Dim KeyCells1 As Range
Dim CellOrigineXo
'Plage de cellules nommée "niveauH" correspondant à une colonne de 180 lignes
Set KeyCells1 = Range("niveauxH")
CellOrigineXo = ActiveCell.Address
On Error Resume Next
If Not Application.Intersect(KeyCells1, Range(Target.Address)) Is Nothing
Then
'Désactive la gestion des évènements d'Excel
Application.EnableEvents = False
ActiveCell.Offset(-1, 0).Select
If Selection < 3 Then Exit Sub
ActiveCell.Offset(0, -2).Select
Selection.Copy
'Selectionne une cellule nommée "TrainingH"
Range("TrainingH").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks
_
:úlse, Transpose:úlse
Range(CellOrigineXo).Select
ActiveCell.Offset(-1, 0).Select
If Selection > 2 And Selection < 16 Then
Selection.Copy
'Selectionne une cellule nommée "NewLevelH"
Range("NewLevelH").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks
_
:úlse, Transpose:úlse
'Selectionne une cellule nommée "NewDelaiH" (une RechercheV est effectuée dans
un autre tableau de la même feuille Excel)
Range("NewDelaiH").Select
Selection.Copy
Range("FinTraining").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks
_
:úlse, Transpose:úlse
'Selectionne une cellule nommée "DebutTraining" et met la date à jour
Range("DebutTraining").Value = Now()
'Selectionne une cellule nommée "CalageHautG" pour repositionner la feuille
Range("CalageHautG").Select
ActiveWindow.SmallScroll Down:=5
'Selectionne une cellule nommée "CompteArebour" un bout de macro différent gére
une fonction OnTime
Range("CompteArebour").Select
'Réactive la gestion des évènements d'Excel
Application.EnableEvents = True
'Vide la mémoire cache
Application.CutCopyMode = False
End If
End If
'Il y a ensuite d'autres boucles du même type ...
End Sub
Voilà pour le bout de macro, m'enfin le soucis doit se situer dans la gestion de
la validation d'Excel je pense?
Ceci dit, j'ai mis une boucle complète, si tu vois des améliorations!
J'ai essayé de faire la recherche verticale avec un bout de code mais finalement
je me suis dit plus simple de récupérer le résultat dans la feuille!
Je débute aussi, alors y a peut-être plus simple!
En tout cas, merci de te pencher sur mon cas,
Dans l'attente d'une réponse, y a pas d'urgence non plus, mais j'aimerai bien
progresser un peu aussi :)
Encore Merci !!
Avatar
vincent3377
Le jeudi 04 Août 2016 à 18:49 par Vincent3377 :
Bonjour à toutes et tous,
Un petit soucis dans une macro de type Private Sub Worksheet_Change(ByVal
Target As Range) !
Donc sur des changements de valeur d'une sélection, la macro
réalise bien ce qu'on lui demande, sauf que j'ai des restrictions sur
les valeurs numériques à gérer par exemple uniquement les
valeurs entre 2 et 16.
Le soucis se pose lorsqu'une valeur est supprimée par la touche SUPPR
(del) directement sans donc passer par validation, la macro agit sans respecter
le fait que la cellule est vide et ne devrait donc pas correspondre à
mes conditions.
Effectivement, si j'édite la cellule, efface la valeur puis valide,
là elle respecte les conditions!
Si quelqu'un a une idée pour contourner ce problème, ce serait
formidable, avec un grand merci d'avance!
Merci Isabelle et merci LSteph.
Je vais reprendre tout cela fort de vos explications dés aujourd'hui, et je reviens vers vous de toutes manières, pour vous dire ou j'en suis.
En tout cas, encore merci, ca va me permettre d'avancer et de mettre un peu d'ordre!