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

Private Sub Worksheet_Change

19 réponses
Avatar
CAT
Bonjour à tous,

J'ai mit un code dans La macro 'Private Sub Worksheet_Change' qui efface la
valeur que l'on vient de saisir dans une cellule si la cellule à droite de
cette dernière est vide. Ce code fonctionne très bien quand je saisie une
valeur manuellement dans la cellule mais ne fonctionne pas si une valeur est
validée par un clic de souris dans une liste de coix (liste déroulante).

Existe-il une façon pour contourner ce problème ?

Merci pour votre aide.

9 réponses

1 2
Avatar
CAT
Je suis en version 2003 d'Excel....
Mais ça ne fonctionne pas chez moi bien que la commande s'exécute.
J'ai mis un point d'arret et je vois bien que l'évènement se produit, mais
l'effacement de la cellule semble être innéficace alors qu'elle que la
commande est bien exécutée.

"michdenis" a écrit dans le message de news:

Bonjour CAT,

De mémoire, la version Excel 2000 se comporte tel que tu le décris.

Pour solutionner ton problème, tu peux insérer une feuille que tu
masqueras avec un bout de code
Worksheets("Nom_De_La_Feuille").visible = xlveryhidden
La feuille ne sera pas accessible par l'usager via l'interface de la
feuille de calcul.
Dans cette feuille, tu choisis une cellule, et tu inscris la formule
suivante :
=MaFeuille!A1
MaFeuille -> nom de la feuille où se trouve ta liste de validation
A1 la cellule qui contient la liste de validation

Et tu insères ta procédure 'Private Sub Worksheet_Change'
dans le module feuille de la feuille que tu viens d'ajouter.
Ceci fera déclencher la procédure événementielle à chaque fois
que tu modifieras dans ta liste de validation.


Exemple ta liste de validation est en Feuil2, cellule D1
Le code dans le module feuille de ta feuil2

Cette procédure est appelée par la procédure événementielle
de la feuille que tu as ajoutée. Tu dois enlever le mot "Private"
à la ligne de déclaration de la procédure :
'----------------------------------
Sub Worksheet_Change(ByVal Target As Range)

Set Target = ActiveCell
Cells(Target.Row, Target.Column).Value = ""

End Sub
'----------------------------------

Dans la feuille que tu as ajoutée et masquée, ce code :
'-----------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = Range("A1").Address Then
Feuil2.Worksheet_Change Target
End If
End Sub
'-----------------------------------------------

Tout ceci n'est qu'un exemple, il peut être adapté selon la
nécessité de ton application.





"CAT" a écrit dans le message de groupe de discussion :
#
Bonjour à tous,

J'ai mit un code dans La macro 'Private Sub Worksheet_Change' qui efface
la
valeur que l'on vient de saisir dans une cellule si la cellule à droite de
cette dernière est vide. Ce code fonctionne très bien quand je saisie une
valeur manuellement dans la cellule mais ne fonctionne pas si une valeur
est
validée par un clic de souris dans une liste de coix (liste déroulante).

Existe-il une façon pour contourner ce problème ?

Merci pour votre aide.



Avatar
michdenis
Écoute, il faut se taper tout le fil pour savoir ce que tu veux faire !
Si tu prends le temps de définir ta question correctement, tu auras
plus de chance d'obtenir une réponse qui convient !

Quelle est ta version ? Qu'est-ce que tu tentes de faire ?
Définir la donne de ton problème en publiant une procédure
qui ne fonctionne pas est un peu court pour ceux qui tente de t'aider.

Si tu veux publier ton code, pas de problème mais cela ne doit pas
être un substitut à une définition écrite de ta problématique et de tes
attentes.



"CAT" a écrit dans le message de groupe de discussion :

Je suis en version 2003 d'Excel....
Mais ça ne fonctionne pas chez moi bien que la commande s'exécute.
J'ai mis un point d'arret et je vois bien que l'évènement se produit, mais
l'effacement de la cellule semble être innéficace alors qu'elle que la
commande est bien exécutée.

"michdenis" a écrit dans le message de news:

Bonjour CAT,

De mémoire, la version Excel 2000 se comporte tel que tu le décris.

Pour solutionner ton problème, tu peux insérer une feuille que tu
masqueras avec un bout de code
Worksheets("Nom_De_La_Feuille").visible = xlveryhidden
La feuille ne sera pas accessible par l'usager via l'interface de la
feuille de calcul.
Dans cette feuille, tu choisis une cellule, et tu inscris la formule
suivante :
=MaFeuille!A1
MaFeuille -> nom de la feuille où se trouve ta liste de validation
A1 la cellule qui contient la liste de validation

