Autres [Résolu]Affichage userform sur cellule ou activX version simplifiée a tester

patricktoulon

XLDnaute Barbatruc
bonjour suite a deux discussions ressentes j'ai repris ma méthode et je l'ai simplifiée
normalement avec cette méthode on est dédouané du calcul et prise en charge du freezepane et des scrollbars H et V

aucune Api window ou gdi !!
aucun chiffre en dur dans le code !!!
aucun calcul des scroll ou du freezepane
et l'userform est contraint dans le périmètre de la fenêtre application si il le dépasse
vous voulez bien tester
cellule a jumeler
demo2.gif


activx a jumeler

demo3.gif
 

Pièces jointes

  • placement usf.xlsm
    29.4 KB · Affichages: 27
Dernière édition:

Dranreb

XLDnaute Barbatruc
Information.
En cas de fractionnement de la fenêtre, et non plus seulement de volets figés, ma dernière procédure dans l'UFmCalend du poste #153 se comporte bien aussi. Bien sûr, l'UserForm s'affiche dans le premier fractionnement trouvé où une partie de la plage est visible et non dans d'autres où elle peut être visible également.
 

patricktoulon

XLDnaute Barbatruc
re
bonjour danreb
c'est vrai il faudrait alors remplacer activepane par .panes.(x) en l’occurrence ici pour revenir a droite en bas ,l'activepane ce serait .panes(.panes.count)

quand a la cellule qui ne serrait pas désigné par une sélection ben .. ce qu'il y a dans l’événement du sheets tu le met dans une sub et tu remplace target par la cellule que tu veux
mais bon la on est dans une fraction et je vois pas trop l’intérêt de vouloir placer un userform dans une cellule désignée qui pourrait être présente dans plusieurs panes
je suis curieux de savoir quel est l'activepane sans sélection ???

EDIT je viens de tester c'est la 1
 

Dranreb

XLDnaute Barbatruc
Je suis curieux de savoir quel est l'activepane sans sélection ???
Ben justement c'était bien là le problème: il est complètemernt imprévisible !
M'en foutais moi de l'ActivePane, j'avais un bouton ActiveX pour afficher un calendrier dans une plage prévue à cet effet, point barre.
J'étais à 100 lieues de me douter au début de ma recherche sur ce sujet que lorsque les volets étaient figés le positionnement avec ActivePane dépendait de la dernière action faite n'ayant rien à voir avec ça. Je n'avait pas clairement idée de ce que ça voulait dire ActivePane en fait. Maintenant j'ai compris. Mais j'en tiens compte dorénavant au cas où ça dépendrait d'une sélection :
VB:
      Set Wnw = ActiveWindow: Set Pan = Wnw.ActivePane
      If Intersect(Pan.VisibleRange, Obj) Is Nothing Then
         For P = 1 To Wnw.Panes.Count: Set Pan = Wnw.Panes(P)
            If Not Intersect(Pan.VisibleRange, Obj) Is Nothing Then Exit For
            Next P
         If P > Wnw.Panes.Count Then Exit Sub ' Abandon si la plage n'est visible nulle part.
         End If
      Px72 = GetDeviceCaps(GetDC(0), 88) ' Nombre de pixels pour 72 points.
      Lft = Obj.Left: Trnq = Int(Lft / 3) * 3
      Lft = Pan.PointsToScreenPixelsX(Trnq) * 72 / Px72 + (Lft - Trnq)
      Px72 = GetDeviceCaps(GetDC(0), 90) ' Nombre de pixels pour 72 points.
      Top = Obj.Top: Trnq = Int(Top / 3) * 3
      Top = Pan.PointsToScreenPixelsY(Trnq) * 72 / Px72 + (Top - Trnq)
      K = Wnw.Zoom / 100: Rgt = Lft + Obj.Width * K: Bot = Top + Obj.Height * K
Remarque :
Px72 = GetDeviceCaps(GetDC(0), 88) ' Nombre de pixels pour 72 points. Pourrait aussi se calculer par :
Px72 = Int(100 * (Pan.PointsToScreenPixelsX(72) - Pan.PointsToScreenPixelsX(0)) / Wnw.Zoom + 0.5)
Mais je ne vois pas l'intérêt de faire comme ça, à moins qu'ainsi ça marche aussi sur MAC, ce dont je doute de toute façon.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
en fait activepane c'est soit la panes de la dernière cellule cliqué soit la 1

et une fois qu'une cellule a été cliqué a moins de fermer sans sauver ca reste celle ci
et tu a raison si obj n'est pas une sélection mais une cellule injectée par code vaut mieux mettre le test out off range je te l'accorde

pour ta formule dpi rien foutre du zoom et du 0.5
debloque le "/72" et tu a le coeff point to pixel off actual screen
Sub sss()
Set pan = ActiveWindow.ActivePane
Px72 = (pan.PointsToScreenPixelsX(72) - pan.PointsToScreenPixelsX(0)) ' / 72
MsgBox Px72
End Sub
VB:
Sub sss()
Set pan = ActiveWindow.ActivePane
Px72 = (pan.PointsToScreenPixelsX(72) - pan.PointsToScreenPixelsX(0)) ' / 72
MsgBox Px72
End Su
 

Statistiques des forums

Discussions
311 720
Messages
2 081 902
Membres
101 834
dernier inscrit
Jeremy06510