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
 
fais attention aussi a tes prises de valeurs tu prend le rect sur excel7
alors oui ca foncionne mais si par inadvertence tu clique 2 fois sur reduire c'est mort
c'est por cela que dans mon restaure a moi je prend la largeur du parent
d'ou l'utilité du tableau dans l'intantéou je peux récupérer parent etc....
regarde le problème avec ton fichier
demo3.gif

utilise au moins une variable handle globale module
et fait un getparent quand tu trouve excel7 et le rect de restaure fais le sur le parent
le restaure sera toujour effectué sur la taille de la classe de "XLDESK"
😉
 
ton code corrigé
VB:
Option Explicit

#If VBA7 Then
    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
    Declare PtrSafe Function GetWindowRect Lib "user32" (ByVal hwnd As LongPtr, lpRect As RECT) As Long
    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
Dim HandleXLDESK As LongPtr
#Else
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal uCmd As Long) As Long
    Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpst As String, ByVal nMaxCount As Long) As Long
    Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
    Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
                                               ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, _
                                               ByVal wFlags As Long) As Long
Dim HandleXLDESK As Long
#End If

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

Const GW_CHILD = 5
Const GW_hWndNEXT = 2
Private R As RECT

'------------------------------------------
'Reduce the Excel grid to its vertical half
'------------------------------------------
Sub ExcelGridToVerticalHalf()
#If VBA7 Then
    Dim EXCEL7WindowHandle As LongPtr
#Else
    Dim EXCEL7WindowHandle As Long
#End If
    EXCEL7WindowHandle = GetEXCEL7WindowHandle
    Call GetWindowRect(EXCEL7WindowHandle, R)
    Call SetWindowPos(GetEXCEL7WindowHandle, 0, 0, 0, (R.right - R.left) / 2, R.bottom - R.top, 0&)
End Sub

'-------------------------------------------
'Restore the Excel grid to its original size
'-------------------------------------------
Sub ExcelGridRestore()
If HandleXLDESK = 0 Then Exit Sub
    Call GetWindowRect(HandleXLDESK, R)
    Call SetWindowPos(GetEXCEL7WindowHandle, 0, 0, 0, R.right - R.left, R.bottom - R.top, 0&)
End Sub

'-------------------------------
'Find the "EXCEL7" Window Handle
'Sur le modèle de code de @patricktoulon
'-------------------------------
#If VBA7 Then
    Private Function GetEXCEL7WindowHandle(Optional hwnd As LongPtr = 0) As LongPtr
        Dim hWndChild As LongPtr
        Static hWndResult As LongPtr
#Else
    Private Function GetEXCEL7WindowHandle(Optional hwnd As Long = 0) As Long
        Dim hWndChild As Long
        Static hWndResult As Long
#End If
    'Initial call
    If hwnd = 0 Then
        'Parent Handle
        hwnd = Application.hwnd
  
    'Recursive call
    Else
        'Result found
        If Not hWndResult = 0 Then Exit Function
    End If
  
    hWndChild = GetWindow(hwnd, GW_CHILD)
  
    Do While Not hWndChild = 0
      
        If GetWindowClassName(hwnd) = "XLDESK" Then HandleXLDESK = hwnd
      
        If GetWindowClassName(hwnd) = "EXCEL7" Then
            hWndResult = hwnd
            Exit Do
        End If
        'Recursive call
        Call GetEXCEL7WindowHandle(hWndChild)
        hWndChild = GetWindow(hWndChild, GW_hWndNEXT)
    Loop
  
    'Return value
    GetEXCEL7WindowHandle = hWndResult
End Function

'------------------------
'Class name of the Window
'------------------------
#If VBA7 Then
    Private Function GetWindowClassName(hwnd As LongPtr) As String
#Else
    Private Function GetWindowClassName(hwnd As Long) As String
#End If
    Dim Buffer As String
    Dim Count As Integer
    Const MAXLEN = 255

    Buffer = String$(MAXLEN - 1, 0)
    Count = GetClassName(hwnd, Buffer, MAXLEN)
  
    'Return value
    If Count > 0 Then
        GetWindowClassName = left$(Buffer, Count)
    End If
End Function
 
