Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Contribuez
Contribuez Placez ici vos codes, sources, trucs et astuces que vous souhaitez partager avec les membres du club.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/01/2011, 15h24   #1
Membre du Club
 
Inscription : janvier 2007
Messages : 67
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 67
Points : 43
Points : 43
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 :
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 :
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 !
vpovpo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 11h18   #2
Membre du Club
 
Inscription : janvier 2007
Messages : 67
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 67
Points : 43
Points : 43
C'est à dire quelque chose du genre:
Code :
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
vpovpo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 10h00   #3
Membre du Club
 
Inscription : janvier 2007
Messages : 67
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 67
Points : 43
Points : 43
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 :
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 :
1
2
Application.CommandBars("Control Toolbox").Controls(1).Enabled = False
Application.CommandBars("Visual Basic").Enabled = False
Voilà
...et salut à tous
vpovpo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h12.


 
 
 
 
Partenaires

Hébergement Web