XL 2016 affichage userform avec 2 ou + ecrans

roby

XLDnaute Occasionnel
Bonjour le forum,

Lorsqu'on lance un fichier Excel sur un poste avec plusieurs écrans, à chaque fois les userform s'affichent sur un autre écran que l'écran ou est affiché excel.
y a-t-il une parade pour que cet userform s'affiche dans la même fenêtre que excel ?

je joint le même fichier solutionné dernièrement pour le test.

Merci encore.
 

Pièces jointes

  • Roby1.xlsm
    19.8 KB · Affichages: 16

patricktoulon

XLDnaute Barbatruc
re
bonjour
ce matin a froid et reposé je me suis dit je vais quand même tester
j'ai donc repris ton fichier
bon pour les cellules c'est pas bien compliqué c'est bon
j'ai ajouté une feuille je l'ai fractionné et j'ai ajouté un bouton et une shape
dans l'event du bouton j'ai mis
VB:
Private Sub CommandButton1_Click()
 PositionUserFormSurObjetFeuille UserForm1, CommandButton1, True
End Sub

j'ai affecté une nouvelle macro a la shape
VB:
Sub Rectangle1_Cliquer()
 PositionUserFormSurObjetFeuille UserForm1, ActiveSheet.Shapes("dudu"), True
End Sub

somme toute rien de bien compliqué
j'ai donc par la suite tester le bouton et la shape
alors visiblement on est toujours sur la panes(1)meme si on clique dans une autre pane mais en plus le userform ne veux pas rester
demo.gif


je te donne la version de ton fichier que j'ai utilisé

entendons nous bien ce n'est pas un missile je veux juste comprendre
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonjour @patricktoulon,

La fonction ne fait que positionner le UserForm, elle ne l'affiche pas.
Tu vois un affichage fugace parce que, comme le UserForm n'est pas affiché, évidemment qu'il faut qu'il le soit pour calculer les marges avec l'API. Donc la fonction l'affiche juste le temps nécessaire à la récupération des marges.

Dans ce code (peut-être reprendre cette version plus récente), puisque je suppose que l'affichage réel du UserForm va suivre, l'affichage temporaire a lieu sur la Target sans les corrections car le décalage après corrections lors de l'affichage réel sera minime et on ne le remarquera pas.

Dans la ressource VBA - Positionner un Objet par rapport à un autre Objet - Principal concerné... le UserForm V2 que j'ai modifiée récemment pour utiliser cette API, je l'ai positionné temporairement en .Left = -10000 et .Top = -10000 pour être quasi-sûr que l'affichage temporaire (si nécessaire) n'est pas visible.
 

Pièces jointes

  • VBA Positionnement UserForm sur Objet d'une feuille.xlsm
    56.3 KB · Affichages: 1

Dudu2

XLDnaute Barbatruc
D'ailleurs j'ai modifié la ressource en testant seulement avec ma config et en supposant que ça fonctionne pour tout le monde... ce qui n'est jamais évident quand on n'a pas testé car le Bug sournois n'est jamais bien loin. Surtout que la fonction de la Ressource offre pas mal de possibilités de positionnement et de décalages.
 

patricktoulon

XLDnaute Barbatruc
re
ok avec la ressource
comment doit on appeler la sub
j'ai tester ça mais visiblement target n'est pas optional
mais c'est d'un object qu'il est question en l'occurence ici le commandbutton1
VB:
Private Sub CommandButton1_Click()
PositionObjectOnObject CommandButton1

End Sub

ta sub
VB:
Sub PositionObjectOnObject(SourceObject As Object, _
                           TargetObject As Object, _
                           Optional KeepSourceUserFormMargins As Boolean = False, _
                           Optional SourceObjectShiftLeft As Boolean = False, _
                           Optional SourceObjectShiftUp As Boolean = False, _
                           Optional TargetObjectShiftRight As Boolean = False, _
                           Optional TargetObjectShiftDown As Boolean = False, _
                           Optional CustomHorizontalShift As Double = 0, _
                           Optional CustomVerticalShift As Double = 0)
comment fait on pour un object ?
 

patricktoulon

XLDnaute Barbatruc
re
oui en lisant le code de la sub j'ai fini par voir que objectsource est sensé être un userform
tu devrais changer cet argument il prête a confusion

maintenant pour bénéficier de dwmapi.dll je dois faire quoi dans l'appel par ce qu'il y a pas mal d'arguments

quest ce que je met apres ça
PositionObjectOnObject UserFormCible, CommandButton1,??????
 

Dudu2

XLDnaute Barbatruc
oui en lisant le code de la sub j'ai fini par voir que objectsource est sensé être un userform
tu devrais changer cet argument il prête a confusion
Non, pas forcément, l'objet source peut être autre chose qu'un UserForm.
Vois les commentaires:
VB:
'Positionne un Objet source sur un Objet cible dans la mesure où cela
'est compatible et codé:
'- Objet source = UserForm -> Objet cible = Fenêtre
'- Objet source = UserForm -> Objet cible = Control de feuille
'- Objet source = UserForm -> Objet cible = UserForm
'- Objet source = UserForm -> Objet cible = Control de UserForm
'- Objet source = Control de feuille -> Objet cible = Control de feuille
D'ailleurs j'ai mal placé les déclaration API car ce sont les commentaires qui doivent apparaître en premier.
Un utilisateur a besoin des commentaires et n'a que faire des déclarations du Module. Je vais corriger.

