Microsoft 365 Forcer l'affichage de mon userform (barre de progression) sur l'écran où le classeur est actif (cas des doubles/triples écrans)

Le_Phénomène

XLDnaute Nouveau
Bonjour,

Dans l'un de mes projets, je fais afficher une barre de progression via un userform afin de faire "patienter" l'utilisateur (et histoire que ce dernier ne panique pas trop lors de traitements un peu longuais ;) - ça les rassure) :
1730798875040.png


Sauf que... selon les configurations des uns et des autres, de leur choix d'ouvrir/placer le classeur Excel sur tel ou tel écran (l'équipe dispose tous d'un double écran avec affichage étendu et certain utilise même leur laptop comme troisième écran), mon userform s'affiche toujours par défaut sur l'écran principal définit dans les paramètres Windows.

Donc pas de souci lorsque l'utilisateur à son classeur ouvert sur le moniteur déclaré comme écran principal mais c'est bof lorsqu'il a décidé de placer son classeur sur l'un des écrans secondaire.

Je souhaiterai donc pouvoir :
1- savoir sur quel écran est activé le classeur Excel qui mouline
2- forcer l'affichage de mon userform sur ledit écran

Si un éminant expert à une solution ou une voie sur laquelle je peux m'orienter, je l'en remercie par avance.

En vous souhaitant une bien agréable journée.
Franck
 
Solution
Bonjour,
Merci @TooFatBoy pour ton (si on peut tutoyer sur ce forum ? 🤔) message.
En fouillant un peu plus, je suis tombé sur un message de @Lolote83 qui semble répondre à ma problématique.
Je ne l'ai pas encore complétement testé sur d'autres postes et sur les triple-écrans.
Il faut également que j'en comprenne bien le sens et l'application (histoire de progresser).
Je ne manquerai pas de clôturer cette demande asap.
Pour mémoire, ci-après son code.

VB:
Private Sub UserForm_Initialize()
    '-------------------------------------------------------- Positionnement UserForm
    Me.StartUpPosition = 0                                                  'Déclarer position MANUAL
    Me.Left = Application.Left +...

Dudu2

XLDnaute Barbatruc
Alors oui, en retirant la titre / caption du UserForm ça règle le problème de l'apparence différente.
Et c'est vrai qu'à partir du moment où c'est l'ActiveWindow qui est Parent du UserForm, il en devient complètement solidaire et ne peut d'ailleurs être affiché en dehors de cette fenêtre.
 

Dudu2

XLDnaute Barbatruc
C'est sans doute la solution la plus simple pour la question posée.
Le ressource aiderait surtout en cas d'affichage du UserForm sur un moniteur précisément différent, et non le même comme demandé ici. Sauf s'il veut le Caption et/ou une position non liée à la fenêtre Excel (l'écran ou la workarea).
 

patricktoulon

XLDnaute Barbatruc
C'est sans doute la solution la plus simple pour la question posée.
Le ressource aiderait surtout en cas d'affichage du UserForm sur un moniteur précisément différent, et non le même comme demandé ici. Sauf s'il veut le Caption et/ou une position non liée à la fenêtre Excel (l'écran ou la workarea).
il suffirait de faire un show perso pour switcher(intra/extra)
 

patricktoulon

XLDnaute Barbatruc
tiens @Dudu2
c'est plus ".show "mais ". showIntra false ou true)
sinon tu a aussi ".showIntra , 150,200" pour le placer ou on veut extra application
on pourrait aussi ajouter les 3 options en même temps intra plus sur une cellule en particulier
bref y a du bon dans la simplicité non ?
 

Pièces jointes

  • exemple progressebar loccked in application excel.xlsm
    201.1 KB · Affichages: 10
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonjour @patricktoulon,
Alors avec le positionnement sans le SetParent, @Le_Phénomène risque de retomber dans son problème initial.
Car la position que tu donnes (150, 200) fonctionne pour 1 moniteur mais ce ne sont pas forcément des coordonnées sur le moniteur de la fenêtre active.

Il vaut mieux qu'il utilise ta version précédente avec le SetParent avec éventuellement la suppression du Caption. C'est suffisant.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Tu pourrais éventuellement corriger le .Left et le .Top du UserForm en y ajoutant les .Left et .Top de l'ActiveWindow, mais dans ce cas tu retombes obligatoirement en "intra", certes avec le design dwmapi.dll.
Pour être en "extra" ou indépendant de la fenêtre active il faut connaître le RECT du moniteur où se trouve la fenêtre active. Et là il faut passer par les fonctions sur moniteur qu'on peut trouver dans ma ressource pré-citée.
 

patricktoulon

XLDnaute Barbatruc
tiens @Le_Phénomène voici un exemple simple de progressbar dans la statusbar
pour les macro extrêmement longues je fait clignoter le mot "progression"(maj/min)
pour que l'on voit que ça tourne toujours
VB:
'exemple progressbar perso dans status bar
'patricktoulon
Sub test2()
   With Application
   .WindowState = xlNormal
  .Width = 600
  .Height = 500
  End With
  For i = 1 To 1000000
        Cells(i, 1) = Rnd * 1000000
       ShowStatusBar i, 1000000 'mise a jour de la progressbar avec l'index d'incrementation et la fin
        DoEvents
    Next
End Sub


Sub ShowStatusBar(ind, max)
    Dim barre$, fin&, it&, perct&
   Static TiM As Double
   If TiM = 0 Then TiM = Timer
   barre = WorksheetFunction.Rept(ChrW(9618), 20)
   If Int(Timer - TiM) Mod 2 = 0 Then p = "PROGRESSION" Else p = "Progression     "
   fin = Int(max / (max / 20))
    it = Int(ind / (max / 20))
    Mid$(barre, 1, it) = Application.Rept(ChrW(9608), it)
    perct = Int(100 * (it / fin))
    Application.StatusBar = " - " & p & " : |" & barre & "|  " & perct & " %  "
If ind = max Then TiM = 0: Application.StatusBar = "Opération terminée"
End Sub

regarde bien la barre de status

Regarde la pièce jointe 1206672
 

patricktoulon

XLDnaute Barbatruc
re

Comme je te l'ai dit ta ressource ne fonctionne pas chez moi
en 2013 vba 7 32 bits
j'ai ma propre methode pour cibler les écrans souvient toi(droite/gauche) que j'ai amélioré avec haut milieu bas

après l'apel avec les argument left et top c'est vraiment pour dire d'avoir l'option mais ça n'a pas grand intérêt je dois l'avouer
 

patricktoulon

XLDnaute Barbatruc
pour être honnête avec ma méthode ""droite gauche amélioré en point cardinaux+inter
j'ai la possibilité de placer mes fenêtre ou je veux bon ca n'a plus vraiment d'importance maintenant
puisque je travaille sur un seul ecran 137 cm
mais mon raisonnement etait simple
boucle de -6000 a +6000 avec step de 1000 pour droite gauche
et jump sur le x de-100 pour les nord et sud et inter
en testant le point (x,y)ou il se trouve si le handle retrourné n'est pas le même c'est un autre ecran
et je récupère les properties écran par son handle
termine j'ai donc nord/sub /west/est et les inter entres deux
autrement je peux redessiner avec des carrés comment sont placé les écrans quasiment à l'identique que dans la fenêtre de paramètres écran
tout simplement en le comparant au point (0,0)
 

Statistiques des forums

Discussions
314 588
Messages
2 110 988
Membres
111 002
dernier inscrit
Lolo73i