XL 2016 VBA - Alternative à AddressOf dans un module de classe / UserForm

Dudu2

XLDnaute Barbatruc
Bonjour,
Quelqu'un a-t-il déjà tenté ce challenge ?
Merci
 

patricktoulon

XLDnaute Barbatruc
re
la ou ça se compliquera c'est avec plus de 2 ecrans
pour 2 c'est tres simple
le point(0,0) donne le point (0) de l’écran principal (et je dis bien principal)
il suffit de tester en dessous 0 et au dessus du width +1 du hmonitor
là tu saura qui est le gauche et celui qui est a droite
après c'est simple
dans le activate si tu le veux a gauche ben c'est (-le width du rcmonitor-width de ton form/2)
et tu l'aura au centre de ton ecran gauche

tu le veux sur l'ecran de droite
ben c'est (width du Hmonitor-width du form/2)

voila là on raisonne plus en écran 1 ou 2 on raisonne écran gauche ou droite
;)
pas compliqué l'affaire
 

Dudu2

XLDnaute Barbatruc
La position centrée écran d'un UserForm sur Windows se traduit donc ce cette manière:
VB:
With MonitorInformation
    Me.StartUpPosition = 0
    Me.Left = PixelsToPointsX(.rcMonitor.Left) + (PixelsToPointsX(.rcMonitor.Right - .rcMonitor.Left) - Me.Width) / 2
    Me.Top = (PixelsToPointsY(.rcMonitor.Bottom - .rcMonitor.Top) - Me.Height) / 2
End With
PixelsToPointsX/Y étant les fonctions de conversion Pixels en Points (chez moi basées sur l'API)
 

patricktoulon

XLDnaute Barbatruc
re
oui voila en gros c'est ça mon raisonnement
il n'est plus question ici d’écran 1 ou 2 ou principal et secondaire mais gauche et droite
c'est la conclusion à la quelle on était arrivé avec mes camarades de DVP
sauf ta première ligne qui a mon avis ne va pas si tu le veux dans l'ecran de droite
a mon avis ca serait plutot ca ( a condition que tu es les deux handel de monitor hmonitor et rc monitor
sachant que le moniteur gauche est au point(0-1,1)
une fois que tu a le gauche tu ajoute son width+1 pour avoir le droite
tu recupere ton MI donc sa resolution
et avec elle ben

Me.Left = PixelsToPointsX(monoitorgauche.Left) + monitorgauche.width+(monitordroite-form.width)/2
enfin je dis ça mais je me souviens plus, tu devrais faire une recherche sur DVP
la fonction que l'on avait fait était chouette
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
tiens @Dudu2
teste ça dans un module et un simple userform
VB:
Option Explicit


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

Private Type MONITORINFO: cbSize As Long: rcMonitor As RECT: rcWork As RECT: dwFlags As Long: End Type

Private Declare Function GetMonitorInfo Lib "user32.dll" Alias "GetMonitorInfoA" (ByVal hMonitor As Long, ByRef lpmi As MONITORINFO) As Long

Private Declare Function MonitorFromPoint Lib "user32.dll" (ByVal x As Long, ByVal y As Long, ByVal dwFlags As Long) As Long

Sub affiche_a_Gauche()    'centre ecran gauche ou centre de l'ecran par defaut si un seul ecran
    Dim MI_G As MONITORINFO, Mx, My, MG, gauche#, LtoP, fois&, PtPx#
   
    Mx = MonitorFromPoint(100, 100, &H2)    '&H2=MONITOR_DEFAULTTONEAREST
   
    My = MonitorFromPoint(-100, -100, &H2)    '&H2=MONITOR_DEFAULTTONEAREST
   
    MG = Mx: fois = 1
   
    If Val(My) <> Val(Mx) Then MG = My: fois = -1
   
    PtPx = 0.75    ' que saint DUDU me pardonne j'en ai ras le bol de ce ptpx :):):)
   
    MI_G.cbSize = Len(MI_G): GetMonitorInfo MG, MI_G

   
    gauche = (((MI_G.rcMonitor.Right * PtPx) - (UserForm1.Width)) / 2) * fois
   
    LtoP = (((MI_G.rcMonitor.Bottom * PtPx) - (UserForm1.Height)) / 2) * fois
   
    With UserForm1
        .Show 0
        .Move gauche, LtoP
    End With
End Sub
ps: mettre quand même le userform en startupposition 0
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Heureusement que je viens de recevoir en soirée mon Switch HDMI.
Ça me simplifie les branchements. Car je n'ai la config 2 écrans qu'avec mon petit laptop qui squatte l'écran de mon desktop (ordi sur lequel je "travaille") comme écran secondaire !

Alors en effet, ça place le UserForm sur l'écran de gauche quand Excel est sur l'écran de droite.
 

patricktoulon

XLDnaute Barbatruc
Alors en effet, ça place le UserForm sur l'écran de gauche quand Excel est sur l'écran de droite.
on s'en fou que excel soit a gauche ou a droite
je prends &H2 soit MONITOR_DEFAULTTONEAREST donc l'area ou se trouve les points indiqués
sans distinction de l'ecran principal ou pas

on peut même dès considérer dès lors que avec ça tu a la droite et la gauche finalement
en ajoutant une condition que même si tu est en fois - ben fois se transforme en abs(fois)
tout simplement
pigé?
gauche/droite
LOL
;)
 

patricktoulon

