XL 2016 VBA - 2 écrans - Positionner un UserForm dans le même ou l'autre écran par rapport à Excel

Dudu2

XLDnaute Barbatruc
Bonjour à tous,

Si quelqu'un possède 2 moniteurs, j'aimerais qu'il prenne quelques minutes pour tester les 3 boutons de ce programme et vérifier si ça fait ce que ça dit ou si ça part en live complet !
En prenant la peine de positionner la fenêtre Excel une fois dans le Moniteur primaire et une fois dans le Moniteur secondaire.
1658178684681.png

Merci par avance.
 

Pièces jointes

  • VBA Multiple 2 Moniteurs Screens Écrans.xlsm
    35.4 KB · Affichages: 11
Solution
@TooFatBoy,
Super, je crois qu'on peut dire qu'on a réussi ! Et c'est tout sauf simple !
Je dis "on" parce que sans ta config complètement bizarre et ton assiduité aux tests, rien n'aurait été possible.
Merci pour ton aide. Je reposte le fichier ici pour faire de ce post la solution.

Je rappelle la partie utile du bidule:
Dans le Module_UserFormMultipleScreens, 2 fonctions de positionnement UserForm:
- PlaceUserFormInExcelSameMonitor(Usf, Position)
- PlaceUserFormInExcelOtherMonitor(Usf, Position)

La position est une des constantes publiques déclarées dans le module en question:
VB:
Public Const PositionMiddle = "Middle"
Public Const PositionTopLeftCorner = "TopLeftCorner"
Public...

Dudu2

XLDnaute Barbatruc
J'ai trouvé par chance une autre méthode pour la Barre des Tâches de chaque écran.
Tu peux essayer ce fichier ?

Y a juste un truc qui m'échappe totalement. C'est la conversion Pixels -> Points avec des ratios différents pour chaque écran. Je ne me suis pas penché sur la question car les tests fonctionnent très bien chez moi avec des écrans de ratios différents de 1,33333 et 1,66666 pour la conversion.
 

Pièces jointes

  • VBA Position UserForm avec 2 Moniteurs Screens Écrans.xlsm
    49.2 KB · Affichages: 1
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Bouton 2 avec Barre des tâches visible :
1- OK
2- OK
3- OK
4- OK
5- OK

Bouton 2 avec Barre des tâches masquée automatiquement :
1- OK
2- UserForm non visible (Left=0 et Top=1620)
3- UserForm non visible (Left=2553,75 et Top=1620)
4- OK
5- OK
 

Dudu2

XLDnaute Barbatruc
Ça part de zéro. donc le dernier pixel est 3839. 3840 est le 1er pixel de l'écran de droite.
Enfin je crois...

Pour commencer par le 1er problème... J'ai ajouté un MsgBox des valeurs du Client Excel.
Peux-tu voir ce que ça dit sur le 1er bouton ?
 

Pièces jointes

  • VBA Position UserForm avec 2 Moniteurs Screens Écrans.xlsm
    53.8 KB · Affichages: 2

TooFatBoy

XLDnaute Barbatruc
Excel en primaire :

Bouton 1 : OK

Bouton 2 : le UserForm est bien sur le primaire
1- OK
2- OK
3- OK
4- OK
5- OK

Bouton 3 : le UserForm est bien sur le secondaire
1- OK sur la largeur mais pas sur la hauteur
2- UserForm non visible ( Left=-1440 et Top=0)
3- UserForm non visible ( Left=-326,25 et Top=0)
4- UserForm bien à gauche mais pas en bas
5- UserForm bien à droite mais pas en bas



Je pense que tu as oublié de tenir compte du fait que les moniteurs ne sont pas forcément alignés.

