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 ?

 
l y a le nom du fichier dans le caption dans xchange viewer ) ?
Pas toujours. C'est pour ça que j'ai introduit des "AlternateNames" sur par exemple PDF ("PDF-XChange Viewer") pour chercher dessus en plus du nom de fichier sans extension et tronqué à 30.
as-tu essayé le bouton Txt
Txt fonctionne !

Chez moi je n'arrive toujours pas à faire un SetParent opérationnel sur l'application Photos.
Et impossible de lancer un HTML.
 
Tu as essayé avec ma version ? cela fonctionne chez moi :
Ben pas chez moi @nullosse. Ça ouvre l'image, certes, mais c'est tout. Ça part en Timeout. Sur cette JPG et d'autres.

Edit: mais peut-être n'utilises-tu pas l'application Photos par défaut ? Ou bien ce n'est pas la même que la mienne.
 
Dernière édition:
Non, en affichage de photo je n'ai pas de photos.exe dans le gestionnaire de tâches. Je ne vois pas de processus susceptible de correspondre.
Et je n'ai pas le même affichage que toi. Donc ce n'est pas la même application.

 
Je vais faire une version sur la base de ton idée de scanner régulièrement toutes les Windows, mais comme je ne connais pas UIAutomation, je vais le faire en API. Car baser la recherche sur une nouvelle Window peut être défaillant lorsque l'application qui prend en charge le fichier est déjà active, comme par exemple un Internet Browser qui ouvre un nouvel onglet au lieu d'une nouvelle fenêtre.

Edit: Mais ça ne peut fonctionner qu'en recherche sur nom de fichier seulement, donc pas bon (le nom n'y est pas toujours, en GetWindowText() en tous cas, en UIAutomation je ne sais pas) on recherche aussi par exemple "Mozilla Firefox" on peut tomber sur pas la bonne fenêtre. Pfff !
 
