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

16 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  3. 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
  4. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  7. 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
  8. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    A3:H300

    oui
    0
  9. 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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  10. identifiant-comment Messages postés 351 Statut Membre 54
     
    :) On a posté en mm temps...
    0
  11. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Dans A3:H300 c'est des formules ou des saisies?
    je comprends plus rien à ce que tu demandes...
    0
  12. 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
  13. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  14. 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
  15. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  16. 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
  17. 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