Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
 

Dudu2

XLDnaute Barbatruc
calculs que tu dis "foireux"
J'ai un peu exagéré parce que j'étais énervé. D'ailleurs j'ai corrigé pour les qualifier de "Zoomesques"
Ton Pixel To Point sans API fonctionne, mais je préfère l'API, 100% précis, même s'il faut déclarer des trucs qu'on peut mettre le cas échéant dans un module dédié.
 

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:

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.
 

Pièces jointes

  • 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




 

Discussions similaires

  • Résolu(e)
Microsoft 365 32 ou 64 bits
Réponses
46
Affichages
2 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…