Dernière édition:
Pour visualiser le PDF , une idée : utiliser msedge lancé en mode app (fenêtre épurée qu'avec boutons PDF).
VB:
#If VBA7 Then
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
        ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
        ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If

Sub OuvrirPDF_Edge()
    Dim cheminPDF As String
    cheminPDF = "c:\temp\pdf-exemple.pdf" ' ? à adapter
    If Dir(cheminPDF) = "" Then
        MsgBox "Fichier PDF introuvable.", vbExclamation
        Exit Sub
    End If
    ' Format de l'URL pour Edge
    Dim pdfURL As String
    pdfURL = "file:///" & Replace(cheminPDF, "\", "/")
    ' Ouvre Edge avec le PDF en mode app (fenêtre propre)
    Dim cmd As String
    cmd = "cmd /c start msedge --app=""" & pdfURL & """"
    Shell cmd, vbHide
    ' Attendre que la fenêtre s'ouvre
    Dim t As Double
    t = Timer
    Dim hwnd As LongPtr
    Do
        hwnd = FindWindow("Chrome_WidgetWin_1", vbNullString)
        DoEvents
        If Timer - t > 5 Then Exit Do ' Max 5 secondes
    Loop While hwnd = 0

    If hwnd = 0 Then
        MsgBox "Fenêtre Edge non trouvée.", vbExclamation
        Exit Sub
    End If
End Sub
pdf-exemple.jpg


Il n'y a plus qu'à positionner et dimensionner la fenêtre
 
Bien vu @nullosse
du coup avec mon insertionneur
demo3.gif

voila j’ insert ce que je veux dedans
la seule différence avec un userform et webbrowser c'est que je n'ai pas la main sur la fermeture du volet perso pdf tandis avec un userform dans le query close je unSnape

la totalité du snap perso bientôt dispo dans les ressource après modé(avec commande dans l'onglet "Affichage" du ruban)
 
Dernière édition:
la seule différence avec un userform et webbrowser c'est que je n'ai pas la main sur la fermeture du volet perso pdf tandis avec un userform dans le query close je unSnape
Le souci avec le webbrowser activex dans un userform pour afficher un PDF , c'est que cela ne marche pas si adobe reader n'est pas installé car c'est un plugin Adobe qui affiche les PDF dans I.E. Et d'après ce que j'ai vu les versions récentes d'Adobe Reader ( > 11) n'installe plus le plugin. Chez moi sur mon ordinateur qui n'a pas adobe reader, si j'essaie de visualiser un PDF dans un webbrowser activex il me demande si je veux télécharger le fichier PDF (donc pas géré)
 
j'ai ,téléchargé aujourd'hui la dernière version et avec le webbrowser ca marche
en fait il l'installe mais si tu es en 64 il te faut ajouter une clé dans le registre pour enregistrer le plugins en 64
pour qu'il marche sur un webbrowser dans userform dans un excel 64
j’essaierais de retrouver la clé je l'ai normalement
 
allez donnez moi des idées pour le texte des boutons pour
le bouton moitié et entier

  1. Grille moitié / Grille complète
  2. Vue compacte / Vue entière
  3. Moitié-écran / Plein écran Excel
  4. Grille réduite / Grille totale
  5. SplitView / FullView
  6. Partielle / Totale

allez comme ça je vous termine le ruban
1758646705281.png
 
Ma première expérience avec Acrobat PDF est plutôt décevante.
En Control ActiveX je n'ai que 2 évènements (GotFocus et LostFocus) en plus je fais un LoadFile et il ne se passe rien.
En Control UserForm c'est encore pire. C'est de la daube.

AcroPDF.gif
 
ho!! les salos!!! le plugins fonctionne pendant une 10 aine d'ouverture avec le dernier adobe reader après c'est fini
et quand j'ouvre un pdf il me demande de me connecter ou et créer un compte adobe sinon il m'ouvre pas le pdf
les salos!!!!


du coup je l'ai enlevé et j'ai mis une vielle version 9.0
 
J'ai fait un fallback sur Adobe Acrobat Reader avec un restore complet du disque système car ce genre de logiciel est totalement invasif.
J'essaie avec le Control ActiveX CoPDFXCview1 de PDF XChange Viewer qui est mon PDF Viewer par défaut.
Ça marche mais là il y a un filigrane version Démo donc pas utilisable non plus.
 
L'autre problème, c'est qu'un Control ActiveX, on ne peut pas le placer à droite si on a réduit la grille Excel.
Il ne peut être QUE dans la grille Excel.
Donc faudrait voir avec "Custom Task Panes".
peut être que custom taskpane ajoute une fenêtre justement c'est ce que l'on fait en vba
une fois que j'ai compris comment marche adobe reader DC je l'ai remis
il est simplement plus lourd que les ancienne version et demande plus de temps dans le webbrowser
donc chez moi les deux methode fonctionnent nikel

methode userform avec webbrowser avec adobe reader DC installé d'aujourd'hui donc certainement le dernier plugin
on a l'avantage de pouvoir gérer la fermeture du userform et par conséquent de remettre en volet full pane
demo3.gif



méthode edge moins rapide
et on ne gère pas la fermeture pour remettre en volet fullpane il faut le faire avec un bouton
demo3.gif
 
- 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
Retour