Private Sub Worksheet_Change(ByVal Target As Range) et protection
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:
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.