ça peut venir de quoi ?, tous mais réglages sont en 100%, j'ai 2 écran mais sont réglés pareil, je comprend pas
Version imprimable
ça peut venir de quoi ?, tous mais réglages sont en 100%, j'ai 2 écran mais sont réglés pareil, je comprend pas
re
et oui 1.333333333333333
mon calcul est donc bon c'est ca qui rends fou
ben moi non plus je cherche
mes calculs donnent pareil que les api mais le résultat n'est pas le même
je n'ai pas d'explication
tiens teste celle la comme tel
chez moi c'est ok
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Sub UserFormAlign1() '''''''''''''''OK''''''''''''''''' Dim x As Double, y As Double, w As Double, h As Double 'x = GetDeviceCaps(GetDC(0), 88) / 72 'y = GetDeviceCaps(GetDC(0), 90) / 72 x = (ActiveWindow.ActivePane.PointsToScreenPixelsX(3) - ActiveWindow.PointsToScreenPixelsX(0)) / 3 y = x xplus = UserForm1.Width - UserForm1.InsideWidth yplus = (UserForm1.Height - UserForm1.InsideHeight) / 2 With UserForm1 .StartUpPosition = 0 .Left = (ActiveWindow.ActivePane.PointsToScreenPixelsX(ActiveCell.Left) / x) + xplus .Top = (ActiveWindow.ActivePane.PointsToScreenPixelsY(ActiveCell.Top) / y) + xplus .Show End With End Sub
non désolé
Pièce jointe 279022
juste par curiosité enlève ".activepane" dans tout mon code
et oui je commence a comprendre
il ne faut pas l'enlever partout mille excuse je me suis rompé
c'esr comme ca qui faut tester
si ca marche j'ai compris
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Sub UserFormAlign1() '''''''''''''''OK''''''''''''''''' Dim x As Double, y As Double, w As Double, h As Double 'x = GetDeviceCaps(GetDC(0), 88) / 72 'y = GetDeviceCaps(GetDC(0), 90) / 72 x = (ActiveWindow.ActivePane.PointsToScreenPixelsX(3) - ActiveWindow.ActivePane.PointsToScreenPixelsX(0)) / 3 y = x xplus = UserForm1.Width - UserForm1.InsideWidth yplus = (UserForm1.Height - UserForm1.InsideHeight) / 2 With UserForm1 .StartUpPosition = 0 .Left = (ActiveWindow.PointsToScreenPixelsX(ActiveCell.Left) / x) + xplus .Top = (ActiveWindow.PointsToScreenPixelsY(ActiveCell.Top) / y) + xplus .Show End With End Sub
non ça colle pas non plus et c'est pas proportionné selon la cellule choisi
Pièce jointe 279033Pièce jointe 279037
et si je choisi par exemple 'g6' ça cache caremment
et oui autrement dit ca ne peut plus etre universel
selon les versions d'exel activepane n'est plus rattaché mais mergée avec activewindow
et même avec les api c'est pareil
tampis, mais le sujet est pas mal, désolé de t'avoir pris la tête la dessus, aller bonne nuit
non tu me prends la la tete
tu tourne avec quoi (excel/window)
je m'en doutais
je sais pas encore je n'ai pas tout décortiqué car j'ai proscrit W 8 et 10 je les analyse par curiosité
mais je sais déjà que les shell32 nont pas les meme ossature
donc le rendu des fenêtre sont différents
ensuite les versions ultérieures a 2007 ont subis pas de refonte aussi
parti de la c'est compliqué
le problème c'est que quand on un fichier a faire tourner sur diverses machine (Windows/offices) ce genre de macro est complètement inutile
des vrais salopards chez Microsoft
business is business, mais je vais me contenter de l'api pour notre fameux calendrier, aller bis et bonne nuit, @+
puré nuit courte déjà réveillé
oui ben ca ne fonctionnera pas chez moi par exemple
quand tu aura un moment test juste ca simplement
Code:
1
2
3
4
5
6
7
8
9
10
11 Sub test15() Dim ptpx#, xplus#, yplus# With UserForm1 ptpx = (ActiveWindow.ActivePane.PointsToScreenPixelsX(3) - ActiveWindow.ActivePane.PointsToScreenPixelsX(0)) / 3 xplus = .Height - .InsideHeight yplus = .Width - .InsideWidth .Left = (ActiveWindow.ActivePane.PointsToScreenPixelsX(ActiveSheet.[b3].Left) / ptpx) + yplus .Top = (ActiveWindow.ActivePane.PointsToScreenPixelsY(ActiveSheet.[b3].Top) / ptpx) + yplus .Show End With End Sub
Bonjour Patrick,
Là ça centre l'userform sur la page
Tout ira beaucoup moins mal, patricktoulon, lorsque tu comprendras enfin que tous tes malheurs sont inhérents à des conversions d'unités dont tu peux te passer, puisque tout peut être directement calculé en points (sans conversion, donc) en ce qui concerne la position à l'écran du userform. Elle l'est dans le seul esprit de l'application Excel. Et donc en points également. Aucune conversion névessaire. Je te l'ai dit et répété.
Comment la calculer ? Je te l'ai également dit et répété (et c'est ce que tu t'es amusé à appeler ma "petite fonction" ou "petite formule", hein ... avec une pointe d'ironie qui ne m'a pas échappé ... et te voilà maintenant dans un bain dans lequel je vais donc te laisser mariner quelque temps ;)).
Ce ne sera qu'à l'issue de cette marinade que je reviendrai (à moins que tu ne te mettes à relire enfin tout autrement qu'en diagonale et que, ce faisant, tu y parviennes enfin sur ces bases).
Amuse-toi bien.
nicolas creuse la question je suis persuadé que les versions ulterieur a W7 et excel 2007 ont des paramètres différents
je te dis que tes actuve window.left +........+application usableheight....... dont tout est en point ,ne marche pas meme si je te l'accorde c'est logique
quand tu le comprendra a ton tour hein????? il faut que je te le dise en quoi???
pour te donner un exemple concret
simplement activewindow.left donne le left de l'application chez moi alors que si on suit ta démo en image il est sensé me donner le left du classeur flottant ou pas
parti de la je sais pas comment il faut te l'expliquer
de toute façon résultat faux ou non il est bien évident que selon les versions de excel ou Windows ou les deux chaque expression aura un incidence différente ca on a plus a le prouver
dans le dernier exemple
je ne pet auxine donné numérique en dur
seulement le pointoscreenpixelsX/Y et le résultat est diffèrent sur divers pc
je sais plus comment te le faire comprendre
a c que je sache
y=activewindow.activpane.pointstoscreenpixelsY([B1].left) te donne la B1.left par raport a l' écran en pixel on est bien d'accords je te fait une démo animée si tu veux
si je divise par le coeef je l'ai en point
Tu as réfléchi, avant d'écrire cela (tel qu'écrit) ? Ou tu l'as écrit en te précipitant une fois de plus et sans analyser (ni comprendre, donc) ce que tu écrivais ? :salut:Citation:
Je te dis que tes actuve window.left +........+application usableheight..
Et tu peux "me dire" ce que tu veux... hein ... L'essentiel étant que moi, j'ai mon "affaire" ... et pas toi :lol:
j'ai abrégé l'ecriture je n'avais pas envie d'ouvrir ton exemple que j'avais enregistré
désolé moi je l'ai mon affaire aussi elle fonctionne très bien et pas chez toi
et c'est inversement réciproque pour ta version
conclusion aucun de nous n'a la véritable solution universel
on va pas faire de la démagogie, la preuve et faite des deux cotés
@nicolas
tu veux bien essayer avec
soit actWleft1 et actWtop1 bloqué et mes miens débloqué
et inversement
PS: quand tu debloque et bloque les lignes n'oublie pas de changer dans le with userformCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Sub test16() Dim pppx#, xplus#, yplus# With ActiveWindow pppx = (.ActivePane.PointsToScreenPixelsX(3) - .PointsToScreenPixelsX(0)) / 3 ' manque la largeur de colonne de numero de ligne 'et un defaut de 3 ou 4 milimetre en moins pour le left 0 ActiWleft1 = Application.Left + ActiveWindow.Left 'mode unparia ActiWtop1 = Application.Top + ActiveWindow.Top 'mode unparia 'patrick j'ai la largeur de la colonne des numero de ligne incluse ActiWleft2 = (.PointsToScreenPixelsX(0) / pppx) 'mode patrick ActiWtop2 = (.PointsToScreenPixelsY(0) / pppx) 'mode patrick End With With UserForm1 xplus = .Height - .InsideHeight yplus = .Width - .InsideWidth .Left = ActiWleft2 + yplus '+ [b3].Left .Top = ActiWtop2 + yplus .Show End With End Sub
il me mais erreur de syntaxe, je voit pas
Pièce jointe 279246
essaie sans ".activepane" mais ca n'a plus aucun sens
en bloquant ton code à toi je suis hors feuil (sur autre écran)
et en bloquant les code unparia ci-dessous
Pièce jointe 279247
j'ai bricolé un peu ta fonction et il y a du mieux, si ça peux t'aider
Pièce jointe 279251Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Private Declare Function GetDC Lib "user32.dll" (ByVal hWnd As Long) As Long Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hWnd As Long, ByVal hdc As Long) As Long Private Declare Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As Long, ByVal nIndex As Long) As Long Function PositionForm(Form As Object, rng As Range) Dim pttopx#, ttop#, lleft#, ecc#, Hheight#, Wwidth#, zz# Dim PixelsPerPointsX As Double, PixelsPerPointsY As Double DC = GetDC(0) PixelsPerPointsX = GetDeviceCaps(DC, 88) / 72 PixelsPerPointsY = GetDeviceCaps(DC, 90) / 72 ReleaseDC 0, DC lleft = ActiveWindow.PointsToScreenPixelsX(rng.Left * PixelsPerPointsX) / PixelsPerPointsX ttop = ActiveWindow.PointsToScreenPixelsY(rng.Top * PixelsPerPointsY) / PixelsPerPointsY PositionForm = Array(lleft, ttop) End Function Sub TestUserform() r = PositionForm(UserForm1, [b3]) With UserForm1: .Show 0: .Left = r(0): .Top = r(1): End With End Sub
essaie avec la ligne qui marche chez toi
nu n'a plus qu'a bloquer l'un ou l'autre ne change rien dans le with userform
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Sub test16() Dim pppx#, xplus#, yplus# With ActiveWindow 'pppx = (.ActivePane.PointsToScreenPixelsX(3) - .PointsToScreenPixelsX(0)) / 3 pppx = (.ActivePane.PointsToScreenPixelsX(ActiveSheet.[b1].Width) - .PointsToScreenPixelsX(0)) / ActiveSheet.[b1].Width'celle la fonctionnais chez toi cette nuit ' manque la largeur de colonne de numero de ligne 'et un defaut de 3 ou 4 milimetre en moins pour le left 0 ActiWleft1 = Application.Left + ActiveWindow.Left 'mode unparia ActiWtop1 = Application.Top + ActiveWindow.Top 'mode unparia 'patrick j'ai la largeur de la colonne des numero de ligne incluse ActiWleft1 = (.PointsToScreenPixelsX(0) / pppx) 'mode patrick ActiWtop1 = (.PointsToScreenPixelsY(0) / pppx) 'mode patrick End With With UserForm1 xplus = .Height - .InsideHeight yplus = .Width - .InsideWidth .Left = ActiWleft1 + yplus '+ [b3].Left .Top = ActiWtop1 + yplus .Show End With End Sub
c'est pareil mais là c'est plus sur aucun des deux écran et à la même pour l'autre
t 'est sur d'avoir bien fait ce que je dis ?? parce que c'est illogique
réessaies avec Excel fenêtré au milieu de ton écran
ben oui je pense, j'ai voulu faire une petite video comme tu fait mais ça ne marche pas, je sais pas de quel logiciel te sert tu ?
A Patricktoulon :
Quelle "preuve" ? --->>Citation:
j'ai abrégé l'ecriture je n'avais pas envie d'ouvrir ton exemple que j'avais enregistré
désolé moi je l'ai mon affaire aussi elle fonctionne très bien et pas chez toi
et c'est inversement réciproque pour ta version
conclusion aucun de nous n'a la véritable solution universel
on va pas faire de la démagogie, la preuve et faite des deux cotés
1) Je n'ai jusqu'à présent montré ici aucun code entier de placement de cet userform sans fonction de l'API ni conversions d'unités.
2) je n'ai donné qu'une indication sur un calcul précis d'une partie précise.
3) si ton essai d'utilisation de cette indication n'aboutit pas, ma foi ... C'est ton code d'essai qui n'est pas bon. Et non la preuve à laquelle tu fais allusion :coucou:
Ce n'est pas bien, de dénoncer comme n'aboutissant pas ce que tu ne sais pas utiliser !
Allez !
Je vais te faire un autre dessin, dès que j'en aurais le temps.
Et je vais te donner ensuite une autre INDICATION (plus simple que la première encore). On va voir ce que tu sauras en faire.
Mais si tu n'y arrives pas non plus, garde-toi de dire que c'est de la faute de cet autre calcul et mets en cause ce que TU EN FAIS.
Pas trouvé encore le temps pour le dessin (enfants + petits enfants présents)
Mais regarde ce qu'est ce quesako --->>
C'est quoi, qu'il te retourne en points fenêtres flottantes ou non ? (sauf si appli en plein écran -->> cas particulier et autre calcul)Citation:
hbarre = Userform1.Height - Userform1.InsideHeight
quesako = Application.Height - Application.UsableHeight - (hbarre - 6)
Cherche (facile à trouver) ce que c'est.
Cette valeur est le point de départ de calculs purement arithmétiques..
re
commence par corriger l'erreur que tu a faite sur le premier concernant l'activewindow en couleur cyanCitation:
Je vais te faire un autre dessin, dès que j'en aurais le temps.
chez moi quand je flotte le classeur le activewindow.left ou top change ;il est donc très clair que la partie en couleur cyan dans ton dessin n'est pas l'activewindow
a titre indicatif la fentre de l'application contient 7 fentres(7handle) dont 2 en mode UI
j'attendrais ton dessin
pour ma part
celle ci fonctionne au milimetre prêt chez moi
edit:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Sub TestUserformtopleftcell2() r = RectanGleRangeII(UserForm1, [B3:F8]) With UserForm1 .Show 0 .Left = r(0) .Top = r(1) .Width = r(2) .Height = r(3) End With End Sub Function RectanGleRangeII(usf, rng) Dim pppx#, plus#, z#, rect With ActiveWindow.ActivePane pppx = (.PointsToScreenPixelsX(ActiveSheet.[A1].Width) - .PointsToScreenPixelsX(0)) / ActiveSheet.[A1].Width L1 = (.PointsToScreenPixelsX([A1].Left) / pppx) R1 = (.PointsToScreenPixelsY([A1].Top) / pppx) End With z = (ActiveWindow.Zoom / 100) With usf: plus = .Width - .InsideWidth: End With RectanGleRangeII = Array((L1 + [rng].Left + (plus / z)) * z, (R1 + [B3].Top + ((plus / 2) / z)) * z, rng.Width - plus * 2, rng.Height - plus * 2) End Function
voici la liste des classe des fentres contenue dans l'application excel 2007
Citation:
EXCEL2
EXCELJ
EXCELI
EXCEL;
EXCEL<
EXCELH
XLDESK
Bien évidemment, qu'il change !Citation:
chez moi quand je flotte le classeur le activewindow.left ou top change
Le "classeur", dis-tu ? ... tiens .... ! :koi:
C'est une plaisanterie, ou quoi, cette remarque ????
Une paille !!!! Ca fait combien de pixels, un millimètre ? :DCitation:
celle ci fonctionne au milimetre prêt chez moi
Bon : as-tu au moins déterminé quelle valeur en points était celle de Quesako ?
Pour ton information - et tu le verras in fine (dans quelques mois au train où tu vas) : je ne compte pas en millimètres, mais en beaucoup moins, hein ...:whistle:
Le voilà, ton dessin (avec "paroles", en plus).
Tout y est dit à qui sait l'entendre et je n'ai pas la moindre intention d'y ajouter une seule explication supplémentaire.
Tout ce qui devait être dit quant au calcul de A, B, etc ... Ben --->> je l'ai déjà dit et ne vais donc pas le répéter.
Aucune conversion en unités logiques d'une autre échelle n'intervient dans cette "affaire". Tout est calculé en points.
EDIT : bon ... passe pas (mage trop gourmande ?) . J'en refais une autre demain
c'était une expression "au millimètre prêt"
bref chez moi c'est nickel
tu tourne tout ce que je dis dans un sens qui n'est pas celui de départ d'autant plus que ce que j'ai dis rends les explications de ton dessin fausse et apres tu me dit "mais bien sur" :ptdr:
combien de fois crois je te l 'avoir dit que: faire de la démagogie n'est pas nécessaire ici
les faits, actes,et écrits seuls sont valables pour moi
bref ca n'a plus aucun sens que tu me réponde
je vais attendre ton dessin si tant est que tu en ai encre envie
Où ai-je parlé de "classeur", patricktoulon ? où ?
Le plus fort, c'est que je crois deviner que ton incompréhension résulte du fait que tu t'obstines à sortir des coordonnées (en VBA) de l'application pour te référer à celles de Windows (par rapport à l'écran et, elles, en pixels)
Désolé pour toi, mais pour VBA, les coordonnées de l'activeWindow sont établies, elles, en POINTS et par rapport non à l'angle supérieur gauche de l'écran, mais à celui de la fenêtre application.
Exactement comme sont établies, par exemple, les coordonnées d'un contrôle d'un userform.
Comme d'ailleurs sont établies les coordonnées de tout point présent dans toute fenêtre parente Windows. Par rapport à l'angle supérieur gauche de la fenêtre conteneur et non par rapport à l'angle supérieur gauche de l'écran !
Quand vas-tu enfin comprendre cela ?
Ce n'est qu'à la fin, une fois seulement établies ces coordonnées, que l'on ajoute celles du top de la fenêtre application. Non pour corriger les coordonnées de l'activewindow, mais tout( simplement pour placer le userform. Et (que c'est amusant), pour VBA, mêmes ces coordonnées-là sont calculées ... en Points également.
Dur dur, tout cela ? Vraiment ?
Il me faut recommencer mon dessin ... Trop gros, il n'est pas passé...
c'est bon j'ai eu confirmation de ce que je pensait sur un autre forum
ma méthode est bonne sauf W10 avec 2007 il faut juste ajouter un petit quelque chose de rien du tout
en même temps en voyant toutes les captures (celle de Nicolas/les miennes )ca au du sauter au yeux de tout le monde
j'attends des retours avec W10 ou 8 et 2013,2016 quand je les aurai je donnerais la solution que j'ai adopté
et oui!!!!! pixel to point n'en déplaise a d'autre