VBA

identifiant-comment Messages postés 351 Statut Membre -  
identifiant-comment Messages postés 351 Statut Membre -
Bonjour,

Est-il possible de dire en VBA: les cellules comprenant du texte en rouge sont protégées et ne peuvent être modifiées ?
En sachant que :
- ces fameuses cellules renvoient le résultat de formules et que leur est appliquée une mise en forme conditionnelle. Une même cellule doit donc pouvoir être modifiée si son résultat est différent de celui qui provoque la mise en forme rouge et ne plus l'être quand son résultat appelle la mise en forme rouge
- il ne s'agit pas d'une macro à exécuter, mais de qqc qui doit s'appliquer au fichier en permanence.

Je ne sais pas du tout si c'est faisable. Si vous le savez, ça m'intéresse !
Merci à tous !

16 réponses

pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 770
 
Salut,
J'avoue que je bloque avec ma petite connaissance de VBA... J'ai trouvé ceci comme début...
If ActiveCell.Font.Color = 3 Then
Selection.Locked = True
End If
Si la police dans ma cellule active est rouge alors elle est "verrouillée"
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
bonjour
vite fait en guise d'apéro
A1 est la cellule "en rouge" (par MFC) si B2 =3

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("B2")) Is Nothing Then: Exit Sub
    If Target = 3 Then
        Range("A1").Locked = True
    Else
        Range("A1").Locked = False
    End If
End Sub


pour installer
copier la macro
clic droit dans nom d'onglet-visualiser le code-coller
0
identifiant-comment Messages postés 351 Statut Membre 54
 
merci !

Je l'ai modifiée comme ça pour que ça corresponde à mon fichier.
Ca te semble correct ?
0
identifiant-comment Messages postés 351 Statut Membre 54
 
Pardon...

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A3:H100")) Is Nothing Then: Exit Sub
If Target <> 0 Then
Range("A3:H100").Locked = True
Else
Range("A3:H100").Locked = False
End If
End Sub

C'est mieux.
0

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

Posez votre question
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
re,

j'ai oublié quelque chose
déprotèger er reprotègé la feuille

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("B2")) Is Nothing Then: Exit Sub
ActiveSheet.Unprotect
If Target = 3 Then
Range("A1").Locked = True
Else
Range("A1").Locked = False
End If
ActiveSheet.Protect
End Sub

quant à ta modif, tu verrouilles les cellules A3:H3 lorsqu'une de cellules prend une valeur différente de 0

0
identifiant-comment Messages postés 351 Statut Membre 54
 
A3:H3 tu es sûr ? Pas A3:H3000 ?
J'essaie ta nouvelle proposition tout de suite.

Et dis-moi, c'est jouable que ce soit bloqué seulement quand cette valeur est le résultat d'une formule ?
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
A3:H300

oui
0
identifiant-comment Messages postés 351 Statut Membre 54
 
Il doit me manquer qqc : j'ai bien copié la formule dans VBA, en notant tes modifications et les miennes.
Pourtant, je peux toujours modifier la valeur des cellules qui sont différentes de 0...
En revanche, quand après avoir saisi une valeur dans une cellule je fais ctrl Z, ça bloque.

Voici exactement la formule.

Pijaku, je comprends mal ce que tu proposes ?
0
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 770
 
Je reviens à ce sujet, autant pour avoir des infos que pour essayer de résoudre cette question (qui n'en est plus une...)
J'ai fait ceci :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveSheet.Unprotect
If ActiveCell.Font.Color = 3 Then ' Si la cellule active à une police de couleur rouge alors
Selection.Locked = True ' on verrouille la cellule
End If
ActiveSheet.Protect
End Sub
mais ça ne fonctionne pas. L'explication est simple, je parle de cellule active. Il faudrait le faire pour chaque cellule du range "actif". Là je bloque car pas assez calé en VBA. Ca doit être possible grâce à un truc du genre
For each cell in plage
if cell.Font.color = 3 then '(3 = rouge???en VBA)
cell.locked = true
end if
next
Quelqu'un voit-il un intérêt et si oui pouvez vous corriger cette macro pour qu'elle fonctionne?
Merci.
0
identifiant-comment Messages postés 351 Statut Membre 54
 
:) On a posté en mm temps...
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Dans A3:H300 c'est des formules ou des saisies?
je comprends plus rien à ce que tu demandes...
0
identifiant-comment Messages postés 351 Statut Membre 54
 
Voilà, c'est bien ce que je pensais, je n'ai pas été suffisamment claire. Je me concentre et je recommence.

