bloquer contenu textbox une fois modifiée

Jessssss

XLDnaute Nouveau
Bonjour le forum!

dans mon userform (qui s'ouvre en double cliquant sur une case), j'ai une textbox1 remplie par défaut par la valeur "Monsieur Machin". l'utilisateur peut modifier cette valeur à souhaits!
quand l'utilisateur ferme l'userform en cliquant sur le CommandButton1, la valeur de textbox1 est reportée dans le tableur. quand on rouvre le formulaire, il se charge des valeurs déjà saisies et la valeur de la textbox1 peut à nouveau etre changée.
cependant je souhaiterais que l'utilisateur du formulaire ne puisse modifier la valeur de la textbox1 qu'une seule fois, donc remplacer "Monsieur Machin" par "Monsieur Bidule". je voudrais que l'utilisateur puisse rouvrir le formulaire par la meme manip et qu'il puisse changer les autres textbox sauf la textbox1, modifiée déjà une fois.

j'ai regardé les autres fils qui parlent de "textbox1.locked" mais je n'arrive pas vraiment à l'utiliser.

voici la partie de ma macro concernant la textbox1:

Private Sub CommandButton1_Click()
ActiveSheet.Cells(LigneNOM, 3).Value = TextBox1.Text
UserForm1.Hide
Unload UserForm1
End Sub

Private Sub userform_initialize()
UserForm1.TextBox1.Text = ActiveSheet.Range("C" & ActiveCell.Row).Value
End sub



quelqu'un pourrait-il me dire comment résoudre mon problème? me suis-je exprimée clairement? :eek:

je vous remercie! bonne soirée
 

jp14

XLDnaute Barbatruc
Re : bloquer contenu textbox une fois modifiée

Bonsoir Jessssss
Bonsoir tototiti2008

A priori il existe des données supplémentaires à rentrer, "les autres textbox sauf la textbox1" Il faudrait utiliser une information non saisie au départ ( mais qui est obligatoire pour valider la saisie) pour verrouiller la saisie en écrivant
Textbox1.enabled= false
Textbox1.locked= true
ce qui fera apparaitre la valeur sans possibilité de la modifier.

JP
 

Pierrot93

XLDnaute Barbatruc
Re : bloquer contenu textbox une fois modifiée

Bonsoir jess, tototiti, jp

peut être comme ceci, un message demandant la confirmation lors de la sortie de la "textbox" :

Code:
Option Explicit
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If MsgBox("confirmez vous la saisie ?", vbYesNo) = vbYes Then
    With TextBox1
        .Enabled = False
        .Locked = True
    End With
End If
End Sub


bonne soirée
@+
 

job75

XLDnaute Barbatruc
Re : bloquer contenu textbox une fois modifiée

Bonjour à tous,

Pour savoir si la cellule en colonne C a été modifiée, il faut compter le nombre de modifications en les mémorisant dans la feuille, en colonne D par exemple :

Code:
Private Sub CommandButton1_Click()
Dim ref As Range
Set ref = ActiveSheet.Cells(LigneNOM, 3)
If TextBox1.Text <> "" And TextBox1.Text <> ref.Value Then
ref.Value = TextBox1.Text
[COLOR="Red"]ref.Offset(0, 1).Value = ref.Offset(0, 1).Value + 1[/COLOR]
End If
UserForm1.Hide
Unload UserForm1
End Sub

Private Sub Userform_Initialize()
Dim ref As Range
Set ref = ActiveSheet.Range("C" & ActiveCell.Row)
TextBox1.Text = ref.Value
TextBox1.Locked = ([COLOR="Red"]ref.Offset(0, 1).Value > 1[/COLOR])
End sub

Avec le test If, le texte colonne C ne peut pas être effacé à partir de l'USF.

A+

Edition : revu les codes en simplifiant
 
Dernière édition:

jp14

XLDnaute Barbatruc
Re : bloquer contenu textbox une fois modifiée

Bonjour

Ci dessous un fichier avec une macro pour modifier une fois et une seule le contenu d'une cellule avec un textbox.
Pour mémoriser la modification j'utilise un code ascii non affichable et non imprimable. Ce code est ajouté à droite de la valeur.
Le code ascii peut être des espaces , le code 160 ou autre en fonction de la police de caractères utilisée.
J'ai essayé l'apostrophe positionnée à gauche, mais je n'ai pas réussi à la détecter.

A tester

JP
 

Pièces jointes

  • verouillertextbox.zip
    15 KB · Affichages: 163

Fo_rum

XLDnaute Accro
Re : bloquer contenu textbox une fois modifiée

Salut,

à tester
Code:
Dim Ligne As Long
Private Sub Userform_initialize()
  Ligne = ActiveCell.Row
  TextBox1.Text = ActiveSheet.Range("C" & Ligne).Value
End Sub
Private Sub CommandButton1_Click()
  '[COLOR="SeaGreen"][COLOR="Green"]test sur la cellule O... (15 peut se changer bien sûr)[/COLOR][/COLOR]
  If Cells(Ligne, 3).Offset(, 15) = "" Then
    Cells(Ligne, 3).Offset(, 15) = 1[COLOR="Green"] '1 ou autre chose : non vide pour éviter le changement[/COLOR]
    Cells(Ligne, 3) = TextBox1.Value
  Else
    TextBox1 = ActiveSheet.Range("C" & Ligne)
    MsgBox "Changement refusé !", , "Attention,"
  End If
  Unload UserForm1
End Sub
 

Jessssss

XLDnaute Nouveau
Re : bloquer contenu textbox une fois modifiée

;)Bonjour tout le monde et merci pour vos réponses! j'ai testé toutes les solutions que vous avez évoquées mais rien ne marche...