Et tu insères ta procédure 'Private Sub Worksheet_Change'
dans le module feuille de la feuille que tu viens d'ajouter.
Ceci fera déclencher la procédure événementielle à chaque fois
que tu modifieras dans ta liste de validation.


Exemple ta liste de validation est en Feuil2, cellule D1
Le code dans le module feuille de ta feuil2

Cette procédure est appelée par la procédure événementielle
de la feuille que tu as ajoutée. Tu dois enlever le mot "Private"
à la ligne de déclaration de la procédure :
'----------------------------------
Sub Worksheet_Change(ByVal Target As Range)

Set Target = ActiveCell
Cells(Target.Row, Target.Column).Value = ""

End Sub
'----------------------------------

Dans la feuille que tu as ajoutée et masquée, ce code :
'-----------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = Range("A1").Address Then
Feuil2.Worksheet_Change Target
End If
End Sub
'-----------------------------------------------

Tout ceci n'est qu'un exemple, il peut être adapté selon la
nécessité de ton application.





"CAT" a écrit dans le message de groupe de discussion :
#
Bonjour à tous,

J'ai mit un code dans La macro 'Private Sub Worksheet_Change' qui efface
la
valeur que l'on vient de saisir dans une cellule si la cellule à droite de
cette dernière est vide. Ce code fonctionne très bien quand je saisie une
valeur manuellement dans la cellule mais ne fonctionne pas si une valeur
est
validée par un clic de souris dans une liste de coix (liste déroulante).

Existe-il une façon pour contourner ce problème ?

Merci pour votre aide.



Avatar
CAT
Bonjour MichDenis,

Sur mon 1er poste, je pensais avoir été clair bien que j'ai en effet oublié
de stipulé que j'utilisais Excel 2003.

Donc mon problème est le suivant :
Ce que je veux ou plûtot voudrais, c'est que ma saisie soit purement et
simplement effacée si j'entre par mégarde une valeur dans une cellule qui ne
doit pas en recevoir car une cellule test sur la même ligne n'en a pas. Ce
qui fonctionne très bien si je saisie cette valeur au clavier mais ne
fonctionne pas quand je sélectionne une valeur depuis une liste de choix
liée à cette cellule.

Pour cela j'ai pensé utiliser l'évènement 'Worksheet_Change' en inscrivant
le code suivant :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cell As Range
On Error Resume Next
'si la cellule modifiée ne fait pas partie des cellules de saisies quiter la
procédure
If Target.Column > 6 Or Target.Column < 30 Then
'Bloquer les évènements VBA
Application.EnableEvents = False
'Par contre si on efface la cellule "emploi du temps"
'il faut aussi effacer les données sur la ligne
If Target.Column = 7 And Cells(Target.Row, Target.Column).Value = ""
Then
'pour toutes les cellules selectionnées
For Each Cell In Target
Range("h" & Cell.Row & ":ac" &
Cell.Row).SpecialCells(xlCellTypeConstants).Value = ""
Next Cell
End If
Else
'si on inscrit des données (heures ...etc.)
'on rajoute automatiquement l'emploi du temps par défaut
If Cells(Target.Row, 7).Value = "" And _
Target.Column > 7 And _
Cells(Target.Row, 19).Value <> 0 And _
Cells(Target.Row, 5).Value <> "" _
Then
If Cells(Target.Row, 5).Value <> "Jour Férié" And _
Range("JOUR" & Weekday(Cells(Target.Row, 6), vbMonday)).Value =
"Vrai" _
Then
Cells(Target.Row, 7).Value = "Mensualisation"
Else
Cells(Target.Row, 7).Value = "Jour Hors Mensu"
End If
Else
If Cells(Target.Row, 5).Value = "" Then
Cells(Target.Row, Target.Column).Value = ""
Exit Sub
End If
End If
End If
End If
'Re-Débloquer les évènements VBA
Application.EnableEvents = True
End If

End Sub

La ligne qui me pose problème est bien sûr celle-ci:
Cells(Target.Row, Target.Column).Value = ""

Si tu as une idée...n'hésites pas :)


"michdenis" a écrit dans le message de news:

Écoute, il faut se taper tout le fil pour savoir ce que tu veux faire !
Si tu prends le temps de définir ta question correctement, tu auras
plus de chance d'obtenir une réponse qui convient !

Quelle est ta version ? Qu'est-ce que tu tentes de faire ?
Définir la donne de ton problème en publiant une procédure
qui ne fonctionne pas est un peu court pour ceux qui tente de t'aider.

