VBA
identifiant-comment
Messages postés
351
Statut
Membre
-
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 !
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
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"
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"
bonjour
vite fait en guise d'apéro
A1 est la cellule "en rouge" (par MFC) si B2 =3
pour installer
copier la macro
clic droit dans nom d'onglet-visualiser le code-coller
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
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
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 ?
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 ?
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 ?
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 ?
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.
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.
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.
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.
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
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
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.
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.
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...
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...
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.
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.
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 !
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 !