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.
 
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é
 
😢Sniff ! j'ai l'impression que patricktoulon ne lit pas mes messages il ne m'a pas répondu à mon post #288 et pour ceci :
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
il a pas du lire mon message #286
 
Dernière édition:
là ca doit commencer a s'allumer un peu je crois non?
ca y est la lumière ?
Pour le moment il nous éclaire
1760363551765.png
.

allons dudu et typename(activewindow.rangefrompoint(x,y))="Range" alors ?
C'est insuffisant car quand on est hors de la grille (le ruban, la zone de status) on est toujours dans Excel et pas dans le document.
Et là y a pas de Range qui vaille.
 
@nullosse,
Le split ne suit pas instantanément la fenêtre word
C'est volontaire. Je ne traite le resize gauche de la fenêtre du document que lorsqu'il est terminé.
Sinon, on passe dans la séquence de split à chaque boucle de monitoring et quand c'est très rapide Excel n'apprécie pas et se met à clignoter sur la barre des tâches.
De toutes façons, c'est bien quand il est terminé qu'il faut ajuster le split. Quand je dis terminé, c'est qu'il n'y a pas eu de resize gauche entre 2 boucles du monitoring, donc très rapide.
ça clignote quand on passe du classeur au document word
Qu'est-ce qui clignote ? Le document ? Uniquement Word ? Ou les autres aussi ?
Je n'ai pas du tout ça chez moi et on a la même config.
 
re
oui mille excuse c'est vrai que je li pas tout ,car vous travaillez sur une méthode que je n'utiliserais jamais
que dudu2 me pardonne mais pour moi (et je le redis) il est Absolument exclu de faire un telle gestion d'attente
si je pose la souris que je ne tape rien sur le clavier ( IL NE DOIT RIEN SE PASSER ET RIEN NE DOIT TOURNER)
j'ai résolu le problème de fermeture avec la croix de word sans passer par le query close du classeur avec un cancel
j'ai résolu le problème avec le bouton "fichier" Excel il est tout simplement maské avec une fenêtre de type button transparente
j'ai fait la même chose avec word
comme ça le backstage de excel ou word n'est pas déployé tant qu'un volet est ouvert
il y a un bouton pour fermer et maintenant word se ferme comme en mode windowaussi (lui il a les deux options comme ça)
c'est propre net et il n'y pas de (Do /tournicota/Loop) en arrière plan

pour moi les do/loop c'est pour prendre une décision dans les 1 à 2 seconde(quand on peut pas faire autrement) genre pour capter un handle ou capter si il est toujours là

un truc qui tourne tant que ........................ ça va forcement foirer a un moment donné c'est obligé

d'ailleurs quand j'ai testé le classeur de @Dudu2 et que j'ai ouvert 2 autre classeurs je vous laisse imaginer ce qui c'est passé

je le repete WRONG WAY !!!WORNG WAY !!!

@nullosse
ça clignote quand on passe du classeur au document word
a ben oui forcement la reprise de focus engendre le nouveau statuts de fenêtre
donc ca clignote un peu (épileptique s'abstenir) et même quand on passe de word au ruban chez moi
bon ca pique un peu les yeux d'accords 🤣 🤣 🤣 🤣

même si je n'adhère pas au principe , si je peux me permettre vous pourriez l'ors du passage de l'un a l'autre faire un gel
pour cela utiliser les 3
screenupdating
lokupdatewindow
et sendmessage avec le sw_noredraw
ca appaiserais les yeux de @nullosse certainement ce de @Dudu2 aussi
chez moi c'est assez efficace même si ça gèle pas tout
 
Dernière édition:
d'ailleurs quand j'ai testé le classeur de @Dudu2 et que j'ai ouvert 2 autre classeurs je vous laisse imaginer ce qui c'est passé
Ça aurait pu être une remarque constructive, mais bon... on a l'habitude !
Ceci dit, ça reste quand même une remarque valide dont j'ai tenu compte.

En fait dans le monitoring je testais Application.hWnd qui est l'application active. C'est une erreur.
Il faut simplement créer une variable globale représentant le Handle de l'Application Excel concernée pour ne pas confuser avec les autres.
 
@Ben @Dudu2 ça en est une crois moi il n'y a pas de méchanceté la dedans

maintenant si j'ai vraiment vos 4 oreilles à l’écoute je peux vous dire comment on fait

si vous voulez continuer a travailler XLDESK/EXCEL7

1 vous oubliez la taille de excel7 vous vous contentez de la mettre à moitié(comme d'habitude) c'est pas compliqué
2j'insiste sur l'utilisation du serform
j'insiste j'insiste j'insiste c'est clair comme ça ?

3 vous loader le userform
  1. on enleve la caption on le fait joli joli un peu a votre gout
  2. avec la moitié transparente (api setlayered blablabla)
4 et c'est la que le raisonnement va changer
  1. on va le setwindowposition xldesk mais toute la taille de xldesk!!!!!
  2. attention le setwindowposition pas -1 mais 0

du coup le userform couvre tout( la le patosh a peter un cable me direz vous)

et bien je vous laisse imaginer si dans l'event mouse move du userform
vous faite passer le setwindowpos de -1 à zero et vis et versa en fonction du X du move dans le userform

bien entendu le placement de word ou tout autre application n'est plus 0,0,largeur,hauteur mais largeu,0 largeur,hauteur
et voila vous avez vortre event move sur xldesk en fait

un set focus ou truc machin activate ou tout forme d'activation quand on est a gauche
et voila
quand on est a gauche il passe en dessous donc le move sur la gauche byebye mais on vois toujours sa partie droite
et quand on survole a droite il reprends le dessus ,donc le move fonctionne sur toute la surface de xldesk on peut revenir repartir revenir repartir .......................

voila et pas de do loop boule jus te un events

en gros au move de la souris ben c'est simple l'userform passe en dessous quand je bouge a gauche ou au dessus quand je bouge a droite

Patrick le méchant
 
bon ca pique un peu les yeux d'accords 🤣 🤣 🤣 🤣
Quand les smileys se multiplient, je commence à douter de la pertinence des posts.

Il n'y a chez moi aucun clignotement et j'attends le retour de @nullosse pour m'expliquer quand il le voit.
Il n'y a qu'une seule saute d'affichage, extrêmement rapide et de faible amplitude lorsqu'on passe de Word (uniquement) à Excel car il faut faire de Word un Child d'Excel alors qu'il ne l'est pas. L'inverse ne provoque pas de saute d'affichage.
Si ça pique les yeux de quelqu'un, il faut illico rendre visite à un ophtalmo 😎.
 
Il n'y a qu'une seule saute d'affichage, extrêmement rapide et de faible amplitude lorsqu'on passe de Word (uniquement) à Excel car il faut faire de Word un Child d'Excel alors qu'il ne l'est pas. L'inverse ne provoque pas de saute d'affichage.
ben c'est ça en fait qui se produit : ça pique pas les yeux mais ça les dérange.
Par contre il y a un autre truc que j'ai remarqué et je sais pas si c'est normal : Quand tu prends le document word par sa barre de titre, tu peux ballader le document partout sur l'écran.
 
- 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