[VBA] ajuster largeur ActiveWindow selon largeur tableau

F22Raptor

XLDnaute Impliqué
Hello,
Je règle la largeur de la fenêtre du classeur à une certaine taille :
If ActiveWindow.WindowState = -4143 Then ActiveWindow.Width = 630 ' -4143 = fenêtre non agrandie

Car c'est à peu près la taille qui correspond à la taille de mon tableau, dont la somme des largeurs de colonnes est d'environ 105.
Mais parfois, j'ai une colonne un peu plus large car le contenu est plus long que d'habitude.
Y a-t-il une correspondance mathématique entre la largeur des colonnes, et la largeur de la fenêtre ?
Du genre : largeurColonne x 6 = largeurFenêtre ?

Merci ! :)
 
Dernière édition:

F22Raptor

XLDnaute Impliqué
Re : [VBA] ajuster largeur ActiveWindow selon largeur tableau

Salut Geedee
Ton code ajuste le facteur de zoom, mais pas la largeur de la fenêtre de classeur elle-même.
Je parle bien d'un classeur qui ne soit pas "agrandi" dans Excel, mais "réduit" (clic sur le double carré), de façon à pouvoir afficher plusieurs classeurs les uns à côté des autres (comme avec Fenêtre-> Afficher côte à côte).
 

david84

XLDnaute Barbatruc
Re : [VBA] ajuster largeur ActiveWindow selon largeur tableau

Bonjour,

as-tu essayé en utilisant la propriété Width de ta plage de données ?

Un essai en partant du principe que la plage débute cellule A1 :
Code:
Sub RedimLargFenetre()
Dim Pl As Range
Set Pl = [A1].CurrentRegion
With ActiveWindow
    .WindowState = xlNormal
    .Top = 1
    .Left = 1
    .Height = Application.UsableHeight
    .Width = Pl.Width + 30
End With
End Sub

A+
 

david84

XLDnaute Barbatruc
Re : [VBA] ajuster largeur ActiveWindow selon largeur tableau

Bonjour,

Je prends "+40" pour la largeur de l'ascenseur droit, et ça m'amène au bord de la dernière colonne
On peut (peut-être) être un peu plus précis en utilisant des API afin de récupérer la largeur de l'ascenseur vertical et le contour de la fenêtre Excel.
La largeur de la fenêtre active correspond ainsi à la largeur de la plage préalablement convertie en pixels + la largeur de l'ascenseur vertical + contour de la fenêtre Excel :

Code:
Option Explicit

#If Win64 Then
  Declare PtrSafe Sub GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT)
  Declare PtrSafe Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
  Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
  (ByVal hWnd1 As Long, ByVal hwnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
#Else
  Declare Sub GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT)
  Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
  Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
  (ByVal hWnd1 As Long, ByVal hwnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
#End If

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type


Sub RedimLargFenetreAPI()
Dim Pl As Range
Dim hwnd As Long
Dim Zone As RECT
Dim LargAscenseur As Long
Dim BordFeuille As Long


  'on récupère le pixel du bord gauche de la fenêtre Microsoft Excel
  hwnd = Application.hwnd
  GetWindowRect hwnd, Zone
  BordFeuille = Zone.Left
  
  'on récupère le Handle de l'ascenseur vertical
  hwnd = FindWindowEx(hwnd, ByVal 0&, "XLDESK", vbNullString)
  hwnd = FindWindowEx(hwnd, ByVal 0&, "EXCEL7", vbNullString)
  hwnd = FindWindowEx(hwnd, ByVal 0&, "NUIScrollbar", vbNullString)
  
  'on récupère la largeur en pixels de l'ascenseur vertical
  GetClientRect hwnd, Zone
  LargAscenseur = Zone.Right
  
  Set Pl = [A1].CurrentRegion
  
  With ActiveWindow
      .WindowState = xlNormal
      .Top = 1
      .Left = 1
      .Height = Application.UsableHeight
      'on convertit la largeur de la plage en pixels + largeur de l'ascenseur + contour de la fenêtre Excel
      .Width = ActiveWindow.PointsToScreenPixelsX(Pl.Width) + LargAscenseur + BordFeuille
  End With
  
End Sub

C'est juste une idée à tester plus avant pour voir si c'est fiable.
A+
 

Statistiques des forums

Discussions
312 046
Messages
2 084 850
Membres
102 686
dernier inscrit
Franck6950