Problème suppression de valeur

Résolu
free.rage Messages postés 22 Date d'inscription lundi 4 juin 2007 Statut Membre Dernière intervention 14 juin 2016 - Modifié par free.rage le 13/06/2016 à 18:03
free.rage Messages postés 22 Date d'inscription lundi 4 juin 2007 Statut Membre Dernière intervention 14 juin 2016 - 14 juin 2016 à 00:08
Bonjour à tous,

Cela fait lontemps que je ne pratique plus le VBA mais là j'en ai besoin et je bloque sur ce problème : lorsque l'on supprime le contenu du taux dollar (case F29) sans éditer son contenu (soit avec la touche suppr sans 'rentrer' dans la case) cela provoque une erreur.

Je souhaite empêcher mes utilisateurs de supprimer le taux dollar (en F29) dans une feuille de calcul.
Ils doivent pouvoir le modifier mais pas le supprimer.

J'ai fait ce code qui fonctionne tant que l'utilisateur n'utilise pas la touche 'suppr' lorsqu'il sélectionne la case :
Dim Old_dollar

Private Sub Worksheet_Change(ByVal c As Range)

If c.Address = "$F$29" And Range(c.Address).Value = vbNullString Then
ret = MsgBox("Le taux dollar est obligatoire, veuillez saisir le dernier communiqué. Si vous ne le connaissez pas, rapprochez vous du SDM.", vbOKOnly, "Taux dollar obligatoire")
c.Value = Old_dollar
End If

End Sub

Private Sub Worksheet_SelectionChange(ByVal c As Range)

If c.Address = "$F$29" Then Old_dollar = c.Value

End Sub



Est-ce que vous sauriez m'aider ?

Merci d'avance.

5 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 juin 2016 à 19:13
Bonjour,
1) je déplace cette discussion, ouverte dans le forum général de Visual Basic, ver(s le sous-forum (VBA) où elle aurait dû l'être.
Prends s'il te plait dorénavant ce soin toi-même.
2)l'ensemble de tes deux procédures provoque bien évidemment une boucle sans fin de msgbox si Old_dollar n'a pas encore été initialisé (et non lorsque tu utilises la touche SUPPR !). C'est tellement évident !
0
free.rage Messages postés 22 Date d'inscription lundi 4 juin 2007 Statut Membre Dernière intervention 14 juin 2016
13 juin 2016 à 20:55
Bonsoir ucfoutu,

Merci pour tes commentaires.

En ce qui concerne la solution évidente, comme je l'indiquait, il y a une valeur par défaut dans la page au taux dollar. Je veux que celle-ci soit modifiable donc pour la modifier l'utilisateur sélectionne cette case et donc fixe la valeur de Old_dollar.
De plus, le deboggeur s'arrête sur : If c.Address = "$F$29" And Range(c.Address).Value = vbNullString Then et indique erreur 458 : Cette variable utilise un type Automation non géré par Visual Basic.

Sur tes conseils j'ai tenté tout de même de fixer la variable préalablement, mais cela ne change rien.

Merci donc à ceux qui peuvent m'aider.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 juin 2016 à 21:59
1) tu n'as pas typé la variable Old_dollar
2)
il y a une valeur par défaut dans la page au taux dollar

je ne vois pas où ! Je vois au contraire (ton code) que la variable Old_dollar, déclarée par Dim Old_dollar, n'est pas initialisée et est donc vide
3)
De plus, le deboggeur s'arrête sur : If c.Address = "$F$29" And Range(c.Address).Value = vbNullString Then et indique erreur 458 : Cette variable utilise un type Automation non géré par Visual Basic
.
Pas chez moi !!!!! Et cela tend à montrer que tu as fait quelque_chose en tripotant une constante (ce qu'est vbNullString) !
A moins que le code montré ne soit pas celui que tu as écrit, ou encore que tu n'aies pas tout dit et que tu "pilotes" Excel depuis une autre appli.
Je répète donc :
ton code, TEL QUEL, ne provoque aucune erreur, mais tourne en boucle (de msgbox) si la cellule F29 est vide au départ et que, y entrant, tu appuies alors sur SUPPR. Et cela, pour une raison plus qu'évidente.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 13/06/2016 à 22:24
Je te fais par ailleurs observer que cet évènement :
Private Sub Worksheet_SelectionChange(ByVal c As Range)

If c.Address = "$F$29" Then Old_dollar = c.Value

End Sub

n'intervient en aucune manière si tu es déjà, d'entrée de jeu, sur la cellule F29 ===>> et donc Old_dollar n'est alors pas initialisée (et donc vide) ===>> et donc en appuyant sur SUPPR, tu déclenches l'évènement Change ===>> msgbox===>> cela remplace par du vide ==>> msgbox ===>>> et ainsi à l'infini !

Tu ferais peut-être (c'est également évident) bien d'affecter sa valeur à Old_dollar dès l'ouverture de ton classeur ou, au plus tard, lors de l'activation de ta feuille, quitte à la modifier ensuite dans l'évènement selection_change !
Ou encore, d'activer n'importe quelle autre cellule (surtout pas la F29) à l'activation de ta feuille ....
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
free.rage Messages postés 22 Date d'inscription lundi 4 juin 2007 Statut Membre Dernière intervention 14 juin 2016
14 juin 2016 à 00:08
Re ucfoutu,

Merci encore pour tes réponses.

Lorsque j'indiquais que : il y a une valeur par défaut dans la page au taux dollar, je voulais dire que la case F29 contient toujours une valeur. En fait c'est mon but d'empêcher quelqu'un de la supprimer.

Mais effectivement, si la personne sauvegarde son document en étant sur cette case, et qu'il la réouvre et appuie sur suppr. Le code en l'état pose problème. Et je résoudrais ce problème en fixant la valeur au worksheet_activate.

Finalement, tu m'as bien aidé puisque j'ai retesté mon code sur une feuille vierge et je me suis rendu compte que le problème était lié au fait que la case F29 était fusionnée avec la G29.
Le code fonctionne finalement comme attendu. A la remarque ci-dessus près.
0
Rejoignez-nous