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

Contribuez Discussion :

ThisWorkbook.Save, ThisWorkbook.Close


Sujet :

Contribuez

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 84
    Par défaut ThisWorkbook.Save, ThisWorkbook.Close
    En fait les boutons Excel "Save" et "Close" et les méthodes VBA correspondantes ThisWorkbook.Save et ThisWorkbook.Close ne se comportent pas de la même façon, c'est à dire que les méthodes bloque le changement de visibilité désiré.

    En fait:

    Je voulais faire la même chose que adrienoob dans cette discussion. C'est à dire que je voulais mettre toutes les feuilles (sauf une) à Sh.Visible = xlSheetVeryHidden avant une sauvegarde ou une sortie et de les mettre à Sh.Visible = xlSheetVisible lors de l'ouverture. J'ai créer donc le "Sub" suivant:
    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
    Public Sub HideAllSheets(kVisible As Integer)
        ' Variables utilisées: "PasswordClasseur", "MafeuilleDAccueil"
        ' Utilisation: HideAllSheets xlSheetVisible   ou  HideAllSheets xlSheetVeryHidden
        ' But: cache ou rend visibles toutes les feuilles sauf une, d'en sorte qu'on ne puisse
        '    rendre les feuilles visibles sans VBA
        Dim Sh
        Application.ScreenUpdating = False
        ' A utiliser si le classeur est protégé en structure:
        ActiveWorkbook.Protect Password:="PasswordClasseur", Structure:=False, Windows:=False
        For Each Sh In Sheets
            nom = Sh.Name    'pour debug
            If Not Sh.Name = "MafeuilleDAccueil" Then
                Sh.Visible = kVisible
            End If
        Next Sh
        ActiveWorkbook.Protect Password:="PasswordClasseur", Structure:=True, Windows:=False
        Application.ScreenUpdating = True
        'MsgBox kVisible
    End Sub
    et j'ai mis des appels à HideAllSheets dans Workbook_Open, Workbook_BeforeSave et Workbook_BeforeClose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Workbook_Open()
        HideAllSheets xlSheetVisible
    End Sub
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        HideAllSheets xlSheetVeryHidden
    End Sub
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        HideAllSheets xlSheetVeryHidden
    End Sub
    et ça marche très bien.

    Par contre, tout se gâte si j'utilise une des méthodes ThisWorkbook.Save ou ThisWorkbook.Close. Les feuilles ne sont pas cachées, alors qu'on passe bien dans le code. Il faut faire l'appel à HideAllSheets avant d'appeler ces méthodes !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 84
    Par défaut
    C'est à dire quelque chose du genre:
    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
    Private Sub maSortie()
        'Sortie avec éventuelle sauvegarde des données, décidée autrement qu'avec les menus Excel (Save/SaveAs)
        '   et avec appel à HideAllSheets (pour rendre les feuilles invisibles).
        'On ne se complique pas ici avec le traitement de SaveAs
        'On peut en plus ici, si on veut, relancer l'ouverture du classeur après fermeture avec Application.OnTime;
        '   pour cela il faut enlever le commentaire et définir la Sub ThisWorkbook.OpenMe (elle va être exécutée
        '   avant Workbook_Open et elle peut être vide)
        If ThisWorkbook.Saved = False Then
            reponse = MsgBox("Sauvegarder avant de quitter ?", vbYesNoCancel + vbExclamation, "Microsoft Excel")
        Else
            reponse = MsgBox("Voulez-vous quitter ?", vbOKCancel + vbExclamation, "Microsoft Excel")
        End If
        If reponse = vbCancel Then Exit Sub
        ThisWorkbook.HideAllSheets xlSheetVeryHidden
        If reponse = vbYes Then
            ThisWorkbook.Save
            ThisWorkbook.Saved = True
        End If
        'Application.OnTime Now + TimeValue("00:00:10"), "ThisWorkbook.OpenMe"
        ThisWorkbook.Close False
    End Sub
    OBS.1. Lors du ThisWorkbook.Save et du ThisWorkbook.Close on va passer encore, inutilement cette fois, par HideAllSheets (à cause du Workbook_BeforeSave et Workbook_BeforeClose). Ce n'est pas gênant, mais on pourrait éviter cela facilement en gérant un flag dans ThisWorkbook (pour dire à HideAllSheets s'il faut faire le boulot ou pas).

    OBS.2. J'ai appris encore un truc pas mal et je veux faire part, je ne sais pas à quoi cela pourrait bien servir, mais bon... c'est qu'on peut relancer automatiquement l'ouverture du classeur après fermeture, avec Application.OnTime (voir le code).

    Salut tout le monde

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 84
    Par défaut
    En fait il n'y a pas besoin de mettre l'appel à HideAllSheets dans Workbook_BeforeClose, il suffit de le mettre dans Workbook_BeforeSave.
    Par contre après sauvegarde rendre à nouveau visibles les feuilles, donc le code devient:
    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
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        ''FORCEMACRO: Fait partie du code solution pour Forcer les Macros à la connexion
        HideAllSheets xlSheetVeryHidden
        Application.EnableEvents = False  'afin que ThisWorkbook.Save n'appelle pas Workbook_BeforeSave
        If SaveAsUI Then
            On Error GoTo Continue1
            newFname = Application.GetSaveAsFilename(fileFilter:="Excel Files (*.xls), *.xls")
            If Not (newFname = "False" Or newFname = "Faux") Then ThisWorkbook.SaveAs newFname
    Continue1:
            On Error GoTo 0
        Else
            ThisWorkbook.Save
        End If
        Application.EnableEvents = True
        HideAllSheets xlSheetVisible
        ThisWorkbook.Saved = True
        Cancel = True
        ''
    End Sub
    Encore une chose, très importante: il faut absolument inhiber le bouton Mode création, sinon tout ça ne sert à rien !! En effet, avec ce bouton on inhibe les macros et donc on pourrait sauvegarder le fichier avec les feuilles bien visibles, ce que justement on veut pas ! Pour inhiber donc le bouton Mode création il faut mettre dans Workbook_Open le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.CommandBars("Control Toolbox").Controls(1).Enabled = False
    Application.CommandBars("Visual Basic").Enabled = False
    Voilà
    ...et salut à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. créer un événement dans ThisWorkbook avec VBA
    Par jmcrib dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/09/2007, 13h18
  2. ActiveWorkbook.close dans ThisWorkbook
    Par unfcool dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 25/05/2007, 16h05
  3. [C#]Save changes before closing
    Par BoOom dans le forum Windows Forms
    Réponses: 9
    Dernier message: 07/04/2006, 15h47
  4. [VBA-E]thisworkbook.path
    Par ogenki dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 23/03/2006, 15h59
  5. [VBA Excel] Comment écrire un code dans le ThisWorkBook ?
    Par WebPac dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/05/2005, 16h03

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