VBA

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 !
Configuration: Windows XP Internet Explorer 7.0

16 réponses

  1. 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 !
    1. 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.
      1. Contributeur
        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...
        1. 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.
          1. Contributeur
            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
            1. 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.
              1. Contributeur
                Dans A3:H300 c'est des formules ou des saisies?
                je comprends plus rien à ce que tu demandes...
                1. 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 ?
                  1. Modérateur
                    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.
                2. 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 ?
                  1. Contributeur
                    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

                    1. 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.
                      1. merci !

                        Je l'ai modifiée comme ça pour que ça corresponde à mon fichier.
                        Ca te semble correct ?
                        1. Contributeur
                          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
                          1. Modérateur
                            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"