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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

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
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+