Bonjour à tous et toutes et merci de votre temps et de votre aide.
J'ai quelque chose d'assez étrange avec un de mes classeurs.
Ce classeur est destiné à de la saisie et j'ai une formule dans une colonne cachée.
Parfois, l'utilisateur fait des copies qui font que la formule cachée n'est pas dans la copie.
Donc dans l'événement BeforeSave de ThisWorkbook j'ai mis le code suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13
| Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call AssignVariable 'Défini un certain nombre de variables publiques
Dim lastRow As Long
lastRow = GetLastRow(WS_A4.Columns("A"), 2) 'Détermine combien de lignes sont à modifier
MsgBox ThisWorkbook.name & " Workbook_BeforeSave" 'Juste pour voir que code est bien exécuté
Call UnprotectAllWorksheet 'Déprotège TOUTES les feuilles du classeur
Call AssignFormulaR1C1(WS_A4.Range("B2:B" & lastRow), "=IF(ISBLANK(RC[-1]),0,IF(RC[-1]=R[-1]C[-1],0,1))") 'Assigne la formule dans la colonne B de ma feuille de saisie. <--- ici ça coince
Call ProtectSomeWorksheet
Call UnassignVariable
Call mdlDoNotAutoexec.SetOriginalFileName
End Sub |
avec
1 2 3 4 5
| Public Sub AssignFormulaR1C1(prmArea As Range, prmFormulaR1C1 As String)
'Assigne la formule à la zone
Call DisplayArea(prmArea)
prmArea.FormulaR1C1 = prmFormulaR1C1
End Sub |
Ce code fonctionne parfaitement quand j'ouvre mon fichier de saisie directement depuis Excel.
Quand je l'ouvre depuis un autre classeur avec le code (ultra simple) suivant :
1 2 3 4 5 6 7
| Private Sub test()
Dim wb As Workbook
Set wb = Application.Workbooks.Open("X:\MonChemin\MonFichierSaisie.xlsm")
wb.Save '<--- ici ça coince
wb.Close
Set wb = Nothing
End Sub |
Au moment du wb.Save, il bloque en me disant que j'essaye de modifier une page protégée.
Le débuggeur pointe alors sur la ligne
Call AssignFormulaR1C1(WS_A4.Range("B2:B" & lastRow), "=IF(ISBLANK(RC[-1]),0,IF(RC[-1]=R[-1]C[-1],0,1))") 'Assigne la formule dans la colonne B de ma feuille de saisie.
dans la procédure BeforSavede MonFichierSaisie.
J'ai suivi mon code pas à pas dans MonFichierSaisie et il passe bien par le code UnprotectAllWorksheet ci-dessous en traitant toutes les feuilles.
1 2 3 4 5 6 7 8 9 10
| Const WORKSHEET_PASSWORD As String = "XYZ"
Public Sub UnprotectAllWorksheet()
Dim WS As Worksheet
For Each WS In ThisWorkbook.Worksheets
WS.Unprotect (WORKSHEET_PASSWORD)
Next WS
End Sub |
Mais il ne déprotège pas la feuille de saisie.
Un ? MaFeuilleSaisie.ProtectContents après l'exécution renvoie Vrai donc la déprotection n'a pas eu lieu malgré l'instruction donnée.
Pour info, j'ai eu problème similaire avec le code suivant dont je me sers régulièrement dans environ 50 fichiers :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Public Sub DisplayArea(prmArea As Range, Optional prmIsAlwaysDisplayed As Boolean = False)
'Affiche la zone passée en paramètre
If Not prmArea Is Nothing Then
If prmArea.Parent.Visible Then
If prmIsAlwaysDisplayed Or IS_DEBUG_MODE Then
prmArea.Parent.Parent.Activate 'Classeur
prmArea.Parent.Activate 'Feuille
prmArea.Select
DoEvents
End If
End If
End If
End Sub |
Il n'activait pas le classeur qui portant était celui en cours, n'activait pas la feuille et plantait au moment du select.
Là j'avais contourné le problème en modifiant mon code et en m'assurant que la feuille était bien active.
Auriez-vous une solution mon problème avec BeforeSave, à part de trouver un moyen de ne pas exécuter ce code dans ces circonstances ?
A+
Partager