Bonjour,

Bonne année 2013 à vous tous.

Je pilote des actions via "Private Sub Worksheet_Change(ByVal Target As Range)" sur un onglet protégé en écriture qui doit agir sur des cellules verrouillées.

Dans cette macro, j'utilise plusieurs sous-macro.

Tout fonctionne correctement lorsque l'onglet n'est pas protégé.

J'ai un résultat différent pour chaque hypothèse suivante :

- Hypothèse I : je protège mon onglet, et n'inclus pas de code de déprotection dans ma macro "Private Sub Worksheet_Change(ByVal Target As Range)"

Résultat : la macro se bloque dès lors qu'elle doit modifier une cellule de l'onglet qui est verrouillée en écriture.
Constat : Je dirais que c'est logique car elle tente de modifier une cellule qui est protégée.

- Hypothèse II : je protège mon onglet, et inclus le code de déprotection au début et de reprotection à la fin.

Résultat : la déprotection s'exécute bien, mais le programme boucle sans fin.
Constat : Je dois avoir placé un bout de code quelque part qui n'est pas à la bonne place.

NB : ce que je ne m'explique pas, c'est qu'en dehors des soucis ci-dessus, j'ai déjà eu le cas, où mon programme n'incluant pas la déprotection et protection, s'exécutait sans erreur et sans boucle même si l'onglet était protégé ???

Voici le code pour analyse :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Private Sub Worksheet_Change(ByVal Target As Range)
Dim wcCJ As Integer, wCVS As Integer, wCVD As Integer, wcVSE As Integer, wcVSC As Integer, ACTIVE_CELLULE As Range, wcZAA As String, wcZAB As String, wcZAC As String
Dim ZoneSourceVide As String, ZoneSource As String, ZoneDest As String
Dim wSh As Worksheet
Dim WSName As String, WsDes As String
Set ACTIVE_CELLULE = ActiveCell
 
    wcZAA = "$E$15:$E$25"
    wcZAB = "$E$27:$E$34"
    wcZAC = "$E$26"
 
    WSName = "FICHIER.xlsm"
    WsDes = "ONGLET1"
 
If Target.Count > 1 Then Exit Sub
'Workbooks(WSName).Worksheets(WsDes).Unprotect Password:="PASSWORD"
 
 
Set wSh = ThisWorkbook.Worksheets("ONGLET1")
With wSh
    ActiveWindow.DisplayZeros = False 'enlever les zéro en affichage
    wcVSC = Val(.Range("AA15").Value)
    wcVSE = Val(.Range("AA16").Value)
    wCVS = Val(.Range("AA18").Value)
    wCVD = Val(.Range("AA20").Value)
    wcCJ = Val(.Range("CD2").Value)
    ZoneSourceVide = "AO7:AQ7"
    ZoneSource = "AO3:AQ3"
    ZoneDest = "AO2:AO2"
 
    '1 = protection
    '2 = deprotection
If wCVD <> 1 Then
    Select Case wCVS
            Case 35 
            Call PROTECTION_CELLULE(wcZAA, 2)
            Call PROTECTION_CELLULE(wcZAC, 2)
            Call PROTECTION_CELLULE(wcZAB, 1)
            'blocker le bouton 
            Call CACHER_ENTITE(9)
            'deblocker le bouton 
            Call DECACHER_ENTITE(10)
            ACTIVE_CELLULE.Select
 
        Case 26 
             'deblocker le bouton 
            Call DECACHER_ENTITE(9)
            'blocker le bouton 
            Call CACHER_ENTITE(10)
            Call PROTECTION_CELLULE(wcZAA, 1)
            Call PROTECTION_CELLULE(wcZAC, 1)
           Selection.ClearContents
            Call PROTECTION_CELLULE(wcZAB, 2)
             ACTIVE_CELLULE.Select
 
     End Select
   End If
End With
Set Sh = Nothing
'Workbooks(WSName).Worksheets(WsDes).Protect Password:="PASSWORD", UserinterfaceOnly:=True
End Sub
 
Sub PROTECTION_CELLULE(ByVal ZoneName As String, ByVal i As Byte)
    '1 = protection
    '2 = deprotection
    Range(ZoneName).Select
   ' Dim WSName As String, WsDes As String
    If i = 1 Then
    Selection.Locked = True
    Selection.FormulaHidden = False
  '  MsgBox "la cellule " & ZoneName & "est protégée"
    ElseIf i = 2 Then
    Selection.Locked = False
    Selection.FormulaHidden = False
   ' MsgBox "la cellule " & ZoneName & "est déprotégée"
    End If
 End Sub
 
Sub CACHER_ENTITE(ByVal i As Byte)
 
Windows("FICHIER.xlsm").Activate
ActiveSheet.Shapes.Range(Array("Freeform " & i)).Visible = False
 
End Sub
Sub DECACHER_ENTITE(ByVal i As Byte)
'MsgBox "decacher - " & i
 
Windows("FICHIER.xlsm").Activate
ActiveSheet.Shapes.Range(Array("Freeform " & i)).Visible = True
 
End Sub
Merci de votre retour et bon dimanche à tous.