Si tu veux publier ton code, pas de problème mais cela ne doit pas
être un substitut à une définition écrite de ta problématique et de tes
attentes.



"CAT" a écrit dans le message de groupe de discussion :

Je suis en version 2003 d'Excel....
Mais ça ne fonctionne pas chez moi bien que la commande s'exécute.
J'ai mis un point d'arret et je vois bien que l'évènement se produit, mais
l'effacement de la cellule semble être innéficace alors qu'elle que la
commande est bien exécutée.

"michdenis" a écrit dans le message de news:

Bonjour CAT,

De mémoire, la version Excel 2000 se comporte tel que tu le décris.

Pour solutionner ton problème, tu peux insérer une feuille que tu
masqueras avec un bout de code
Worksheets("Nom_De_La_Feuille").visible = xlveryhidden
La feuille ne sera pas accessible par l'usager via l'interface de la
feuille de calcul.
Dans cette feuille, tu choisis une cellule, et tu inscris la formule
suivante :
=MaFeuille!A1
MaFeuille -> nom de la feuille où se trouve ta liste de validation
A1 la cellule qui contient la liste de validation

Et tu insères ta procédure 'Private Sub Worksheet_Change'
dans le module feuille de la feuille que tu viens d'ajouter.
Ceci fera déclencher la procédure événementielle à chaque fois
que tu modifieras dans ta liste de validation.


Exemple ta liste de validation est en Feuil2, cellule D1
Le code dans le module feuille de ta feuil2

Cette procédure est appelée par la procédure événementielle
de la feuille que tu as ajoutée. Tu dois enlever le mot "Private"
à la ligne de déclaration de la procédure :
'----------------------------------
Sub Worksheet_Change(ByVal Target As Range)

Set Target = ActiveCell
Cells(Target.Row, Target.Column).Value = ""

End Sub
'----------------------------------

Dans la feuille que tu as ajoutée et masquée, ce code :
'-----------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = Range("A1").Address Then
Feuil2.Worksheet_Change Target
End If
End Sub
'-----------------------------------------------

Tout ceci n'est qu'un exemple, il peut être adapté selon la
nécessité de ton application.





"CAT" a écrit dans le message de groupe de discussion :
#
Bonjour à tous,

J'ai mit un code dans La macro 'Private Sub Worksheet_Change' qui efface
la
valeur que l'on vient de saisir dans une cellule si la cellule à droite
de
cette dernière est vide. Ce code fonctionne très bien quand je saisie une
valeur manuellement dans la cellule mais ne fonctionne pas si une valeur
est
validée par un clic de souris dans une liste de coix (liste déroulante).

Existe-il une façon pour contourner ce problème ?

Merci pour votre aide.






Avatar
FFO
Rebonjour à toi

Vérifies qu'en colonne 5 (colonne E) il n'y est pas des blancs dans les
cellules ou tout autre caractère invisible ce qui impacterait la condition :

If Cells(Target.Row, 5).Value = ""

Si tel est le cas supprimes les et réessaies

sinon
Remplaces cette ligne :

Cells(Target.Row, Target.Column).Value = ""

Par

Cells(Target.Row, Target.Column).Clear

Peut être mieux

Dis moi !!!!!
Avatar
CAT
Bonjour à tous,

Comme ça fonctionnait chez tout le monde, j'ai refait un test avec un
nouveau classeur et effectivement ça fonctionne aussi bien avec une saisie
clavier que la saisie à la souris dans une liste.
C'est une avancée, maintenant il ne me reste plus qu'à trouver pourquoi ça
ne fonctionne pas sur mon classeur perso.

En tout cas, merci à tous de votre aide.
Bonne journée.

"FFO" a écrit dans le message de news:

Rebonjour à toi

Vérifies qu'en colonne 5 (colonne E) il n'y est pas des blancs dans les
cellules ou tout autre caractère invisible ce qui impacterait la condition
:

If Cells(Target.Row, 5).Value = ""

Si tel est le cas supprimes les et réessaies

sinon
Remplaces cette ligne :

Cells(Target.Row, Target.Column).Value = ""

Par

Cells(Target.Row, Target.Column).Clear

Peut être mieux

Dis moi !!!!!



Avatar
CAT
Bonjour à tous,

Me revoila avec mon problème.
J'ai beau chercher un peu partout dans mon code, je ne trouve pas ce qui
pose problème d'autant que je ne sais pas trop ce que je cherche.