Dans la plage A:H, les cellules renvoient des valeurs qui sont des résultats de formule, de type =SI(C4=Params!$B$5;D4;0).
Sur cette plage est appliquée une mise en forme conditionnelle. La police des cellules qui renvoient un résultat égal à zéro est noire ; dans les autres cas, elle est rouge.

Il est très important que l'on ne puisse pas modifier les cellules dont le résultat est supérieur à 0.

Je devrais peut-être préciser que :
C -> niveau requis (saisie manuelle)
D -> nombre de personnes nécessaires au niveau requis (saisie manuelle)
E -> nombre de personnes nécessaires au niveau 1 (résultat de la formule citée plus haut)
F -> nombre de personnes nécessaires au niveau 2 (résultat de la formule citée plus haut)
G -> nombre de personnes nécessaires au niveau 3 (résultat de la formule citée plus haut)
H -> nombre de personnes nécessaires au niveau 4 (résultat de la formule citée plus haut)

L'idée est donc que ces valeurs (qui sont bien sûr réutilisées dans la suite du tableur) me disent combien de ressources sont nécessaires à chaque niveau. Comme elles sont fondées sur les colonnes C et D, elles renvoient toujours au moins trois résultats à 0 et un résultat avec une valeur positive. Mais un utlisateur pourrait vouloir définir un nombre de personne nécessaires à un niveau autre que celui qui est requis.

Ca va mieux ? Je n'en suis pas convaincue mais je le souhaite. Si c'est toujours embrouillé, dis-le moi.
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Si c'est des formules,il suffit que ta feuille soit protégée et je ne comprend pas alors pourquoi tu veux déverrouiller une cellule si le résultat de la valeur est 0... une saisie dans cette cellule détruit alors la formule

Si la zone A3:H300 est une zone de saisie , alors inscrire une valeur autre que 0 verrouille définitivement la cellule
c'est quoi Ctrl+Z
0
identifiant-comment Messages postés 351 Statut Membre 54
 
ctrlZ, c'est annuler...

Tu as raison, je me disais que si on voulait remettre la formule, on pouvait toujours l'étendre depuis une cellule voisine, mais c'est un raisonnement absurde.
Je pense qu'il vaut mieux que je revoie entièrement mon fichier.
Je te remercie pour ton aide. sans tes remarques, j'aurais pu m'obstiner tout le WE.
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Mais un utlisateur pourrait vouloir définir un nombre de personne nécessaires à un niveau autre que celui qui est requis.
il faut donc empêcher une saisie en D (et C?) si dans tes cellules avec MFC on est >0 ?
....

Bon, envoie un extrait de ton fichier, parce que sinon...
0
identifiant-comment Messages postés 351 Statut Membre 54
 
Non, non, les colonnes C et D sont celles qui comprennent les paramètres sur lesquels tout le fichier est basé.
Mais ça va, je suis en train de prendre le problème complètement différemment : tu m'as fait m'apercevoir que ce que j'essayais de faire était crétin... Du coup ma question est obsolète maintenant.
0
identifiant-comment Messages postés 351 Statut Membre 54
 
Re michel_m,

Je suis en train d'essayer d'utiliser ta macro dans un autre contexte :

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("J9:J500")) Is Nothing Then: Exit Sub
ActiveSheet.Unprotect
If Target = 0 Then
Range("J9:J500").Locked = True
Else
Range("J9:J500").Locked = False
End If
ActiveSheet.Protect
End Sub

Je souhaite seulement que dans la plage J9:J500, on ne puisse pas modifier les cellules vides, or je n'y arrive pas en protégeant ma feuille et en mettant dans la fenêtre Permettre aux utilisateurs de modifier les plages =ESTNONTEXTE(J9:J500).
Je me suis donc dit que ta macro pourrait très bien s'adapter là et que puisque je n'avais pas réussi la dernière fois, ce serait l'occasion de la mettre en pratique.
Mais je n'ai toujours pas de résultat : je n'arrive même pas à la visualiser dans la liste des macros disponibles (Alt+F8) !

Je dois préciser que :
- la plage J9:J500 comprend la formule suivante : =SI(OU(A9=Params!$F$10;A9=Params!$F$8;ESTVIDE(A9));"";"Menu déroulant")
- et une liste de validation est appliquée à cette plage, dont toutes les cellules font donc appel à un menu déroulant.

Est-ce que tu vois où je me plante ? Est-ce qu'il faut que je te donne plus d'éléments ?
Merci et bonne journée !
0