Fo_rum : ta solution me plait mais par défaut dans la Cells(Ligne, 3), il est inscrit "Monsieur Machin". la macro que tu me donnes bloque tout changement alors qu'à la base je ne veux en autoriser un seul et bloquer les suivants afin que l'utilisateur puisse incrire "Monsieur Truc" et ne plus le changer après. sinon le coup du message d'erreur est super...;)


tototiti : je n'arrive pas à mettre en forme la macro mais je sais que ça peut marcher si vous m'aidez un peu plus dans la construction de la macro.;)

JP14: je ne trouve pas d'userform ni de commandbutton dans le document que tu as posté...:confused:

Pierrot 93: ta macro est super aussi sauf qu'elle demande une simple confirmation alors que je souhaite autoriser un seul et unique changement...:eek:

job75 : ta solution pourrait me convenir sauf que je ne peux absolument pas rajouter insérer une colonne supplémentaire car j'en ai déjà 80 qui reçoivent toutes des données de l'userform...ça m'obligerait à tout revoir...:eek:


pourriez vous m'aider davantage les amis?

merci pour votre temps!
 

Pierrot93

XLDnaute Barbatruc
Re : bloquer contenu textbox une fois modifiée

Bonjour,

peut être une autre approche comme suit, si j'ai bine compris....

Code:
Option Explicit
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With TextBox1
    If .Value <> .Tag Then
        .Enabled = False
        .Locked = True
    End If
End With
End Sub
Private Sub UserForm_Initialize()
With TextBox1
    .Value = Range("A1").Value
    .Tag = .Value
End With
End Sub

@+
 

Fo_rum

XLDnaute Accro
Re : bloquer contenu textbox une fois modifiée

Salut,

essaie en changeant comme indiqué en gras
Code:
Private Sub CommandButton1_Click()
  If Cells(Ligne, 3).Offset(, 15) [B]< 2[/B]Then
   [B] Cells(Ligne, 3).Offset(, 15) = IIf(Cells(Ligne, 3).Offset(, 15) = 1, 2, 1)[/B]
    Cells(Ligne, 3) = TextBox1.Value
  Else
    TextBox1 = ActiveSheet.Range("C" & Ligne)
    MsgBox "Changement refusé !", , "Attention,"
  End If
  Unload UserForm1
End Sub
 

Jessssss

XLDnaute Nouveau
Re : bloquer contenu textbox une fois modifiée

