XL 2016 Bloquer une cellule si vide

Willystic

XLDnaute Nouveau
Bonjour,
1589399355636.png

Après remplissage de ce petit tableau [H9;S9], je cherche à interdire l’écriture sur les cellules grisées. Elles sont grises car leurs valeurs est "".
J'ai essayé avec du if , du intersetec mais je bloque.
pouvez-vous m'aider svp?
Merci.
 

Pièces jointes

  • 1589399142686.png
    1589399142686.png
    22.7 KB · Affichages: 9

Willystic

XLDnaute Nouveau
Bonjour,
J'ai codé pour que les cellules grises restent grises mais
J'aimerais bien que toutes les cellules"d’état" soient bloquées et ne peuvent changer d'état qu'avec 2 clics et pas d'entrée clavier .Merci d'avance.
1589444241573.png

VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

'Changement des états en "bon état" ou "Manquant"

  If Not Intersect([H9:S9], Target) Is Nothing And Target <> "" And Target <> "Dispo atelier" Then Target.Value = IIf(Target.Value = "Bon état", "Manquant", "Bon état")
  Cancel = True
 
  'If Not Intersect([H9:S9], Target) Is Nothing And Target = "" Then Target.Locked = True
 
 
 If Not Intersect([H9:S9], Target) Is Nothing And Target = "" Then Target.Value = IIf(Target.Value = "", "", "")


End Sub
 

Pièces jointes

  • 1589443919814.png
    1589443919814.png
    19 KB · Affichages: 3

jmfmarques

XLDnaute Accro
Tu voudras bien m'excuser, mais je me sauve lorsque je vois des choses du genre :
VB:
Target.Value = IIf(Target.Value = "", "", "")

cela parait être une plaisanterie du genre "si toto est un garçon, alors toto est un garçon, sinon c'est un garçon" et met surtout en exergue ce que je ne veux pas nommer.
 

job75

XLDnaute Barbatruc
Bonjour Willystic, jmfmarques,
Après remplissage de ce petit tableau [H9;S9], je cherche à interdire l’écriture sur les cellules grisées. Elles sont grises car leurs valeurs est "".
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [H9:S9]) Is Nothing Then Exit Sub
Dim c As Range
With Application
    .EnableEvents = False 'désactive les évènements
    .Undo 'annule la modification
    For Each c In Intersect(Target, [H9:S9])
        If c = "" Then Exit For
    Next
    If c Is Nothing Then .Undo 'rétablit la modification
    .EnableEvents = True 'réactive les évènements
End With
End Sub
Bien noter que si dans la plage on efface des cellules remplies on ne pourra plus les remplir.

A+
 
Dernière édition:

Willystic

XLDnaute Nouveau
Bonjour jmfmarques,
tu as raison ce n'est pas très malin. Mais c'était dans le but de garder la même "phrase" que :
Target.Value = IIf(Target.Value = "Bon état", "Manquant", "Bon état")
C'est mon 1er programme. Il est clair qu'il me reste beaucoup à apprendre.
Il y a des personnes dans mon service qui commencent et tâtonnent (comme moi).:rolleyes:
Nous nous servirons de certaines macros pour d'autres petits programmes.

Bonjour job75,
Merci pour ta proposition. Cela fonctionne tellement bien que ça bloque toutes mes feuilles.
Mon fichier commence sur la feuille "accueil" ou il y a 4 boutons de commande( connexion, déconnexion,...) et celle ci ne fonctionne plus.
 

jmfmarques

XLDnaute Accro
Mais c'était dans le but de garder la même "phrase" que :
Target.Value = IIf(Target.Value = "Bon état", "Manquant", "Bon état")
C'est mon 1er programme. Il est clair qu'il me reste beaucoup à apprendre
Une telle approche de l'apprentissage est tout sauf saine.
Te rends-tu au moins compte de ce que, constatant que quelqu'un a pris l'ascenseur pour se rendre du 2ème au 4ème étage, ta méthode d'apprentissage te conduirait à conclure que pour aller d'un point à un autre du 3ème étage, il te faudrait prendre l'ascenseur, descendre jusqu'au 1er et remonter jusqu'au 3ème ?
Je ne puis que te conseiller très vivement de choisir un autre chemin pour apprendre le langage que tu veux utiliser. ;)
 

Discussions similaires

Réponses
3
Affichages
252

Statistiques des forums

Discussions
312 073
Messages
2 085 058
Membres
102 768
dernier inscrit
clem135164