Dernière édition:
re
j'ai trouvé une alternative intéressante pour ton problème de focus @Dudu2
pour la faire simple
ouvrir le document (celui sue tu veux) application par defaut ou celle que tu veux
capter son handle
ouvrir un userform vide
capter le handle
setparent handleapp,andleform
capter le handle de "XLDESK" (parent du excel7
setparent handleform,handleXLDESK

et tu n'a plus besoin de tourner en boucle pour reprendre le focus quand tu est dans une ou l'autre des volets
en gros le userform sert de plaque intermediaire
exemple csb avec bloknot
VB:
Sub Ouvrir_Text_bloknote2()
    Dim AppHandle As LongPtr
    Dim fichier$
    Dim notepadpath$
    Dim N$, used As Boolean
    If TaskPaneUsed Then MsgBox " le volet est deja utilisé" & vbCrLf & "Vous devez fermer le volet actuel": Exit Sub
    
    fichier = Application.GetOpenFilename("pdf Files (*.txt;*.csv;*.bat;*.cmd), *.txt;*.csv;*.bat;*.cmd", 1, "ouvrir un fichier")
    If fichier = "Faux" Then Exit Sub
    
    'au cas ou windows ne serait pas installé sur "C" on prefere aller chercher le chemin de l'exe
    notepadpath = CreateObject("Scripting.FileSystemObject").GetSpecialFolder(0).Drive '0 = WindowsFolder
    notepadpath = notepadpath & "\Windows\System32\Notepad.exe"
    Shell """" & notepadpath & """ """ & fichier & """", vbNormalFocus
    
    N = Split(Mid(fichier, InStrRev(fichier, "\") + 1), ".")(0)
    AppHandle = GetWinHandle("Notepad", N, 10) 'appel de ma fonction getwinhandle
    If [D1] = "Vrai" Then SetWindowLong AppHandle, -16, &H16000000 'checkbox on vire la caption
    
    docking AppHandle
    Dim AppForm As LongPtr
    If TaskPaneUsed Then MsgBox " le volet est deja utilisé" & vbCrLf & "Vous devez fermer le volet actuel": Exit Sub
    Set usf = UserForm1
    With usf
        .Show 0
    End With
    AppForm = GetActiveWindow
    If [D1] = "Vrai" Then SetWindowLong AppHandle, -16, &H16000000 'checkbox on vire la caption
    
    SetParent AppHandle, AppForm
    
    docking AppHandle
End Sub
Patrick
 
sérieux ?!!!!
depuis le debut je te le dis
que le raccourci que tu a pris n'est pas bon c'est pour ca que tu es ennuyé en aval
que tu rattrape par tout les moyen a coup de statique et autres astuce de ton cru
tu la ma fonction AllPartExcelWindowList
alors que pour tester une fentre tu lance ma fonction liste (qui liste uniquement les fenêtres excel y compris celles que tu a docké)
et des que tu truve une intrue par sa classe tu shunt
 
tu la ma fonction AllPartExcelWindowList
Je vois pas en quoi les Handles des fenêtres et sous-fenêtres Excel peuvent m'aider à trouver le Handle de la fenêtre du document.
Car c'est ça le vrai problème.
Après une fois qu'on l'a, la rattacher au XLDESK est une formalité et on n'a pas besoin de connaître les noms de arrières petits cousins, nièces et neveux de la fenêtre Excel.
Ou alors quelque chose m'échappe dans ton message.
 
Je viens de tester une nouvelle méthode :
On récupère tous les handles de fenêtres filles du bureau dans un dico juste avant d'ouvrir le fichier et après avoir ouvert le fichier on fait une boucle qui cherche une fenêtre dont le handle n'est pas dans le dico . Cela a l'air de fonctionner. En pièce jointe un classeur de test
 

Pièces jointes

@nullosse, en effet c'est une approche possible qui converge vers la méthode que j'utilise consistant à détecter les nouvelles fenêtres.
Mais attention, comme je l'ai constaté avec ma méthode, une nouvelle fenêtre n'est peut-être pas la bonne car il peut y en avoir une pour le lancement et une finale. Alors avec UIA c'est peut-être différent.

Cette méthode (ainsi que celle que j'utilise) a l'inconvénient d'exiger que le lancement du document créé une nouvelle fenêtre.
Si un Browser (ou autre application) est paramétré pour ouvrir un nouvel onglet et pas une nouvelle fenêtre, on ne trouvera pas de nouvelle fenêtre.

Si l'API GetWindowText() ne rend pas toujours le nom du fichier, et plutôt même rarement, une piste serait Window.Caption ?
Par contre je ne sais pas définir un objet Window à partir de son Handle. A part tout balayer.
 
ben sinon on peut faire un double test :
1 - Nouvelle fenêtre
2 - Tester aussi si il y a le nom simplifié du fichier que l'on vient d'ouvrir dans une des fenêtres présentes (cas où l'appli ouvrant le document était déjà lancé)
VB:
Function WaitWinAppli2(dico, filename, TimeOut) As IUIAutomationElement
...
Dim fso As Object, miniFilename As String, i As Integer, x As Integer
Set fso = CreateObject("Scripting.FileSystemObject")
miniFilename = fso.GetBaseName(fso.GetFileName(filename))
...
 If Not dico.Exists(hwnd) Or InStr(1, oUIAelem.GetCurrentPropertyValue(UIAutomationClient.UIA_NamePropertyId), miniFilename) > 0 Then
 
Dernière édition:
Pour faire plaisir à @patricktoulon, j'ai supprimé le SetTimer (et donc l'Addressof) pour faire la boucle et j'ai fait une boucle d'attente normale comme @nullosse.
Ça a l'avantage de permettre la reconnaissance du nom du fichier dans la nouvelle fenêtre donc j'ai supprimé mes "AlternateNames".
Sauf pour les Browser où le titre de la fenêtre ne contient pas forcément le nom du fichier auquel cas je cherche aussi "Mozzilla Firefox" ou "Chrome" ou "Edge" pour couvrir le standard.



Ça reste basé sur la détection d'un nouvelle fenêtre activée (API GetForegroundWindow) et contrairement à ce que j'ai dit avant, cela fonctionnera aussi pour une Application qui ouvre un nouvel onglet et pas une nouvelle fenêtre. Car en ouvrant l'onglet, l'Application s'active et est détecté dans la boucle.

Edit: au 166ème Post, je pense que ce sera mon dernier mot Jean-Pierre.
 

Pièces jointes

Dernière édition:
- 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
929
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…