XL 2016 VBA - Réduire la largeur de la grille Excel

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour,

DataSnipper est un outil commercial ajoutant à Excel des fonctionnalités diverses.
Parmi ces fonctionnalités, la possibilité de visualiser des documents PDF directement dans Excel avec cette particularité (voir image ci-dessous) que la fenêtre Excel est divisée en 2 verticalement. La partie gauche contient la grille Excel, la partie droite contient probablement un Control ActiveX visualisateur PDF, je ne sais pas lequel ? Acrobat ? PDF-XChange Viewer ? Autre ?

La question est: comment est-il possible dans une fenêtre Excel de réduire la largeur de la grille Excel et ses ascenseurs comme le fait ce logiciel ?

1758617247578.png
 
Solution
La solution avec le XML Source Pane + UserForm a l'air complexe à mettre au point, sensible aux différentes configurations et sans doute cela ne vaut pas le coup de continuer. Toutefois si @patricktoulon donnait un fichier opérationnel je l'ajouterais dans la solution bien évidemment.

Pour ce qui me concerne, je suis satisfait de la solution sans volet qui jusque là n'a intéressé personne (ce que je comprends vu les essais en cours sur le volet) que je réplique ici comme solution.
La largeur de la fenêtre du document naturellement ajustable ajuste aussi la fenêtre XLDESK7 et un clic unique permet de basculer entre Excel et le document.
Même si elle n'est sans doute pas parfaite ni à l'épreuve des balles, chez moi ça fonctionne...
Salut,
Dudu2 quand tu ouvres un document office , il y a moyen de récupérer l'objet de l'application Office qui s'est ouverte.
1 - Tu crées une nouvelle variable publique Keep_OfficeApp.
2 - Tu crées une nouvelle fonction
VB:
Function RecupOfficeApp(fileName) As Object
Dim officeApp As Object
On Error Resume Next
Set officeApp = GetObject(fileName).Application
Set RecupOfficeApp = officeApp
End Function
Si on ouvre pas une application office c'est pas grave car avec le On Error Resume Next on plante pas
tu appelles cette fonction ici :
Code:
Sub MonitorWindow(WindowHandle As LongPtr, FileFullName As String)
    Dim Classe_MonitorDocumentWindow As Classe_MonitorDocumentWindow
    Keep_WindowHandle = WindowHandle
    Keep_FileFullName = FileFullName
    Set Keep_OfficeApp = RecupOfficeApp(FileFullName)
    Set Classe_MonitorDocumentWindow = New Classe_MonitorDocumentWindow
End Sub
et alors pour le close tu peux faire ceci :
Code:
Function CloseWindow() As Boolean
    If IsWindow(Keep_WindowHandle) Then
        'Office application
        If IsOfficeApplication(Keep_FileFullName) Then
            Keep_OfficeApp.Quit
            Exit Function
        End If
et alors si tu as modifié ton document, la boîte de dialogue apparaîtra à coup sûr.

Nullosse
 
Merci @nullosse pour cette suggestion que je vais appliquer.

Le monitoring de la souris est presque opérationnel. Encore quelques détails sur la maximisation après réduction de la fenêtre avec laquelle j'ai un peu de mal.
Le monitoring de la souris permet maintenant de gérer la minimisation car pour minimiser il faut aller dans Excel et à ce moment là, même Office est Child d'Excel et donc toute la petite famille est minimisée.
 
Voilà la version Monitoring curseur.

J'ai galéré sur la restitution à l'identique après réduction à cause d'un petit bug caché dans un SetWindowPos(). Pffff !
La minimisation est de retour grâce au monitoring curseur. Ça a l'air de fonctionner correctement.

Je n'ai pas utilisé l'API WindowFromPoint() à cause de la grande variété de Handles retournés sans que je puisse facilement les relier soit à Excel soit au document. J'ai seulement comparé la position du curseur et le RECT de la Window du document.

@nullosse, j'ai implémenté ta solution pour Word. Il y a un inconvénient c'est que sur le dialogue d'enregistrement, si on choisit <Annluer>, le Application.Quit ferme quand même Word.
 

Pièces jointes