Bonjour!

Pierrot93, JP14, Fo_rum,

J’ai essayé vos solutions mais rien n'y fait... j'ai suivi à la lettre vos macros mais sans succès...de quoi s’arracher les cheveux

La macro de Fo_rum est pas mal mais elle n'empêche pas les changements des cellules de la colonne C et n'ouvre pas la box de message d'erreur.

Mais peut être que c'est moi qui ne suis pas claire dans ce que je demande :

-Dans ma colonne C, il y a écrit dans toutes les cellules "Monsieur Machin" par défaut.
-Quand on doucle clique sur une cellule "Monsieur Machin", l'userform s'ouvre
-Dans l’userform, plusieurs champs sont à remplir, dont la textbox1 qui reprend par défaut la valeur de la cellule de la colonne C à savoir "Monsieur Machin".
-Je voudrais que l'utilisateur du formulaire change cette textbox1 par un "Monsieur..."(de son choix)
-Une fois que l'userform est fermé avec le commandbutton1, cette modification est donc enregistrée et reportée dans cellule de la colonne C
-Si l'utilisateur souhaite rouvrir l'userform, il double clique à nouveau sur le "Monsieur..." qu'il vient d'enregistrer. il peut faire toutes les modif dans les autres textbox et combobox. seulement il lui est interdit de toucher au contenu de la textbox 1. il faut donc interdire un nouveau changement une fois que « Monsieur Machin » est remplacé par un « Monsieur… »

Voici ce que j'ai saisi ds VBA, mais avec mes explications peut-être que je dois modifier quelque chose ? :

Private Sub CommandButton1_Click()

If Cells(LigneSociete, 3).Offset(, 15) < 2 Then
Cells(LigneSociete, 3).Offset(, 15) = IIf(Cells(LigneSociete, 3).Offset(, 15) = 1, 2, 1)

Cells(LigneSociete, 3) = TextBox1.Value
Else
TextBox1 = ActiveSheet.Range("C" & LigneSociete)
MsgBox "Changement refusé !", , "Attention,"
End If
End sub

Private Sub Userform_initialize()

LigneSociete = ActiveCell.Row
TextBox1.Text = ActiveSheet.Range("C" & ActiveCell.Row).Value

End Sub


merci pour votre aide! j'attends vos lumières une nouvelle fois!
 

Jessssss

XLDnaute Nouveau
Re : bloquer contenu textbox une fois modifiée

erreur, "Ligne Societe" est en fait "LigneNom" donc voici à nouveau ma macro (qui ne marche pas mieux!)

Private Sub CommandButton1_Click()

If Cells(LigneNom, 3).Offset(, 15) < 2 Then
Cells(LigneNom, 3).Offset(, 15) = IIf(Cells(LigneNom, 3).Offset(, 15) = 1, 2, 1)

Cells(LigneNom, 3) = TextBox1.Value
Else
TextBox1 = ActiveSheet.Range("C" & LigneNom)
MsgBox "Changement refusé !", , "Attention,"
End If
End sub

Private Sub Userform_initialize()

LigneSociete = ActiveCell.Row
TextBox1.Text = ActiveSheet.Range("C" & ActiveCell.Row).Value

End Sub


c'est plus cohérent ainsi! j'attends votre aide!
 

Jessssss

XLDnaute Nouveau
Re : bloquer contenu textbox une fois modifiée

Private Sub CommandButton1_Click()

If Cells(LigneNom, 3).Offset(, 15) < 2 Then
Cells(LigneNom, 3).Offset(, 15) = IIf(Cells(LigneNom, 3).Offset(, 15) = 1, 2, 1)

Cells(LigneNom, 3) = TextBox1.Value
Else
TextBox1 = ActiveSheet.Range("C" & LigneNom)
MsgBox "Changement refusé !", , "Attention,"
End If
End sub

Private Sub Userform_initialize()

LigneNom = ActiveCell.Row
TextBox1.Text = ActiveSheet.Range("C" & ActiveCell.Row).Value

End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 497
Messages
2 088 984
Membres
103 998
dernier inscrit
Gotteland