J'ai quand même découvert ceci :
Quand j'ouvre mon classeur seul (sans accepter les liaisons qu'il a avec un
autre classeur et sans ouvrir cet autre classeur) la sélection avec la
souris fonctionne correctement.
Idem si j'ouvre mon classeur en activant les macro, et que j'ouvre le
classeur avec lequel il a des liaisons mais sans activer les macro pour ce
dernier, là aussi la sélection avec la souris fonctionne correctement.
Par contre si je les ouvre tous les 2 en activant les macros, la sélection
avec la souris ne fonctionne plus correctement

Autre info : Quand je trace mon code avec les 2 classeurs ouverts et les
macros activées, la ligne de code qui doit normalement effacer ma cellule
est bien exécutée mais rien ne se passe sur la feuille. La cellule reste
avec sa valeur.

Quelqu'un aurait il une idée de ce que je dois vérifier ?

Merci !

"CAT" a écrit dans le message de news:
%
Bonjour à tous,

Comme ça fonctionnait chez tout le monde, j'ai refait un test avec un
nouveau classeur et effectivement ça fonctionne aussi bien avec une saisie
clavier que la saisie à la souris dans une liste.
C'est une avancée, maintenant il ne me reste plus qu'à trouver pourquoi ça
ne fonctionne pas sur mon classeur perso.

En tout cas, merci à tous de votre aide.
Bonne journée.

"FFO" a écrit dans le message de news:

Rebonjour à toi

Vérifies qu'en colonne 5 (colonne E) il n'y est pas des blancs dans les
cellules ou tout autre caractère invisible ce qui impacterait la
condition :

If Cells(Target.Row, 5).Value = ""

Si tel est le cas supprimes les et réessaies

sinon
Remplaces cette ligne :

Cells(Target.Row, Target.Column).Value = ""

Par

Cells(Target.Row, Target.Column).Clear

Peut être mieux

Dis moi !!!!!







Avatar
CAT
Personne n'a une petite idée pour me débloquer ?


"CAT" a écrit dans le message de news:

Bonjour à tous,

Me revoila avec mon problème.
J'ai beau chercher un peu partout dans mon code, je ne trouve pas ce qui
pose problème d'autant que je ne sais pas trop ce que je cherche.

J'ai quand même découvert ceci :
Quand j'ouvre mon classeur seul (sans accepter les liaisons qu'il a avec
un autre classeur et sans ouvrir cet autre classeur) la sélection avec la
souris fonctionne correctement.
Idem si j'ouvre mon classeur en activant les macro, et que j'ouvre le
classeur avec lequel il a des liaisons mais sans activer les macro pour ce
dernier, là aussi la sélection avec la souris fonctionne correctement.
Par contre si je les ouvre tous les 2 en activant les macros, la sélection
avec la souris ne fonctionne plus correctement

Autre info : Quand je trace mon code avec les 2 classeurs ouverts et les
macros activées, la ligne de code qui doit normalement effacer ma cellule
est bien exécutée mais rien ne se passe sur la feuille. La cellule reste
avec sa valeur.

Quelqu'un aurait il une idée de ce que je dois vérifier ?

Merci !

"CAT" a écrit dans le message de news:
%
Bonjour à tous,

Comme ça fonctionnait chez tout le monde, j'ai refait un test avec un
nouveau classeur et effectivement ça fonctionne aussi bien avec une
saisie
clavier que la saisie à la souris dans une liste.
C'est une avancée, maintenant il ne me reste plus qu'à trouver pourquoi
ça
ne fonctionne pas sur mon classeur perso.

En tout cas, merci à tous de votre aide.
Bonne journée.

"FFO" a écrit dans le message de news:

Rebonjour à toi

Vérifies qu'en colonne 5 (colonne E) il n'y est pas des blancs dans les
cellules ou tout autre caractère invisible ce qui impacterait la
condition :

If Cells(Target.Row, 5).Value = ""

Si tel est le cas supprimes les et réessaies

sinon
Remplaces cette ligne :

Cells(Target.Row, Target.Column).Value = ""

Par

Cells(Target.Row, Target.Column).Clear

Peut être mieux

Dis moi !!!!!












Avatar
isabelle
bonjour Cat,

peut être que un des classeur ouvert met un Application.ScreenUpdating à
false
il faudrait executer cette ligne :
Application.ScreenUpdating = True

isabelle

CAT a écrit :
Personne n'a une petite idée pour me débloquer ?


"CAT" a écrit dans le message de news:


Bonjour à tous,

Me revoila avec mon problème.
J'ai beau chercher un peu partout dans mon code, je ne trouve pas ce qui
pose problème d'autant que je ne sais pas trop ce que je cherche.

