Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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 ?

 
Bonjour @nullosse,
Je ne comprends pas "clic sur le volet sélection d'excel". C'est quoi un volet sélection d'Excel ?
De plus je n'ai trouvé aucune référence à "volet personnalisé" en recherche Web.
Est-ce que tu parles des volets de l'affichage fractionné ?
 


En fait c'est un volet de tâches personnalisé (custom taskpanel) . Il ne me semble pas que l'on puisse en gérer un en VBA. Il faut passer par un addin . Il me semble que j'ai déjà vu cela dans la démo d'un Addin dans les ressources du forum.
 
bonjour nullosse
regarde bien les scrollbars de la grille excel le volet excel est bien reduit (comme on pouvait le faire avec office 2007)
et on peut ajouter n'importe quelle fenêtre à coté
j'ai pris le userform juste pour l'exemple
d'ailleurs un webbrowser dedans et hop un visualisateur de pdf a condition d'avoir le plugin ie installée avec adobd pdfreader

ce qui est comique, c'est qu'on nous vend ce qu'on nous a enlevé avec les versions sup à 2007
bref api oblige bien sur on peut tres bien crer des volet personnalisés
d'ailleurs je vais my intérésser au volet pdf sans userform et sans webbrowser
avec une createwindow je devrais pouvoir faire un truc simple
 
re
selon ta reponse en mp j'en conclu que c'est ce que tu cherche a faire sans passer par ces addons
donc
en premier lieu
comme tu le sais une fenêtre excel est composée de plusieurs fenêtre
celle qui nous intéresse ici c'est la classe "EXCEL7" (qui en contient plusieurs elle aussi )
qui est tout simplement la partie affichant le header de colonne et ligne nla grille la barre des onglet ,les scrollbaretc..)

pour l'atteindre une tout petite fonction récursive de rien du tout visitant une fenêtre et déroulant la liste des window sur ses child et soeurs de même niveau
donc api
GetWindow
et ses deux argument
Const GW_CHILD = 5
Const GW_HWNDNEXT = 2


on a donc la possibilité d'atteindre cette fenêtre et de l'identifier par sa classe "EXCEL7"
ainsi que sa position et dimention avec api getwindowRect
p
ar la même occasion on a forcement le parent donc la taille maximale

parti de la une fois que tu a le handle de cette fenêtre
il est facile avec l'api SetWindowPos de replacer et/ou redimensionner cette fenêtre
voici donc la base de travail
la fonction précédemment citée
VB:
'*****************************************************************************************************
'    ___     _     _______  __      _   ____  _   _  _______  ___     _   _   _    ___     _     _.
'   //  \\  /\\      //    // \\   //  //    //  //    //    //  \\  //  //  //   //  \\  //|   //
'  //___// //__\    //    //__//  //  //    //__//    //    //   // //  //  //   //   // // |  //
' //      //   \\  //    //  \\  //  //    //  \\    //    //   // //  //  //   //   // //  | //
'//      //    // //    //   // //  //___ //    \\  //     \\__// //__//  //___ \\__// //   |//
'****************************************************************************************************
'                                   fonction api pour décortiquer les elements d'une fenêtre Excel
'Auteur:patricktoulon sur Developpez.com
'version 1.3
'date version:17/02/2015
'mise à jour 22/06/2024
'transformation en fonction retournant le tableau des fentre avec les propriété
'(handel,classe,left,top,right,bottom,width,height,handle parent)
'****************************************************************************************************

Private Declare PtrSafe Function GetWindow Lib "user32" ( _
                              ByVal hwnd As LongPtr, ByVal uCmd As Long) As LongPtr
Private Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" ( _
                              ByVal hwnd As LongPtr, ByVal lpst As String, ByVal nMaxCount As Long) As Long
Private Declare PtrSafe Function IsWindow Lib "user32" ( _
                              ByVal hwnd As LongPtr) As Boolean
Declare PtrSafe Function GetWindowRect Lib "user32" ( _
                              ByVal hwnd As LongPtr, lpRect As RECT) As Long
Declare PtrSafe Function GetSystemMetrics Lib "user32" ( _
                              ByVal nIndex As Long) As Long
Declare PtrSafe Function GetDpiForWindow Lib "user32" ( _
                              ByVal hwnd As LongPtr) As LongPtr