[edit]
En effet, c'est tout bon pour le bouton 3 si j'aligne le haut des deux moniteurs.
[/edit]
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour @Dudu2
Attention!!!!!
rcMonitor As RECT
rcWork As RECT
selon le mode d'affichage des ecrans , (dupliqué ou entendu et/autres ) ces deux rect donnent pas la même chose
par exemple chez moi sur mon pc portable
ci dessous le mode d'affichage
ecran pc et tv sur hdmi
1658499079474.png


ici ça me donne
la résolution paramétré de l’écran du pc
et
la dimension de la surface de travail de l’écran du PC qui en effet diminue un peu quand je branche l'ecran2(tv) sur le hdmi
mais ça me donne pas la résolution de l'ecran 2

1658499413033.png


VB:
#If vba7 Then
Declare ptrsafe Function  GetMonitorInfo Lib "user32.dll" Alias "GetMonitorInfoA" (ByVal hMonitor As Long, ByRef lpmi As MoniteurInfo) As Long
Declare  ptrsafe Function MonitorFromPoint Lib "user32.dll" (ByVal x As Long, ByVal y As Long, ByVal dwFlags As Long) As Long
Declare  ptrsafe Function MonitorFromRect Lib "user32.dll" (ByRef lprc As RECT, ByVal dwFlags As Long) As Long
Declare  ptrsafe Function MonitorFromWindow Lib "user32.dll" (ByVal hwnd As Longptr, ByVal dwFlags As Long) As Long
Declare  ptrsafe Function EnumDisplayMonitors Lib "user32.dll" (ByVal hdc As Longptr, ByRef lprcClip As Any, ByVal lpfnEnum As Long, ByVal dwData As Long) As Long
Declare  ptrsafe Function GetWindowRect Lib "user32" (ByVal hwnd As Longptr, lpRect As RECT) As Long
#Else
Declare Function GetMonitorInfo Lib "user32.dll" Alias "GetMonitorInfoA" (ByVal hMonitor As Long, ByRef lpmi As MoniteurInfo) As Long
Declare Function MonitorFromPoint Lib "user32.dll" (ByVal x As Long, ByVal y As Long, ByVal dwFlags As Long) As Long
Declare Function MonitorFromRect Lib "user32.dll" (ByRef lprc As RECT, ByVal dwFlags As Long) As Long
Declare Function MonitorFromWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal dwFlags As Long) As Long
Declare Function EnumDisplayMonitors Lib "user32.dll" (ByVal hdc As Long, ByRef lprcClip As Any, ByVal lpfnEnum As Long, ByVal dwData As Long) As Long
Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
#End If

Const MONITORINFOF_PRIMARY = &H1
Const MONITOR_DEFAULTTONEAREST = &H2
Const CCHDEVICENAME = 32

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

Type MoniteurInfo
  cbSize As Long
  rcMonitor As RECT
  rcWork As RECT
  dwFlags As Long
  szDevice As String * CCHDEVICENAME
End Type

Dim A$

Sub EnumEcrans()
A$ = ""
EnumDisplayMonitors ByVal 0&, ByVal 0&, AddressOf MonitorEnumProc, ByVal 1&
MsgBox A$
End Sub
Public Function MonitorEnumProc(ByVal hMonitor As Long, ByVal hdcMonitor As Long, lprcMonitor As RECT, ByVal dwData As Long) As Long
Dim MI As MoniteurInfo

MI.cbSize = Len(MI)
GetMonitorInfo hMonitor, MI

With MI.rcMonitor
  A$ = A$ & "Moniteur Width/Height : " + CStr(.Right - .Left) + "x" + CStr(.Bottom - .Top) & vbLf
End With
''---
With MI.rcWork
  A$ = A$ & "Moniteur Width/Height (surface de travail) : " + CStr(.Right - .Left) + "x" + CStr(.Bottom - .Top) & vbLf
End With

MonitorEnumProc = 1
End Function
 

Discussions similaires

Statistiques des forums

Discussions
312 231
Messages
2 086 440
Membres
103 209
dernier inscrit
MIKA33260