XL 2016 Multifenetrage et fermeture.

D.D.

XLDnaute Impliqué
Bonjour

J'ai l'habitude de travailler avec un excel en plusieurs fenêtres pour le même fichier (Affichage / Nouvelle fenêtre).
J'ai l'habitude aussi de ne pas faire apparaître le quadrillage des cellules (Affichage / Quadrillage).
J'ai remarqué que la fenêtre N° 2 ne reprend pas le paramètre de visu du quadrillage (et d'autres choses aussi tel que les volets figés).
Bon, jusque la c'est pas trop grave.

Le problème est que si on ferme la fenêtre N°1, on perd tous les réglages.

Le code ActiveWindow.Close ne permet pas de savoir si on ferme l'une ou l'autre fenêtre et il n'y a pas de "Private Sub" dans "ThisWorkbook" qui permette d'intercepter la fermeture d'une fenêtre.

Avez-vous une idée pour ne pas fermer la fenêtre n°1 ?
 

Simply

XLDnaute Occasionnel
Avez-vous une idée pour ne pas fermer la fenêtre

Utilisez le cycle sur les fenêtres à désactiver ;)

Code:
Option Explicit

Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare PtrSafe Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
Private Declare PtrSafe Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long

Private Const GWL_STYLE As Long = (-16) '// The offset of a window's style
Private Const GWL_EXSTYLE As Long = (-20) '// The offset of a window's extended style
Private Const WS_SYSMENU As Long = &H80000 '// System menu bit
Private Const SC_CLOSE As Long = &HF060 'Constant to identify the Close menu item

'// Set or clear a bit from a style flag
Private Sub SetBit(ByRef lStyle As Long, ByVal lBit As Long, ByVal bOn As Boolean)

If bOn Then
lStyle = lStyle Or lBit
Else
lStyle = lStyle And Not lBit
End If

End Sub
Public Sub SetStyleHide()

Dim lStyle As Long, hMenu As Long

lStyle = GetWindowLong(Application.hwnd, GWL_STYLE)

If lStyle = 0 Then
MsgBox "Unable to determine application window handle...", vbExclamation, "Error"
Exit Sub
End If

SetBit lStyle, WS_SYSMENU, False

'Set the basic window styles
SetWindowLong Application.hwnd, GWL_STYLE, lStyle

'Get the extended window style
lStyle = GetWindowLong(Application.hwnd, GWL_EXSTYLE)

'// Not wanted - delete it from the control menu
hMenu = GetSystemMenu(Application.hwnd, 0)
DeleteMenu hMenu, SC_CLOSE, 0&

Windows.Arrange ArrangeStyle:=xlTiled

'Update the window with the changes
DrawMenuBar Application.hwnd
SetFocus Application.hwnd

End Sub
 

D.D.

XLDnaute Impliqué
Bonjour,

Merci de la réponse mais je ne sais pas trop quoi en faire.

Ca m'a permis de trouver le nom de la fenetre active via ce code que j'ai simplifié:
Code:
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Sub Nom_Fenetre()
Dim Nom As String
Nom = Space$(120)
Yo = GetWindowText(Application.hwnd, Nom, 119)
Debug.Print Nom
End Sub
Mais comment le déclencher lorsque je ferme une fenêtre, sachant que d'autres restent ouvertes et que ceci faisant Excel ne déclenche pas l'event BeforeClose ?
 

D.D.

XLDnaute Impliqué
Hello Again,

Je viens de m'apercevoir que ta procédure permet de désactiver la croix de fermeture d'Excel.
De la à ne la déactiver que sur la fenetre 1, il n'y a qu'un pas.
Je comprends mieux l'interet.
Cependant, cela implique que la croix sera toujours désactivée dès lors que l'on travaille en multifenetrage. C'est pas top.

Je crois que je vais élaborer une autre solution:
repérer ce qui n'est pas transmis (quadrillage, volets) lors de l'ouverture d'une nouvelle fenetre et le recopier de la fenetre 1 à la nouvelle fenetre via un code VBA.
 

D.D.

XLDnaute Impliqué
Bon, voila:
J'ai mis un code dans ma feuille xlstart et associé ce code avec une icône de "nouvelle fenêtre" dans le ruban.
Code:
Private Declare PtrSafe Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare PtrSafe Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Sub Nouvelle_fenetre()
    Dim Nom As String
    YoMan = ActiveSheet.Name
    Nom = Space$(120)
    Yo = GetWindowText(Application.hwnd, Nom, 119)
    If Left(Replace(Replace(Nom, ActiveWorkbook.Name, ""), ":", ""), 1) = " " Then DeleteMenu GetSystemMenu(Application.hwnd, 0), &HF060, 0&
    ActiveWindow.NewWindow
    Sheets.Select
    ActiveWindow.DisplayGridlines = False
    Sheets(YoMan).Select
End Sub
Lorsque je crée une nouvelle fenêtre via cette icône, je désactive la croix de fermeture de la fenêtre initiale (mais que si c'est une fenêtre initiale), crée une autre fenêtre et enlève tous les quadrillages des feuilles de la nouvelle (en principe je n'en mets jamais).
Je ne peux donc plus fermer la fenêtre N° 1 mais que les fenêtres filles.
Et donc si je crée une fenêtre fille à partir d'une fenêtre déjà fille, la croix ne sera pas désactivée.

Enfin, et comme il faut bien pouvoir fermer la fenêtre initiale d'une manière ou d'une autre (et bien qu'il reste "fichier/fermer" ou Alt F4), j'ai ajouté dans la barre d'accès rapide la fonction intégrée de fermeture de la fenêtre.
Ouf, c'est un peu sale, mais ca suffira largement pour mon besoin.
Merci Simply pour la piste.
 

Discussions similaires

Statistiques des forums

Discussions
312 368
Messages
2 087 654
Membres
103 630
dernier inscrit
Azashoriu