Forcer une cellule à conserver sa valeur

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Magic_Doctor

XLDnaute Barbatruc
Supporter XLD
Bonjour,

Dans une feuille j'ai un certain nombre de cellules dont les saisies sont sous le contrôle d'une macro événementielle qui fait apparaître "? ? ?" quand la saisie est erronée.
Si, dans une de ces cellules, apparaît "? ? ?", toutes les autres se bloquent jusqu'à correction de l'erreur. Autrement dit, quand on y rentre une valeur (erronée ou pas), la valeur est refusée et automatiquement la cellule où se trouve "? ? ?" est sélectionnée.
Faute de mieux, quand la valeur est refusée, la cellule se vide. En fait, ce que je voudrais c'est que la cellule conserve sa valeur précédente.
Ex. : j'introduis une valeur erronée dans une de ces cellules, apparaît "? ? ?".
Je veux rentrer dans une autre cellule qui contenait, par exemple, la valeur 50, la valeur 30, 30 sera refusé et la valeur 50 restera affichée.
Tout marche, ma foi, très bien sauf ce dernier point que je n'ai pas réussi à résoudre.

Ci-joint un classeur avec un exemple.

Merci de votre aide.
 

Pièces jointes

Re : Forcer une cellule à conserver sa valeur

Bonjour Magic_Doctor,

voici un exemple :
Code:
[COLOR=Red][B]Private memCellule As Variant[/B][/COLOR]

[COLOR=Red][B]Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If Not Application.Intersect(Target, Range("DilNbUXFl1, DilVolS1a, DilNbGrS1a, DilNbUXParGr1a, DilNbUXGet1a")) Is Nothing Then
     'mémoriser la valeur de la cellule sélectionnée
     memCellule = Target.Value
 End If
 End Sub[/B][/COLOR]

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)
    Cancel = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cellRecherche
'Magic_Doctor
'Macros événementielles pour le contrôle des saisies

If Not Application.Intersect(Target, Range("DilNbUXFl1, DilVolS1a, DilNbGrS1a, DilNbUXParGr1a, DilNbUXGet1a")) Is Nothing Then
    Application.EnableEvents = False
    
[COLOR=Red][B]    'chercher si une des cellules de la colonne D contient "? ? ?"
    Set cellRecherche = Range("D:D").Find("? ? ?", , xlValues, xlWhole)
    
    'si on a trouvé "? ? ?" dans une des cellule, remettre l'ancienne valeur dans la cellule active et quitter la macro
    If Not cellRecherche Is Nothing Then
        Target.Value = memCellule
        GoTo fin
    End If[/B][/COLOR]
    
    On Error Resume Next
          
    'Pour en venir à bout de l'épineux problème des cellules fusionnées
    If Target = [DilNbUXFl1] Then
      If Target.Value = "" Then GoTo fin
    End If
    
    'Vérifie si l'une des cellules de saisies contient "? ? ?"
    Call VerifBourde1
    If ControlBourde1 = 1 Then Target.Value = "": Range(NomCelda1).Select: GoTo fin
        
    'Si la saisie est erronée (Y COMPRIS LA VALEUR 0) --> "? ? ?"
    If ControleSaisie(Target, 1) = 1 Then Target = "? ? ?"
    
    Target.Select
End If

'                             ***************************************

If Not Application.Intersect(Target, Range("DilNbUXGet1a")) Is Nothing Then
    Application.EnableEvents = False
    
    'Si la saisie est erronée (LA VALEUR 0 EST EN REVANCHE AUTORISÉE) --> "? ? ?"
    If ControleSaisie(Target, 0) = 1 Then Target = "? ? ?"
    Target.Select
End If

fin:
Application.EnableEvents = True
End Sub
a+
 

Pièces jointes

Re : Forcer une cellule à conserver sa valeur

Merci infiniment mromain pour ta précieuse aide,

J'ai fait une synthèse de ta solution et de ce que j'avais déjà fait + quelques modifications :
- ne pas être assujetti au nom de colonnes (Range("D😀")) ;
- faire en sorte que lorsque les cellules sont bloquées et que l'on s'entête à vouloir y rentrer une donnée, non seulement la valeur avant l'erreur persiste, mais automatiquement la cellule sujette à l'erreur (celle avec "? ? ?") est sélectionnée.

Si tu me lis (ou un autre) pourrais-tu m'expliquer la syntaxe de cette fonction VBA que je ne connaissais pas, à savoir : Find.
Dans l'aide j'ai regardé les paramétrages de cette fonction, à part "What" qui est évidemment obligatoire, tous les autres sont optionnels.
Tu avais écrit : Find("? ? ?", , xlValues, xlWhole).
Tu as omis "After", j'ai je pense compris sa signification.
"LookIn", je pense avoir compris et tu as mis "xlValues".
En revanche, "LookAt" avec "xlWhole"... pas compris du tout.

Je me suis hasardé à écrire tout simplement : Find("? ? ?")
Ma foi ça marche. Est-ce que ça peut avoir quelque conséquence ?

Ci-joint le classeur actualisé.

Bonne fin d'après-midi.
 

Pièces jointes

Re : Forcer une cellule à conserver sa valeur

Je me suis hasardé à écrire tout simplement : Find("? ? ?")
Ma foi ça marche. Est-ce que ça peut avoir quelque conséquence ?

Re bonjour,

Pas grand chose en fait (dans ton cas).
Il s'agit de la propriété LookAt qui peut prendre comme valeur :
- xlWhole, qui cherchera le texte exact (on ne trouvera pas "? ? ? toto")
- xlPart, qui cherchera le texte "approximatif" (on trouvera "? ? ? toto")

a+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour