XL 2010 Bloquer le contenu d'une cellule

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

J'ai une cellule dans laquelle il y a une valeur.
Suivant les circonstances je voudrais bloquer cette cellule.
Quand je veux que la cellule soit bloquée, j'ai une variable "Public" : "blocage" qui est alors = 1. Dans le cas contraire elle est = 0).
Supposons que dans cette cellule il y ait la valeur 25. Si, suivant la circonstance, la valeur de la cellule est bloquée, quoi que j'introduise dans cette cellule la valeur reste toujours 25, jusqu'à ce que blocage = 0.
Bizarrement, je ne parviens pas à résoudre ce problème qui à priori paraît simple.
Peut-être faut-il mémoriser, avant saisie, la valeur qui se trouve déjà dans la cellule ?

Merci pour toute réponse.
 

job75

XLDnaute Barbatruc
Bonjour Magic_Doctor,

Plutôt qu'une variable Public il vaut mieux un nom défini :
Code:
Sub Bloque()
With ThisWorkbook.Names
  If IsError([blocage]) Then .Add "blocage", True Else .Add "blocage", Not [blocage]
End With
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Target, [B2:C2,E2]) Is Nothing Then _
  If Not IsError([blocage]) Then _
    If [blocage] Then Application.Undo
Application.EnableEvents = True
End Sub
Bien sûr [B2:C2,E2] est à adapter.

Bonne journée.
 

Pièces jointes

  • Bloque(1).xlsm
    20.6 KB · Affichages: 40

Magic_Doctor

XLDnaute Barbatruc
Bonjour job, le forum,

Je suis à la fois surpris de la "complexité" de la solution à ce problème, ma foi, d'apparence simple, et du peu de commentaires à ce fil. À croire que ma question est surréaliste... Pourtant, figer dans certaines conditions le contenu de cellules, là où il n'y a que des cellules... Apparemment ça n'arrive qu'à moi !
Merci pour ton aide précieuse et incontournable. Ça marche très bien.
Seulement, persiste un problème tout bête. Dans mon projet le blocage/déblocage ne se fait pas à partir de la feuille (où je reconnais que là je n'ai absolument rien compris avec la formule et le shape de la cellule "G2") mais dans les macros mêmes. J'ai essayé de résoudre ce problème au travers de diverses tentatives hasardeuses qui ont toutes débouché sur un lamentable échec.
Comment s'y prendre ?

A+
 

Pièces jointes

  • Bloque(2).xlsm
    16.6 KB · Affichages: 38

Si...

XLDnaute Barbatruc
salut

Un exemple plus classique : le blocage et la libération se font par macros appelées (ici) dans d’autres onglets en utilisant une variable déclarée en Public comme tu le voulais (non ?).

Nota : tu as déjà eu maille à partir avec les Noms :eek:
 

Pièces jointes

  • Changements bloqués ou pas.xlsm
    27 KB · Affichages: 38

job75

XLDnaute Barbatruc
Re, hello Si...,

Si Magic_Doctor tient à sa variable Public et préfère un bouton ActiveX.

Dans ThisWorkbook :
Code:
Private Sub Workbook_Open()
blocage = Feuil1.CommandButton1.Caption = "Débloquer"
End Sub
Dans Feuil1 :
Code:
Private Sub CommandButton1_Click()
blocage = Not blocage
CommandButton1.Caption = IIf(blocage, "Débloquer", "Bloquer")
CommandButton1.BackColor = IIf(blocage, &H8080FF, &H80FF80) 'rouge, vert
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Target, [B2:C2,E2]) Is Nothing Then _
  If blocage Then Application.Undo
Application.EnableEvents = True
End Sub
Fichier (2).

A+
 

Pièces jointes

  • Bloque(2).xlsm
    26 KB · Affichages: 32

Magic_Doctor

XLDnaute Barbatruc
Re,

