OVH Cloud OVH Cloud

Macro excel

2 réponses
Avatar
Chris64240
Bonjour,

J'ai réussi à écrire une macro excel pour protéger en même temps plusieurs feuilles en demandant un mot de passe, mais j'aimerais rajouter dans cette macro la possibilité de mettre un fond dans les cellules qui ne sont pas vérrouillées.
Avec la macro que j'ai écrite, la mise en forme est grisée.
Quelqu'un aurait-il la solution svp ?

Voilà ma macro :

Sub Protéger()

top:
pass = InputBox("Saisir le mot de passe SVP")
repass = InputBox("Confirmer le mot de passe SVP")
If Not (pass = repass) Then
MsgBox "Mot de passe incorrect"
GoTo top
End If
For i = 1 To Worksheets.Count
If Worksheets(i).ProtectContents = True Then GoTo oops
Next
For Each s In ActiveWorkbook.Worksheets
s.Protect Password:=pass
Next
Exit Sub


oops: MsgBox "Les feuilles sont protégées. Utiliser la macro pour les déprotéger svp."

End Sub

Merci pour votre aide !
Christelle

2 réponses

Avatar
MichD
Le 18/07/19 à 08:09, Chris64240 a écrit :
top:
pass = InputBox("Saisir le mot de passe SVP")
repass = InputBox("Confirmer le mot de passe SVP")
If Not (pass = repass) Then
MsgBox "Mot de passe incorrect"
GoTo top
End If
For i = 1 To Worksheets.Count
If Worksheets(i).ProtectContents = True Then GoTo oops
Next
For Each s In ActiveWorkbook.Worksheets
s.Protect Password:=pass
Next
Exit Sub
oops: MsgBox "Les feuilles sont protégées. Utiliser la macro pour les déprotéger
svp."
End Sub

Bonjour,
Pour pouvoir modifier le format des cellules (couleur de fond des
cellules), la feuille doit être déprotégée, et ce, même si les cellules
ne sont pas verrouillées.
Regarde l'aide de la méthode "SpecialCells" dans VBA. Si tu sais
d'avance la condition pour colorer certaines cellules, tu peux utiliser
ce qui suit. Attention, tu n'es pas obligé d'utiliser toutes ces lignes
de code, c'est seulement pour te donner un exemple sur la manière de
sélectionner un type de données particulier. Dans mon exemple, cela
s'applique à toutes les cellules de la feuille de la plage de cellules
utilisée qui remplit la condition que tu auras choisie.
Évidemment, la feuille doit être déprotégée avant de procéder!
Sinon, il te reste à déprotéger la feuille et boucler sur chacune des
cellules (ou plage de cellules) pour modifier la couleur de fond et
protéger la feuille à nouveau.
'-------------------------------------------
Sub test()
Dim Sh As Worksheet
For Each Sh In Worksheets
With Sh
.Unprotect "MotDePasse" ' si besion
'pour les cellules contenant du numérique
.UsedRange.SpecialCells(xlCellTypeConstants, 1).Interior.Color
= vbBlue
'Pour les cellules contenant du texte seulement
.UsedRange.SpecialCells(xlCellTypeConstants, 2).Interior.Color
= vbBlue
'On peut combiner les 2 de cette manière
.UsedRange.SpecialCells(xlCellTypeConstants, 3).Interior.Color
= vbBlue
'pour les cellules contenant des formules
'pour les cellules contenant du numérique
.UsedRange.SpecialCells(xlCellTypeFormulas, 1).Interior.Color =
vbBlue
'Pour les cellules contenant du texte seulement
.UsedRange.SpecialCells(xlCellTypeFormulas, 2).Interior.Color =
vbBlue
'On peut combiner les 2 de cette manière
.UsedRange.SpecialCells(xlCellTypeFormulas, 3).Interior.Color =
vbBlue
'pour les cellules vides totalement
.UsedRange.SpecialCells(xlCellTypeBlanks).Interior.Color = vbBlue
.Protect "MotDePasse"
End With
Next
End Sub
'-------------------------------------------
Avatar
MichD
En complément,
Si tu veux boucler sur les cellules non verrouillées d'une feuille
protégée pour modifier la couleur de fond, tu dois protéger la feuille
ou les feuilles de cette manière.Attention, lorsque tu utilises le
paramètre AllowFormattingCells:=True de la propriété "Protect", cela
s'applique à toutes les cellules de la feuille, verrouillées ou non.
Il n'y a pas une méthode qui permet de modifier les cellules seulement
non verrouillées. C'est ce pour quoi je faisais les commentaires dans
mon premier message. Il faut alors tester si le contenu de la cellule
est protégé ou non un peu comme tu as fait dans ton exemple.
Workshets("Feuil1").Protect Password:="toto", AllowFormattingCells:=True
J'espère être plus claire!
MichD
Bonjour,
Pour pouvoir modifier le format des cellules (couleur de fond des
cellules), la feuille doit être déprotégée, et ce, même si les cellules
ne sont pas verrouillées.
Regarde l'aide de la méthode "SpecialCells" dans VBA. Si tu sais
d'avance la condition pour colorer certaines cellules, tu peux utiliser
ce qui suit. Attention, tu n'es pas obligé d'utiliser toutes ces lignes
de code, c'est seulement pour te donner un exemple sur la manière de
sélectionner un type de données particulier. Dans mon exemple, cela
s'applique à toutes les cellules de la feuille de la plage de cellules
utilisée qui remplit la condition que tu auras choisie.
Évidemment, la feuille doit être déprotégée avant de procéder!
Sinon, il te reste à déprotéger la feuille et boucler sur chacune des
cellules (ou plage de cellules) pour modifier la couleur de fond et
protéger la feuille à nouveau.
'-------------------------------------------
Sub test()
Dim Sh As Worksheet
For Each Sh In Worksheets
    With Sh
        .Unprotect "MotDePasse" ' si besion
        'pour les cellules contenant du numérique
        .UsedRange.SpecialCells(xlCellTypeConstants, 1).Interior.Color
= vbBlue
        'Pour les cellules contenant du texte seulement
        .UsedRange.SpecialCells(xlCellTypeConstants, 2).Interior.Color
= vbBlue
        'On peut combiner les 2 de cette manière
        .UsedRange.SpecialCells(xlCellTypeConstants, 3).Interior.Color
= vbBlue
        'pour les cellules contenant des formules
        'pour les cellules contenant du numérique
        .UsedRange.SpecialCells(xlCellTypeFormulas, 1).Interior.Color =
vbBlue
        'Pour les cellules contenant du texte seulement
        .UsedRange.SpecialCells(xlCellTypeFormulas, 2).Interior.Color =
vbBlue
        'On peut combiner les 2 de cette manière
        .UsedRange.SpecialCells(xlCellTypeFormulas, 3).Interior.Color =
vbBlue
        'pour les cellules vides totalement
        .UsedRange.SpecialCells(xlCellTypeBlanks).Interior.Color = vbBlue
        .Protect "MotDePasse"
    End With
Next
End Sub
'-------------------------------------------