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: 17

Dudu2

XLDnaute Barbatruc
Tu sais quoi ? Je vais en rester là. Ça fonctionne comme je le souhaite au moins dans ma config.
Et si y a des soucis sur d'autres configs, il faudra que je m'y connecte car tester dans le bleu c'est pas possible.
En plus j'ai du boulot pour un utilisateur qui me demande des trucs complexes sur les TCD en VBA.
Va falloir que je gratte dans la doc.
 

patricktoulon

XLDnaute Barbatruc
non
pour les calcul panes(1) ne fonctionne que si c'est pas fractionné
il n'y a qu'une pane quand c'est pas fractionné

pour les fractionné +figé y a pas a ce poser de question on ne peut pas voir un même control deux fois a l’écran et ta fonction objectpane fonctionne dans ce cas là car chaque control et sa pane est identifié et identifiable

mais dans une feuille fractionnée non figé là tu est Out
 

patricktoulon

XLDnaute Barbatruc
bon alors c'est quoi l'exercice ? exactement
il me semble justement te l'avoir montré hier
tu m'a dis que ça t'intéressait pas
et c'est ce que je viens de greffer a ton fichier
et ça marche
bon j'ai pas fait avec le visible ou pas visible pas bien compris l'intention avec cet argument
mais ca fonctionne en fractionner, figé et normal voir post #176
 

patricktoulon

XLDnaute Barbatruc
Non, ça ne marche pas si on déplace les volets par du scroll ! Je crois que j'avais essayé ça au début.
C'est pour ça que je suis revenu sur le Pane réeL
ma fonction gère tout ça
je fractionne je fige pas et je scroll a gogo dans tout les sens
demo.gif
 

patricktoulon

XLDnaute Barbatruc
Ton Pixel To Point sans API fonctionne, mais je préfère l'API, 100% précis
la mienne aussi est 100% précise
dans ma version pro
tu peux zoomer ou dezoomer elle est à 1.333333333333333 en DPI normal ou 1.6666666666667 en dpi 120
VB:
'************************************************************************************************************************************
'fonction pointToPixel
Function Ppx()
' collection  Fonctions avec PointsToScrenPixels(X Y) / Activewindow / Activepane / panes(1 to 4) / visiblerange etc...
' détermine le coefficient pointToPixsel
' version 2.0
' date février 2022
' patricktoulon
' Code  simplifié
' renvoie un double
' version invariable meme avec le zoom
  Dim Z#
  With ActiveWindow
        Z = .Zoom / 100
        Ppx = ((.Panes(1).PointsToScreenPixelsY(Cells.Width) - .Panes(1).PointsToScreenPixelsY(0)) / Cells.Width) / Z
    End With
   ' [a1] = Ppx
End Function

je te donne le principe de ma fonction pour l'objectpane à toi de coder cela a ta manière
elle est hyper simple


VB:
'*********************************************************************************************************************************
'determine la pane ou se trouve la shape cliquée
'Function GetpaneObjectClické(obj As Object)
Function ObjectPane(obj As Object, Optional Visible As Boolean = True) As Pane
' collection  Fonctions avec PointsToScrenPixels(X Y) / Activewindow / Activepane / panes(1 to 4) / visiblerange etc...
' récupérer la pane dans la quelle l'object a été cliqué
' version 2.0
' date février 2022
' patricktoulon
' Code  simplifié
' renvoie un object Pane
    Dim I&, Qx#, Qy#, A&, Z#, R As Range
    Dim pos As PointAPI
    'recupe les point Xy du curseur (la souris) dans la variable type pos
    'avec l 'api (GetCursorPos pos)
    With ActiveWindow
        'IF le .panes.count>1 then
        For I = 1 To 2
            'set R= le range visible de  la pane(I) de la boucle
            'Qx= le left de r  par  la pane(i).PointsToScreenPixelsX
            'Qy= le top de r  par  la pane(i).PointsToScreenPixelsy
            'si la position X du curseur > qx then a =a+1
        Next

        'If le .Panes.Count > 2 Then
        'set R = le range visible de la panes(3)
        'Qx= le left de r  par  panes(3).PointsToScreenPixelsX
        'Qy= le top de r  par  panes(3).PointsToScreenPixelsy
        'si la position Y du curseur > qy then a =a+2

    End If
Else
    A = 1
End If
'Set GetpaneObjectClické = .Panes(A)
Set ObjectPane = .Panes(A)
End With
End Function

là mon amis si tu n'y arrive pas je sais pas quoi faire
et là je te garanti a 100% que ca fonctionne figé pas figé fractionné pas fractionné normal
tu parlais de "very fiable" ben quoi de fiable que la position du curseur à l’écran lors du click par l'api conçue a cet effet ;)
 

Dudu2

XLDnaute Barbatruc
la mienne aussi est 100% précise

Non, car il suffit de faire le test, et chez moi:
1666362627348.png
1666362649998.png
1666362697604.png

Alors tu me diras, on passe de 1.68 à 1.65, c'est pas très grave c'est que 3 centièmes.
Mais on n'est aussi que de 70% à 130% en zoom.
Je le sais et je l'ai dit, ce sont des variations dans les décimales.

Mais moi je préfère avoir ça dans TOUS les cas, fut-ce au prix de déclaration d'API.
C'est clair, net et stable.
1666363014059.png
 

Pièces jointes

  • 1666362998682.png
    1666362998682.png
    145.8 KB · Affichages: 18

Dudu2

XLDnaute Barbatruc
je te donne le principe de ma fonction pour l'objectpane à toi de coder cela a ta manière
elle est hyper simple
Ton code pour les Panes est parfait pour ce que tu as à faire. Je n'ai RIEN à y redire, c'est nickel chrome.
Simplement, tu cherches dans leur VisibleRange et par rapport à l'objet cliqué et donc la position du curseur.

Le code dont j'ai besoin doit trouver le Pane d'un objet désigné par son nom, ce n'est pas du tout la même chose et quoique tu en penses, je ne pourrai jamais utiliser ton code pour faire ça. Et donc j'en ai fait un autre. C'est tout.
 

patricktoulon

XLDnaute Barbatruc
si tu a des variation c'est que tu l'a mal utilisé la version pro invariable
VB:
Sub testtruc()
    With ActiveWindow
        .Zoom = 100
        For I = 50 To 300 Step 5
            A = A + 1
           .Zoom = I
           Cells(A, 1) = "Zoom:" & I
            Cells(A, 2) = Ppx
            Application.Goto [A1]
        Application.Wait Now + 0.00001
        Next
        .Zoom = 100
    End With
End Sub

'************************************************************************************************************************************
'fonction pointToPixel
Function Ppx()
' collection  Fonctions avec PointsToScrenPixels(X Y) / Activewindow / Activepane / panes(1 to 4) / visiblerange etc...
' détermine le coefficient pointToPixsel
' version 2.0
' date février 2022
' patricktoulon
' Code  simplifié
' renvoie un double
' version invariable meme avec le zoom
  Dim Z#
  With ActiveWindow
        Z = .Zoom / 100
        Ppx = ((.Panes(1).PointsToScreenPixelsY(Cells.Width) - .Panes(1).PointsToScreenPixelsY(0)) / Cells.Width) / Z
    End With
 End Function




demo.gif
 

Discussions similaires

  • Résolu(e)
Microsoft 365 32 ou 64 bits
Réponses
46
Affichages
2 K

Statistiques des forums

Discussions
314 749
Messages
2 112 461
Membres
111 554
dernier inscrit
NicolasLienard