Declare PtrSafe Function SetWindowPos Lib "user32" ( _
                              ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As Long, _
                              ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare PtrSafe Function GetParent Lib "user32" ( _
                              ByVal hwnd As LongPtr) As LongPtr
Declare PtrSafe Function SetParent Lib "user32" ( _
                              ByVal hWndChild As LongPtr, ByVal hWndNewParent As LongPtr) As LongPtr
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
                              ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr


Type RECT
    left As Long
    top As Long
    right As Long
    bottom As Long
End Type

Const GW_CHILD = 5
Const GW_HWNDNEXT = 2

Public Function AllPartExcelWindowList(Optional ByVal hwnd As LongPtr = 0) As Variant
    Dim hWndChild As LongPtr, hWndSibling As LongPtr
    Dim st$, ClassNameLength&, r As RECT
    Static i&
    If hwnd = 0 Then hwnd = Application.hwnd: i = 0: Static tbl(1 To 50, 1 To 9) As Variant
    If i >= UBound(tbl, 1) Then
        AllPartExcelWindowList = tbl
        Exit Function
    End If
   
    If IsWindow(hwnd) Then
        st = String(256, vbNullChar)
        ClassNameLength = GetClassName(hwnd, st, Len(st))
        st = left(st, ClassNameLength)
        GetWindowRect hwnd, r
        i = i + 1
        tbl(i, 1) = hwnd
        tbl(i, 2) = Trim(st)
        tbl(i, 3) = r.left
        tbl(i, 4) = r.top
        tbl(i, 5) = r.right
        tbl(i, 6) = r.bottom
        tbl(i, 7) = r.right - r.left
        tbl(i, 8) = r.bottom - r.top
        tbl(i, 9) = GetParent(hwnd)
       
    End If
   
    ' explorer les enfants
    hWndChild = GetWindow(hwnd, GW_CHILD)
    Do While hWndChild <> 0 And i < UBound(tbl, 1)
        If IsWindow(hWndChild) Then
            Call AllPartExcelWindowList(hWndChild) ' récursivité directe
        End If
        hWndChild = GetWindow(hWndChild, GW_HWNDNEXT)
    Loop
   
    ' retour final
    If hwnd = Application.hwnd Then
        AllPartExcelWindowList = tbl
    End If
End Function

exemple on liste dans une feuille la liste des composant sde la fenêtre excel
VB:
Sub hexaustiveList()
 t = AllPartExcelWindowList
Sheets(2).Cells(1).Resize(, 9) = Split("handle,classe,left,top,right,bottom,width,height,parenthandle", ",")
Sheets(2).Cells(2, 1).Resize(50, 9) = t
End Sub

allez on teste la grille réduite à moitié en largeur
tu constatera que j'ai ajouté la possibilité d'injecter un handle
pour placer a droite la fenêtre correspondant à ce handle (dans le parent de la fenêtre "EXCEL7")
Code:
Sub testsimple()
     SplitExcelView
End Sub



Sub SplitExcelView(Optional HwndForm As LongPtr = 0)
    Dim t
    t = AllPartExcelWindowList
    Dim hwnd As LongPtr
    For i = 1 To UBound(t)
        If t(i, 2) = "EXCEL7" Then
            hwnd = t(i, 1)
            SetWindowPos hwnd, 0, 0, 0, t(i, 7) / 2, t(i, 8), 0&
            If HwndForm <> 0 Then
                SetParent HwndForm, t(i, 9)
                SetWindowPos HwndForm, 0, t(i, 7) / 2, 0, t(i, 7) / 2, t(i, 8), 0&
            End If
        End If
    Next
End Sub

pour la remettre entière dans son parent
VB:
Sub Grillefullstack()
  Dim t
    t = AllPartExcelWindowList
    Dim hwnd As LongPtr
    For i = 1 To UBound(t)
        If t(i, 2) = "EXCEL7" Then
            hwnd = t(i, 1)
            SetWindowPos hwnd, 0, 0, 0, t(2, 5), t(i, 8), 0&
            If HwndForm <> 0 Then
                SetParent HwndForm, t(i, 9)
                SetWindowPos HwndForm, 0, t(i, 7) / 2, 0, t(i, 7) / 2, t(i, 8), 0&
            End If
        End If
    Next
End Sub

voila le principe est on ne peut plus simple en fait
on prends le tableau des element qui compose la fenêtre excel dans l'instanté
on récupère la fenêtre de classe "EXCEL7" et on la dimensionne

je vins de vous donner le moteur principal de ma classe WindowSnapExcel dans le quel je gère plusieur affichages complexes
maintenant @Dudu2 tu l'a ton SnapExcel

est ce suffisamment clair ?
Patrick
 
re
par l’intermédiaire d'un userform oui c'est ce que je fais
tu veux que je te le fasse avec bouton dans le ruban et tout le toutim?

Nb😛our info le userform doit être non modal sinon l'affichage bloque le proceesus au "Show" bien sur
 
OK merci pour l'info de l'EXCEL7 et le code.
J'ai mis en pratique ton code à ma sauce juste pour la réduction de la grille.
Maintenant pour le PDF, c'est une autre histoire. Faut que j'installe Adobe Reader et vois comment utiliser son Control ActiveX.
 

Pièces jointes

ben justement je suis entrain de voir je l'ai intallé moi aussi (car en fait je ne m'en sert pas)
et le control visiblement est mal enregistré par ce que ref coché et control supplémentaire ajouté en bon et due forme le control pdf me plante une erreur "element introuvable quand j'essais de le placer dans le userform dans VBE
 
- 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
917
Réponses
0
Affichages
2 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…