alors ce matin a la fraiche j'ai pris la decision dans la v2 de ne plus cacher le bouton(caption et croix de fermeture Word)
pourtant vous le savez la croix de fermeture implique la fermeture d'excel (effet de bord du à l'apparentage de word)
allez c'est parti V2Bis
depuis le début je vous dit utiliser un host pour l'app word(au moins)en l'occurence ici je parle d'un userform
pourquoi
et bien tout simplement par ce qu'un userform est une classe
et que gère ton dans une classe?
ben des object et leur events
là ca doit commencer a s'allumer un peu je crois non?
rappeler vous aussi je vous ai dit vous lancer word avec un shell alors que dans excel on gere très bien un object "Word.application" d'autant plus qu'en le variablisant en public global wokbook on en dispose partout
ca y est la lumière ?

j'ai donc rédigé un petit memo
Gérer proprement le docking de Word dans Excel grâce à un UserForm host — méthode événementielle


Contexte :
Quand on intègre Word dans une interface Excel — que ce soit docké dans une fenêtre Excel ou lancé en parallèle — plusieurs problèmes apparaissent :
- Le bouton de fermeture de Word ferme aussi Excel, car Word est devenu enfant d’une fenêtre Excel.
- La boîte de dialogue « Voulez-vous enregistrer les modifications ? » ne s’affiche pas si on ferme Word par code (.Close, SendMessage, etc.).
- Les solutions classiques (boucles de surveillance, timers, polling) sont lourdes, instables et consomment de la mémoire.

Ces problèmes apparaissent avec ou sans UserForm.
Mais c’est justement le UserForm qui nous sauve, car il permet de gérer les événements et de reprendre le contrôle.

Principe :
Un UserForm est une classe VBA, ce qui signifie qu’on peut y gérer les événements de l’application Excel.
Plutôt que de surveiller en boucle, on laisse Excel et Word reposer tranquillementquand on fait rien sur les fenêtres , et on agit au bon moment, grâce aux événements.

Implémentation :

1. Dans le module du UserForm (qui sert de host à Word) qui lui même est docké dans la xmlsource:

Public WithEvents app As Application

Private Sub UserForm_Initialize()
Set app = Application
End Sub

2. Intercepter la fermeture d’Excel (provoquée par la croix Word) :

Private Sub app_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
Cancel = True ' Empêche Excel de se fermer à cause de la fermeture de Word
If Not wordxapp Is Nothing Then
wordxapp.Quit ' Déclenche la boîte d’enregistrement si le document a été modifié
' Ici, on peut aussi fermer le volet et le UserForm (ca nous du coup un 2d bouton de fermeture en plus du bouton dans le ruban perso )
End If
End Sub

3. Nettoyage à la fermeture du UserForm :

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
killscotch ' Retire le masque sur le menu Fichier d’Excel
End Sub

Avantages :
- Pas de boucle de surveillance → zéro CPU, zéro mémoire gaspillée
- Réaction naturelle de Word → boîte d’enregistrement affichée comme en mode utilisateur
- Contrôle total → on maîtrise le cycle de vie de Word et Excel
- Extensible → on peut gérer d’autres événements (activation, sélection, etc.)

Résumé :
Le UserForm n’est pas juste une boîte graphique : c’est un host intelligent, capable de gérer les événements de l’application.
En l’utilisant comme point d’ancrage pour Word, on transforme une intégration fragile en une solution robuste, élégante et performante.

Et surtout, on respecte le rythme naturel des applications : pas de boucle, pas de stress,(ya points S) juste des événements bien placés.
du coup je laisse la caption de word je n'ai plus à m'en soucier
et si je cherche encore je vais bien trouver l'astuce pour le bouton fichier de word qui ouvre le backstage de word et fait peter le volet xmlsource
 
Voilà la version Monitoring curseur.

J'ai galéré sur la restitution à l'identique après réduction à cause d'un petit bug caché dans un SetWindowPos(). Pffff !
La minimisation est de retour grâce au monitoring curseur. Ça a l'air de fonctionner correctement.

Je n'ai pas utilisé l'API WindowFromPoint() à cause de la grande variété de Handles retournés sans que je puisse facilement les relier soit à Excel soit au document. J'ai seulement comparé la position du curseur et le RECT de la Window du document.

@nullosse, j'ai implémenté ta solution pour Word. Il y a un inconvénient c'est que sur le dialogue d'enregistrement, si on choisit <Annluer>, le Application.Quit ferme quand même Word.
allons dudu et typename(activewindow.rangefrompoint(x,y))="Range" alors ?
si tu es dans la feuille ça va renvoyer true sinon false
pas compliqué
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
9
Affichages
935
Réponses
0
Affichages
2 K
Retour