IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Unprotect dans BeforeSave ignoré si le classeur est manipulé par un autre classeur.


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut Unprotect dans BeforeSave ignoré si le classeur est manipulé par un autre classeur.
    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+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Membre Expert Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Par défaut
    Je n'ai pas testé, mais pourrais-tu essayer "SaveAs ....", quitte à renommer par la suite ?
    Good luck!

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Merci de l'idée mais le code réel fait déjà cela (un saveas) et ne marche pas plus.

    Nous avons contourné le problème en empêchant l'utilisateur d'effacer la formule mais je vais laisser un peu le post ouvert au cas où quelqu'un saurait.

    On ne peut pas toujours trouver une parade donc je préférerai une VRAIE solution.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Je viens de survoler rapidement ton post, ta procédure UnprotectAllWorksheet agit sur Thisworkbook pas sur le wb ouvert !
    Transmet le classeur en argument de ta sub, ce sera plus sûr.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    Thisworkbook est le classeur ouvert.
    J'ai vérifié au moment de l'exécution.
    Il se modifie lui-même.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Re,

    Mais pas dans ce cas, là Thisworkbook c'est celui qui contient cette macro et le classeur protégé c'est wb !
    Citation Envoyé par marot_r Voir le message
    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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/03/2017, 10h43
  2. Réponses: 1
    Dernier message: 08/04/2016, 17h09
  3. Réponses: 7
    Dernier message: 26/08/2006, 11h38
  4. "la webcam est utilisée par une autre application!" ah bon???
    Par cortex024 dans le forum Périphériques
    Réponses: 2
    Dernier message: 04/05/2006, 12h13
  5. Réponses: 1
    Dernier message: 22/12/2005, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo