VBA, macro mise en forme conditionnelle

ntan-évindi

XLDnaute Occasionnel
Bonjour à tous,
C'est la première fois que je pose une question sur ce forum et si je l'adresse à vous c'est que mes maigres connaissances ne me permettent pas, malgré des recherches, de résoudre un problème de mise en forme conditionnelle par macro.
Dans un ficher que je joins, j'ai mis une macro dont voici un extrait du code:
Sub Formatcond()
For Each mycell In Range("e24:z50")
If mycell.Text = "SF" Then
With mycell.Interior
.ColorIndex = 7
.Pattern = xlSolid
End With
End If
If mycell.Text = "KJ" Then
With mycell.Interior
.ColorIndex = 45
.Pattern = xlSolid
End With
End If

‘etc…
Next
End Sub

Vous pouvez voir dans le fichier joint que dans chaquecellule dont le fond est grisé, en pointillé; il y a une liste déroulante, la sélection d'initiales dans cette liste entraine la coloration de la cellule au moyen de la macro.

Premier problème:
- si je veux vider le contenu de la cellule la mise en forme résultant de la macro reste.

pour y remédier, j'ai ajouté ceci:
If mycell.Text = "" Then
With mycell.Interior
.ColorIndex = 0
.Pattern = xlSolid
End With
End If

mais dans ce cas l'utilisation du code ci-dessus détruit toute ma mise en forme de base, (fond des cellules en grisé pointilklé).

Deuxième problème
- avec cette macro et d'ailleurs aussi avec d'autre que j'ai essayé, il est impossible de protéger la feuille, cela génère un bug.

Quelqu'un a t il une idée pour apporter une solution.

D'avance je vous en remercie.

Cordialement.

Ntang
 

Pièces jointes

  • Modele suivi.xls
    45.5 KB · Affichages: 222
G

Guest

Guest
Re : VBA, macro mise en forme conditionnelle

Bonjour Ntang et bienvenue sur le forum,

voici une proposition en lieu et place du code que tu as dans la feuil 'Suivi'.

Par contre je n'ai pas compris ta référence de plage "E24:Z50"
Alors que ton tableau commence en E18 et finit en P44?!

Comme tu as tous tes codes en B2:B14 tu pourrait mettre en C2:C14 les codes de couleur que nous pourrions retrouver par vba ce qui rédirait l'écriture de la macro ci-dessous.

De plus, tel que tu l'as écrit, il y a un parcourt de toute la plage E24:Z14 pour un seul changement.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    
    'permet de sortir de la procédure si plus d'une cellule est sélectionnée
    '(sinon la suite de la macro renvoie un message d'erreur)
    If Target.Count > 1 Then Exit Sub
    
    Dim idxColor As Integer
    idxColor = 0 ' Valeur par défaut
    If Union(Target, Range("e24:z50")).Address = Range("e24:z50").Address Then
        'choix de la couleur en fonction de la valeur de la cellule
        Select Case Target.Value
            Case "SF": idxColor = 7
            Case "KJ": idxColor = 45
            Case "BF": idxColor = 6
            Case "MB": idxColor = 4
            Case "ZS": idxColor = 30
            Case "JA": idxColor = 32
            Case "LR": idxColor = 15
            Case "WC": idxColor = 37
            Case "BM": idxColor = 31
            Case "AF": idxColor = 35
            Case "MF": idxColor = 39
            Case "ME": idxColor = 23
            Case "RC": idxColor = 54
        End Select
        With Target.Interior
        'Si idxcolor est toujours = 0 c'est que la valeur de la cellule n'est pas dans les choix
        If idxColor = 0 Then
            .ColorIndex = 0
            .Pattern = xlGray8
            .PatternColorIndex = xlAutomatic
        Else
            .ColorIndex = idxColor
            .Pattern = xlSolid
        End If
        End With
    End If
        
End Sub

A+
 

ntan-évindi

XLDnaute Occasionnel
Re : VBA, macro mise en forme conditionnelle

Bonjour Hasco,
Merci de ta réponse, je soupçonnais bien que Select Case était plus efficace, mais je suis tout tout débutant en VBA.
Ceci dit j'ai remplacé mon code par le tien, et ça ne fonctionne pas.
En ce qui concerne la référence de plage, c'est simplement parce que j'ai supprimé des lignes et des colonnes pour alléger le fichier et le faire poasser en dessous de 50 ko.
Je joins à nouveau le fichier.
ENcore merci de votre aide.
Cordialement.
Ntang
 

Pièces jointes

  • Modele suivi V2.xls
    44.5 KB · Affichages: 320
G

Guest

Guest
Re : VBA, macro mise en forme conditionnelle

bonsoir,

Voici ton classeur modifié.
il suffisait de mettre les instructions au bon endroit avec les bons paramètres.

P.S. ne t'excuse pas d'être débutant, nous l'avons tous été:D
A+
 

ntan-évindi

XLDnaute Occasionnel
Re : VBA, macro mise en forme conditionnelle

Bonsoir,
Cela fonctionne parfaitement, je te remercie. Je suis ravi de l'évolution que tu as procuré à mon fichier.

Il reste une question qui est primordiale car les utilisateurs de ce fichier que je duplique ensuite en deux nombreux exemplaires pour différents services, me mettent un joyeux foutoir, par exemple au lieu d'utiliser la liste déroulante ils font des copié-collé et que sais-je encore d'autre.
Aussi c'est pourquoi je cherche à toute fin à protéger ce fichier, l'utilsateur n'aura à toucher que les cellules ayant la liste déroulante.
As tu une idée.
D'avance merci.
 
G

Guest

Guest
Re : VBA, macro mise en forme conditionnelle

Re bonsoir,

Dévérouiller uniquement les cellules que l'utilisateur peut modifier et protéger la feuille à l'ouverture du classeur, dans le module ThisWorkbook procédure WorkBook_Open comme dans l'exemple joint.

L'instruction de protection comporte le paramètre UserInterfaceOnly = True qui permet de protéger la feuille tout en permettant les modifications par macros.

Il faut également protéger ton projet:
click-droit sur son nom dans la liste des projets
Propriétés du projet VBA

tout ceci en étant conscient que c'est une protection limitée.
l'utilisateur peut très bien refuser d'autoriser les macros
de plus il existe pas mal d'outils pour déprotéger facilement un classeur.

P.S. le mot de passe actuel est "toto"

A+
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 756
Messages
2 091 735
Membres
105 060
dernier inscrit
DEDJAN Gaston