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

        Je l'ai modifiée comme ça pour que ça corresponde à mon fichier.
        Ca te semble correct ?
        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. 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. 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. 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. Contributeur
                Dans A3:H300 c'est des formules ou des saisies?
                je comprends plus rien à ce que tu demandes...
                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
                    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. 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
                        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. 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. 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 !