L'API DWN est automatiquement appelée pour faire les corrections dès qu'un UserForm est impliqué soit dans l'objet source soit dans l'objet cible.
Si tu places une TextBox sur une autre TextBox, l'API DWM ne sera pas utilisée.
Si tu places un UserForm sur une TextBox ou un Control d'un autre UserForm, l'API DWM sera utilisée.
 

Dudu2

XLDnaute Barbatruc
Voilà, j'ai corrigé la Ressource pour mettre les commentaires en tête du code car c'est cela qui est important pour un utilisateur.
VB:
'----------------------------------------------------------------------
'Positionne un Objet source sur un Objet cible dans la mesure où cela
'est compatible et codé:
'- Objet source = UserForm -> Objet cible = Fenêtre
'- Objet source = UserForm -> Objet cible = Control de feuille
'- Objet source = UserForm -> Objet cible = UserForm
'- Objet source = UserForm -> Objet cible = Control de UserForm
'- Objet source = Control de feuille -> Objet cible = Control de feuille
'
'Arguments:
'---------
'Call PositionObjectOnObject(
'- SourceObject                 : Objet Source (argument obligatoire)
'- TargetObject                 : Objet Cible (argument obligatoire)
'                               Tous les arguments suivants sont optionnels
'- KeepSourceUserFormMargins    : True pour garder les marges "naturelles" et parfois invisibles du UserForm, ou False pour ne pas les garder
'                                 False par défaut
'- SourceObjectShiftLeft        : True pour décaler le positionnement de l'Objet Source de sa largeur (vers la gauche)
'                                 False par défaut
'- SourceObjectShiftUp          : True pour décaler le positionnement de l'Objet Source de sa hauteur (vers le haut)
'                                 False par défaut
'- TargetObjectShiftRight       : True pour décaler le positionnement de l'Objet Source de la largeur (vers la droite) de l'objet cible
'                                 False par défaut
'- TargetObjectShiftDown        : True pour décaler le positionnement de l'Objet Source de la hauteur (vers le bas) de l'objet cible
'                                 False par défaut
'- CustomHorizontalShift        : Nombre de point (+/-) de décalage horizontal personnalisé
'                                 0 par défaut
'- CustomVerticalShift          : Nombre de point (+/-) de décalage vertical personnalisé
'                                 0 par défaut
')
'----------------------------------------------------------------------
 

patricktoulon

XLDnaute Barbatruc
re
ben alors il y a un 2 soucis
avec ton fichier source
j'ajoute une feuille que je fractionne et j'ajoute là aussi un bouton et une shape
l'event du bouton
VB:
Private Sub CommandButton1_Click()
    PositionObjectOnObject UserFormCible, CommandButton1'on determine la position
    UserFormCible.Show 0'on l'affiche
End Sub

résultat
soucis 1°
la rectif dwmapi.dll n'est pas exact, a vue d'oeuil il ne corrige a moitié de la différence ( à vue d'oeuil)
demo.gif


soucis N°2
la pane n'est toujours pas détecté pourtant il me semble l'avoir vu ta fonction Objectpane dans le code du module
c'est toujours
la pane 1qui est prise
demo.gif



la correction dwmapi.dll fonctionne mieux sur ton model dans ce post celui de la ressource visiblement il y a un hic

après reste le problème de sélection de la bonne pane
 

patricktoulon

XLDnaute Barbatruc
ça y est je sais pourquoi la bonne pane n'est pas détecté
au regard de ton code tu n'opere que sur le fractionnement avec freezepane(gelé)mais le fractionnement sans freeze pane ta fonction ne peut pas le détecter
je vais faire des tests pour confirmer ou infirmer
 

Dudu2

XLDnaute Barbatruc
Ok, il est tout à fait possible que la Ressource ait des soucis car je ne l'ai pas testée ailleurs que sur ma config, et surtout en ajoutant l'API DWM (en remplacement des décalages précédents basés sur Width -InsideWidth) je n'ai fait AUCUNE vérification du code ! Ce qui est assez présomptueux !

Le truc c'est qu'il me faudrait un environement comme le tien ou au moins un Excel 2013 pour tester / vérifier, sinon c'est hyper difficile.
 

patricktoulon

XLDnaute Barbatruc
bon ben test concluant j'avais raison c'est bien ça
même test sur fractionnement avec freezpanes
j'ajoute une feuille je la fractionne au même endroit que l'autre mais je fige les volets (freezepanes)
autrement dit il n'y a que la panes(4) qui est mobile avec les scroll
j'ajoute un bouton au niveau de la pane 1 et un autre au niveau de la pane 4
demo.gif


ta fonction objectpane tel qu'elle est codée ne peut par faire la différence entre 4 panes non_freezepane et 4 panes avec freezepane

c'est ce que je t'expliquais avant hier

avec une feuille avec fractionnement + freezepane(volet figé ou ligne ou colonne figée)
chaque pane aura sa propre address du range (chacune différente des autres)

sans freezepane les 4 panes on le même range soit [A1:xx] et le visiblerange donne la partie visible

conclusion ta fonction objectpane ne fonctionne que sur le fractionnement figé(freezepanes)
 

Discussions similaires

Réponses
2
Affichages
424

Statistiques des forums

Discussions
312 378
Messages
2 087 746
Membres
103 658
dernier inscrit
Laurent2017