XLDnaute Barbatruc
re tiens
VB:
Sub test()
'coté:=0 =ecran gauche
'coté:=1 =ecran  droite si 2 ecran ou ecran si un seul ecran
afficheUserform UserForm1, coté:=1
End Sub
Sub afficheUserform(usf, Optional coté As Long = 0)   'centre ecran gauche ou centre de l'ecran par defaut si un seul ecran
    Dim MI_G As MONITORINFO, Mx, My, MG, gauche#, LtoP, fois&, PtPx#
    
    Mx = MonitorFromPoint(100, 100, &H2)    '&H2=MONITOR_DEFAULTTONEAREST
    
    My = MonitorFromPoint(-100, -100, &H2)    '&H2=MONITOR_DEFAULTTONEAREST
    
    MG = Mx: fois = 1
    
    If Val(My) <> Val(Mx) Then MG = My: fois = -1
    
    If coté = 1 Then fois = Abs(fois)
    
    PtPx = 0.75    ' que saint DUDU me pardonne j'en ai ras le bol de ce ptpx :):):)
    
    MI_G.cbSize = Len(MI_G): GetMonitorInfo MG, MI_G

    
    gauche = (((MI_G.rcMonitor.Right * 0.75) - (UserForm1.Width)) / 2) * fois
    
    LtoP = (((MI_G.rcMonitor.Bottom * 0.75) - (UserForm1.Height)) / 2) * fois
    
    With usf
        .Show 0
        .Move gauche, LtoP
    End With
End Sub
moi j’étais un peu plus haut que Fréjus
 

Dudu2

XLDnaute Barbatruc
1699042058670.gif
1699042113155.png
1699042208744.gif
1699042256756.gif
1699042141536.gif
 

Dudu2

XLDnaute Barbatruc
Nan, c'est bon, j'ai compris le principe. Je maîtrise
1699042612321.gif

Tant que mon "Custom MsgBox" se positionne où il faut, je suis satisfait.

Y a que sur MAC que je n'ai pas pu le tester mais je suis confiant (ok la confiance n'a jamais remplacé les tests)
 

patricktoulon

XLDnaute Barbatruc
re
ben tant pis je l'ai fait
VB:
Option Explicit


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

Private Type MONITORINFO: cbSize As Long: rcMonitor As RECT: rcWork As RECT: dwFlags As Long: End Type

Private Declare Function GetMonitorInfo Lib "user32.dll" Alias "GetMonitorInfoA" (ByVal hMonitor As Long, ByRef lpmi As MONITORINFO) As Long

Private Declare Function MonitorFromPoint Lib "user32.dll" (ByVal x As Long, ByVal y As Long, ByVal dwFlags As Long) As Long

Private Declare Function MonitorFromWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal dwFlags As Long) As Long
Sub test()
'coté:=0    =l'ecran gauche si 2 ecran ou ecran si un seul ecran
'coté:=1    =l'ecran  droite si 2 ecran ou ecran si un seul ecran
'coté:=2    ='lécran ou se trouve la fenêtre excel
'coté omis  =gauche par defaut ou ecran  si un seul ecran
afficheUserform UserForm1, coté:=2
End Sub
Sub afficheUserform(usf, Optional coté As Long = 0)   'centre ecran gauche ou centre de l'ecran par defaut si un seul ecran
    Dim MI_G As MONITORINFO, Mx, My, MG, MExcel, gauche#, LtoP, fois&, PtPx#
    
    Mx = MonitorFromPoint(100, 100, &H2)    '&H2=MONITOR_DEFAULTTONEAREST 'l'ecran a 100 de droite du point (0,0)
    
    My = MonitorFromPoint(-100, -100, &H2)    '&H2=MONITOR_DEFAULTTONEAREST'l'ecran a -100 de gauche du point (0,0)
    
    MExcel = MonitorFromWindow(Application.hWnd, &H1) ' l'ecran ou se trouve l'application excel
    
     MG = Mx: fois = 1
    
    If Val(My) <> Val(Mx) Then MG = My: fois = -1
    
    If coté = 1 Then fois = Abs(fois)
    
    If coté = 2 Then MG = MExcel: fois = 1
    
    PtPx = 0.75    ' que saint DUDU me pardonne j'en ai ras le bol de ce ptpx :):):)
    
    MI_G.cbSize = Len(MI_G): GetMonitorInfo MG, MI_G

    
    gauche = (((MI_G.rcMonitor.Right * 0.75) - (UserForm1.Width)) / 2) * fois
    
    LtoP = (((MI_G.rcMonitor.Bottom * 0.75) - (UserForm1.Height)) / 2) * fois
    
    With usf
        .Show 0
        .Move gauche, LtoP
    End With
End Sub
si c'est pas du code simple je fait plus du vba moi
bref comme tu peux le constater et je le redis raisonner gauche droite rend la chose plus facile et limpide
plutot que q'aller chercher ;
  1. quel est le principal
  2. est il a droite ou à gauche
  3. est il le 1 ou le 2
  4. etc...blablabla
méthode et raisonnement
  • tu parts du point 0,0
  • tu teste à gauche de moins quelque chose
  • si le moniteur n'est pas le même alors on prend le gauche
  • et on pars de lui
  • dimension MI rectangle etc... blabla
  • et la dimension sera multipliée par -1 (on obtient le negatif du point 0
  • si le moniteur c'est le même alors on est sur ecran droite ou ecran si il y a qu'un ecran
  • même punition MI rectangleblablabla
  • et la dimension sera multiplier par 1
terminer tout le monde descend
;)
gauche /droite
diabolo.gif
 

Discussions similaires

Réponses
29
Affichages
921
Réponses
10
Affichages
247

Statistiques des forums

Discussions
312 215
Messages
2 086 330
Membres
103 187
dernier inscrit
ebenhamel