Pour faire simple, je donnais un exemple simple. Mais en fait ça paraît plus compliqué que prévu.
job, je pense quand même avoir commencé à comprendre ce qu'est un nom défini. Quant à la variable "Public", c'était une idée pour tâcher de résoudre le problème et non une question d'honneur. Quelle que soit la méthode pour y parvenir : j'achète !
Enfin, je ne veux aucun bouton ActiveX.

Je résume ce que je veux exactement faire sur ma feuille (il n'y en aura qu'une dans le classeur).
J'ai 5 cellules ([B2:B5,D2]) qui recueillent des données.
La cellule "B9" récupère automatiquement la valeur de la cellule "D2".
Disons que dans ce cas de figure les cellules [B2:B5,D2] prennent la main, et une variable booléenne déclarée en Public et qui est nommée "blocage" est, à ce moment là, "False".
Si je modifie la valeur de la cellule "B9", celle-ci prend alors la main et les cellules [B2:B5,D2] deviennent toutes grises pour signaler à l'utilisateur qu'elles sont dès lors bloquées (quoi qu'on y entre, les cellules conservent leur valeur). À ce moment-là la variable "blocage" devient "True".
En cliquant sur la cellule "RESET" (macro événementielle), les cellules [B2:B5,D2] reprennent leur couleur d'origine (blanche), elles se débloquent (on peut y rentrer de nouvelles valeurs) et la variable "blocage" redevient "False".
Jusqu'à présent tout marche fort bien, sauf que je ne parviens toujours pas, dans ma feuille, à bloquer la plage [B2:B5,D2].

Tal vez, hasta mañana
 

Pièces jointes

  • Changements bloqués ou pas 3.xlsm
    16 KB · Affichages: 32
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Magic_Doctor, le forum,

Ton fichier en retour avec :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If (Not Intersect(Target, [B9]) Is Nothing Or blocage) And Not Intersect(Target, [B2:B5,D2]) Is Nothing Then
        Application.Undo
    ElseIf Not Intersect(Target, [B9]) Is Nothing Then
        [B2:B5,D2].Interior.Color = 11521233 'gris
        blocage = True
    ElseIf Not Intersect(Target, [D2]) Is Nothing Then
        [B9] = [D2]
    End If
    Application.EnableEvents = True
End Sub
La variable blocage doit être initialisée à l'ouverture :
Code:
Private Sub Workbook_Open()
blocage = Feuil1.[B2].Interior.Color = 11521233 'gris
End Sub
Bonne journée.
 

Pièces jointes

  • Changements bloqués ou pas(1).xlsm
    23.5 KB · Affichages: 28

job75

XLDnaute Barbatruc
Re,

Cela dit les couleurs constituent un bon repérage*, pas besoin de la variable blocage :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If (Not Intersect(Target, [B9]) Is Nothing Or [B2].Interior.Color = 11521233) And Not Intersect(Target, [B2:B5,D2]) Is Nothing Then
        Application.Undo
    ElseIf Not Intersect(Target, [B9]) Is Nothing Then
        [B2:B5,D2].Interior.Color = 11521233 'gris
    ElseIf Not Intersect(Target, [D2]) Is Nothing Then
        [B9] = [D2]
    End If
    Application.EnableEvents = True
End Sub
*A condition que l'utilisateur ne passe pas son temps à bricoler les couleurs...

Fichier (2).

A+
 

Pièces jointes

  • Changements bloqués ou pas(2).xlsm
    22.5 KB · Affichages: 34

job75

XLDnaute Barbatruc
Re,

Mais j'ai déjà dit que je préférais un nom défini :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    On Error Resume Next 'si le nom n'existe pas
    If (Not Intersect(Target, [B9]) Is Nothing Or [blocage]) And Not Intersect(Target, [B2:B5,D2]) Is Nothing Then
        Application.Undo
    ElseIf Not Intersect(Target, [B9]) Is Nothing Then
        ThisWorkbook.Names.Add "blocage", True, Visible:=False 'nom masqué
    ElseIf Not Intersect(Target, [D2]) Is Nothing Then
        [B9] = [D2]
    End If
    Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, [G2]) Is Nothing Then
        ThisWorkbook.Names.Add "blocage", False, Visible:=False 'nom masqué
        Application.EnableEvents = False
        [B9] = [D2]
        Application.EnableEvents = True
    End If