J'ai quand même découvert ceci :
Quand j'ouvre mon classeur seul (sans accepter les liaisons qu'il a avec
un autre classeur et sans ouvrir cet autre classeur) la sélection avec la
souris fonctionne correctement.
Idem si j'ouvre mon classeur en activant les macro, et que j'ouvre le
classeur avec lequel il a des liaisons mais sans activer les macro pour ce
dernier, là aussi la sélection avec la souris fonctionne correctement.
Par contre si je les ouvre tous les 2 en activant les macros, la sélection
avec la souris ne fonctionne plus correctement

Autre info : Quand je trace mon code avec les 2 classeurs ouverts et les
macros activées, la ligne de code qui doit normalement effacer ma cellule
est bien exécutée mais rien ne se passe sur la feuille. La cellule reste
avec sa valeur.

Quelqu'un aurait il une idée de ce que je dois vérifier ?

Merci !

"CAT" a écrit dans le message de news:
%

Bonjour à tous,

Comme ça fonctionnait chez tout le monde, j'ai refait un test avec un
nouveau classeur et effectivement ça fonctionne aussi bien avec une
saisie
clavier que la saisie à la souris dans une liste.
C'est une avancée, maintenant il ne me reste plus qu'à trouver pourquoi
ça
ne fonctionne pas sur mon classeur perso.

En tout cas, merci à tous de votre aide.
Bonne journée.

"FFO" a écrit dans le message de news:


Rebonjour à toi

Vérifies qu'en colonne 5 (colonne E) il n'y est pas des blancs dans les
cellules ou tout autre caractère invisible ce qui impacterait la
condition :

If Cells(Target.Row, 5).Value = ""

Si tel est le cas supprimes les et réessaies

sinon
Remplaces cette ligne :

Cells(Target.Row, Target.Column).Value = ""

Par

Cells(Target.Row, Target.Column).Clear

Peut être mieux

Dis moi !!!!!
















Avatar
FPinton
WHOAaaa !!!! Ca marche.....
Franchement "total respect" Isabelle, tu viens de solutionner mon problème.
A+

"isabelle" a écrit dans le message de news:

bonjour Cat,

peut être que un des classeur ouvert met un Application.ScreenUpdating à
false
il faudrait executer cette ligne :
Application.ScreenUpdating = True

isabelle

CAT a écrit :
Personne n'a une petite idée pour me débloquer ?


"CAT" a écrit dans le message de news:


Bonjour à tous,

Me revoila avec mon problème.
J'ai beau chercher un peu partout dans mon code, je ne trouve pas ce qui
pose problème d'autant que je ne sais pas trop ce que je cherche.

J'ai quand même découvert ceci :
Quand j'ouvre mon classeur seul (sans accepter les liaisons qu'il a avec
un autre classeur et sans ouvrir cet autre classeur) la sélection avec
la souris fonctionne correctement.
Idem si j'ouvre mon classeur en activant les macro, et que j'ouvre le
classeur avec lequel il a des liaisons mais sans activer les macro pour
ce dernier, là aussi la sélection avec la souris fonctionne
correctement.
Par contre si je les ouvre tous les 2 en activant les macros, la
sélection avec la souris ne fonctionne plus correctement

Autre info : Quand je trace mon code avec les 2 classeurs ouverts et les
macros activées, la ligne de code qui doit normalement effacer ma
cellule est bien exécutée mais rien ne se passe sur la feuille. La
cellule reste avec sa valeur.

Quelqu'un aurait il une idée de ce que je dois vérifier ?

Merci !

"CAT" a écrit dans le message de news:
%

Bonjour à tous,

Comme ça fonctionnait chez tout le monde, j'ai refait un test avec un
nouveau classeur et effectivement ça fonctionne aussi bien avec une
saisie
clavier que la saisie à la souris dans une liste.
C'est une avancée, maintenant il ne me reste plus qu'à trouver pourquoi
ça
ne fonctionne pas sur mon classeur perso.

En tout cas, merci à tous de votre aide.
Bonne journée.

"FFO" a écrit dans le message de news:


Rebonjour à toi

Vérifies qu'en colonne 5 (colonne E) il n'y est pas des blancs dans
les
cellules ou tout autre caractère invisible ce qui impacterait la
condition :

If Cells(Target.Row, 5).Value = ""

Si tel est le cas supprimes les et réessaies

sinon
Remplaces cette ligne :

Cells(Target.Row, Target.Column).Value = ""

Par

Cells(Target.Row, Target.Column).Clear

Peut être mieux

Dis moi !!!!!


















1 2