End Sub
L'intérêt du nom défini (masqué) est double :

- l'état du blocage est mémorisé durablement

- on peut l'utiliser dans la feuille de calcul, par exemple via une MFC dans le fichier joint.

L'utilisateur aura des difficultés s'il veut bricoler les couleurs...

A+
 

Pièces jointes

  • Changements bloqués ou pas et MFC(1).xlsm
    23.4 KB · Affichages: 31
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Bonjour job, le forum,

¡Por fin! ¡Bravo!

Tu as enfin réglé ce problème qui me bloquait (ce qui est est de circonstance...).
Tes 2 dernières routines marchent parfaitement. J'ai retenu la dernière qui est nettement plus pratique et qui dispense de la variable "Public" "blocage".
Mais, évidemment, ça ne marchait pas dans ma procédure.
J'ai passé 2 plombes à essayer de comprendre pourquoi. En dépit "del tiempo de mierda" qu'il fait ici (3 mois de froid + pluie incessants... De juin à septembre, oublier ces latitudes !), j'ai fini par avoir chaud !
J'ai enfin trouvé le problème, sans vraiment comprendre pourquoi il foutait le caca.
Dans la rubrique "Private Sub Worksheet_Change(ByVal Target As Range)" il y avait une sentence bien pratique que tu m'avais concoctée :
"If Not Intersect(Target, [bigplage]) Is Nothing And Target.Count = 1 Then If Target.Font.Color = 12611584 Then Target.Select"
Pour les curieux qui passeraient par là, elle permet de maintenir la sélection de n'importe quelle cellule dont la police est bleue de la zone de travail nommée ([bigplage]) après y avoir entré quelque chose et l'avoir validée.
J'ai dû donc virer cette sentence. Tant pis, je terminerai à chaque fois, pour les cellules en question, par "Target.Select".

Bon, en tout cas merci pour avoir résolu ce truc apparemment si simple mais en fait loin de l'être.

A+
 

Magic_Doctor

XLDnaute Barbatruc
Pas rafraîchi... pas vu ton dernier post

Je vais le regarder de plus près.
Concernant les couleurs, elles seront figées. Faut rester calme !
La seule couleur qui pourra changer, selon les desiderata, sera celle du fond de la feuille, via ce que tu avais fait il y a déjà un certain temps, dans un fil qui, si je me souviens bien, s'intitule "Toile de Fond". Personnellement, je ne conçois plus une feuille avec un fond blanc qui finit par cramer la rétine.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re,
La seule couleur qui pourra changer, selon les desiderata, sera celle du fond de la feuill
Justement avec la MFC du post #11 cela peut se faire à tout moment sans problème.

Edit : et pour maintenir les couleurs des cellules B9 et G2 il suffit de les appliquer par MFC avec la formule =VRAI

A+
 

Pièces jointes

  • Changements bloqués ou pas et MFC(2).xlsm
    23.2 KB · Affichages: 23
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Bonsoir job, le forum,

J'ai l'impression que la routine que tu avais développée dans ce fil qui s'intitulait, si je me souviens bien, "Toile de fond" ou un truc dans ce genre, va nettement plus loin en épargnant tous les tableaux y compris de nouveaux (pour les stakhanovistes des tableaux...). Pas besoin de reprogrammer à chaque fois. C'est du définitif !
Ta solution du post #10 me semble en fait la plus simple. En tout cas elle fonctionne parfaitement.
Quant aux couleurs. Ici, elles seront figées une fois pour toutes.

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 195
Messages
2 086 082
Membres
103 113
dernier inscrit
jlaussenac