et 2010 c'est 14
edit: sure à 100%, pour une fois que je connais un truc
Version imprimable
et 2010 c'est 14
edit: sure à 100%, pour une fois que je connais un truc
bon ben cela doit etre correct alors
j'utilise un switch
XP office2007=17'averifierCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Function PositionForm2(usf, rng) Dim Zooom#, PtToPx#, cadre#, system#, vers#, config# 'system = Round(Val(Split(Application.OperatingSystem, " ")(3))) 'vers = Val(Application.Version) config = Round(Val(Split(Application.OperatingSystem, " ")(3))) + Val(Application.Version) ' system + vers cadre = Switch(config = 17, 2, config = 18, 2, config = 22, 2, config = 24, 0, config = 25, -5, config = 26, -5) With ActiveWindow Zooom = .Zoom / 100 PtToPx = ((.ActivePane.PointsToScreenPixelsX(ActiveSheet.[A1].Width) - .ActivePane.PointsToScreenPixelsX(0)) / ActiveSheet.[A1].Width) / Zooom lleft = (.PointsToScreenPixelsX(rng.Left * PtToPx * Zooom) / PtToPx) + cadre ttop = .PointsToScreenPixelsY(rng.Top * PtToPx * Zooom) / PtToPx + cadre Wwidth = IIf(rng.Columns.Count > 1, rng.Width * (Zooom) - cadre * 4, usf.Width) Hheight = IIf(rng.Rows.Count > 1, rng.Height * Zooom - cadre * 4, usf.Height) End With PositionForm2 = Array(lleft, ttop, Wwidth, Hheight) End Function Sub TestUserformtopleftcell2() r = PositionForm2(UserForm1, [b3]) With UserForm1: .Show 0: .Left = r(0): .Top = r(1): End With End Sub
xp office 2010 =19 ' a verifier
w7 office 2010 =20
w7 office 2007=18
w10 office 2007=22
w10 office 2010=24
w10 office 2013=25
w10 office 2016=26
il ne reste plus qu'a mettre en ordre dans le switch tel que je l'ai commencé
si unparia passe par la si il peut nous donner la version obtenu de xp par application.operatingsystem ca serait sympa
je peut pas allumer mon vieux portable je trouve plus le chargeur
Sur mon pc: pleine écran ou fenetre
Pièce jointe 281203
Sur le portable: Erreur 94 Utilisation incorrecte de Null
sur ligne cadre
re
en attendant que je conçoive un double swicth
tiens ca marchera pour tes deux pcs
Code:cadre = Switch(config = 15, -5, config = 17, 2, config = 18, 2, config = 22, 2, config = 24, 0, config = 25, -5, config = 26, -5)
sur le mien c'est pareil
sur le portable trop haut et trop à gauche équivalent à la capture dessus
c'est un truc de fou cette histoire
sur le PC où il y a le décalage vers la droite ? --->>Citation:
si unparia passe par la si il peut nous donner la version obtenu de xp par application.operatingsystem ca serait sympa
et version Office :Citation:
Windows (32-bit) NT 5.01
Citation:
12.0
sur le mien il faudrait dans le cadre 26,0 pour le top
et 26,-5 pour le left
Sur le portable 15,-2 pour le top et 15, 0 pour le left
Plus je réfléchis et plus je me dis personnellement que les différences entre une machine et l'autre sont plutôt à chercher dans la manière dont PointsToScreenPixelsX est calculé sur la machine. C'est lui, que je vois comme responsable réel.
J'aimerais bien que Nicolas fasse l'expérience suivante, qui reprend un excellent code de zenpbb qui, sur ma machine, positionne parfaitement le curseur dans l'angle supérieur gauche de la cible et ce, quelle que soit le mode d'affichage ou le zoom
J'ai ajouté de quoi voir autre chose ...
Peux-tu, Nicolas JACQUIN, ajouter n'importe où sur une feuille :
- un label Label1 et une textbox Textbox1
- ce code :
Puis lancer et me dire (avec des facteurs de zoom différents et des modes d'affichage différents) :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Set cible = Range("B4") With Label1 .Caption = "" .Top = cible.Top .Left = cible.Left .BackColor = RGB(255, 200, 200) End With With TextBox1 .Top = cible.Offset(1, 0).Top .Left = cible.Left .BackColor = RGB(255, 255, 255) .Text = ActiveWindow.Zoom & " " & (ActiveWindow.ActivePane.PointsToScreenPixelsX(cible.Offset(0, 1).Left) - ActiveWindow.ActivePane.PointsToScreenPixelsX(cible.Left)) / cible.Width End With With ActiveWindow.ActivePane SetCursorPos .PointsToScreenPixelsX(cible.Left), .PointsToScreenPixelsY(cible.Top) End With
- si la pointe du curseur est bien toujours là où il le faut. J'ai fait ce qu'il fallait pour avoir un curseur dont on voit la pointe, plutôt qu'un curseur "croix"
- ce que contient Textbox1
Bonjour Unparia, oui je vais faire ton test,
je voulais juste mettre ça avant pour dire à Patrick que le code suivant fonctionne sur mais 2 pc tel quel
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 Function PositionForm3(usf, rng) Dim Zooom#, PtToPx#, cadre#, clleft#, cttop#, system#, vers#, config# config = Round(Val(Split(Application.OperatingSystem, " ")(3))) + Val(Application.Version) ' system + vers cadre = Switch(config = 15, 0, config = 17, 2, config = 18, 2, config = 22, 2, config = 24, 0, config = 25, -5, config = 26, -5) clleft = Switch(config = 15, 0, config = 17, 2, config = 18, 2, config = 22, 2, config = 24, 0, config = 25, -5, config = 26, -5) cttop = Switch(config = 15, 0, config = 17, 2, config = 18, 2, config = 22, 2, config = 24, 0, config = 25, -5, config = 26, 0) With ActiveWindow Zooom = .Zoom / 100 PtToPx = ((.ActivePane.PointsToScreenPixelsX(ActiveSheet.[A1].Width) - .ActivePane.PointsToScreenPixelsX(0)) / ActiveSheet.[A1].Width) / Zooom lleft = (.PointsToScreenPixelsX(rng.Left * PtToPx * Zooom) / PtToPx) + clleft ttop = .PointsToScreenPixelsY(rng.Top * PtToPx * Zooom) / PtToPx + cttop Wwidth = IIf(rng.Columns.Count > 1, rng.Width * (Zooom) - cadre * 2, usf.Width) Hheight = IIf(rng.Rows.Count > 1, rng.Height * Zooom - cadre, usf.Height) End With PositionForm3 = Array(lleft, ttop, Wwidth, Hheight) End Function Sub TestUserformtopleftcell3() r = PositionForm3(UserForm1, [b3]) With UserForm1: .Show 0: .Left = r(0): .Top = r(1): End With End Sub Sub TestUserformDansPlage3() r = PositionForm3(UserForm1, [B3:F12]) With UserForm1: .Show 0: .Left = r(0): .Top = r(1): .Width = r(2): .Height = r(3): End With End Sub
re
c'est presque vraiCitation:
machine. C'est lui, que je vois comme responsable réel.
cette fonction calcule la dimensions du point 0 de l'écran pour x ou y sauf que selon la config le shell de Windows ne prend pas tout en charge au niveau des fenêtres en ce qui concerne office
en effet un exemple concret
w7 ou w10 avec 2007 les userforms ont un cadres même si dans w10 on le voit pas
un autre exemple avec 2016 w10 chez nicolas le fait de maximiser ou mettre en mode fenêtre l'application ,et bien en mode maximiser l'application perds le cadre au sens propre du terme
avec w7 en mode maximser on le voit pas mais il est toujours
la particularité est la
nicolas
plutôt que faire 3 switch
je n'en ferait qu'un
par exemple pour toi
cadre=switch(.....................config=26,array(0,-5,x,x)
et a la place des "+cadre" je mettrais +cadre(0)'pour le top
+cadre(1) pour le left
etc........
mais surtout pour l'universalité mettre les négatif dans l'array comme ca se serait toujours "+cadre(x) " pour tout le monde
oui ok, mais moi pas assez doué pour ça :mrgreen:
bon je viens de rentrer
t'es pas assez fort c'est une blague c'est une broutille regarde j'ai même éclaté la ligne switch et la variable cadre est maintenant un array(tableau)
@unparia toi c'est la config 17 pour xp avec 2007 ou 19 pour xp avec 2010
Nicolas toi c'est la 15 et 26
les éléments de l'array comme pour moi le (18) sont(+/-)pour le left , (+/-) pour le top , (+/-)pour le width , (+/-)pour le height
voila si vous voulez bien remplir vos arrays
après on réalignera la ligne switch sans tirets
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 [ Function PositionForm2(usf, rng) Dim Zooom#, PtToPx#, cadre, system#, vers#, config# system = Round(Val(Split(Application.OperatingSystem, " ")(3))) vers = Val(Application.Version) config = Round(Val(Split(Application.OperatingSystem, " ")(3))) + Val(Application.Version) ' system + vers cadre = Switch(config = 15, Array(x, x, x, x), _ config = 17, Array(x, x, x, x), _ config = 19, Array(x, x, x, x), _ config = 18, Array(2, 2, -6, -8), _ config = 22, Array(x, x, x, x), _ config = 24, Array(x, x, x, x), _ config = 25, Array(x, x, x, x), _ config = 26, Array(-5, 0, x, x)) With ActiveWindow Zooom = .Zoom / 100 PtToPx = ((.ActivePane.PointsToScreenPixelsX(ActiveSheet.[A1].Width) - .ActivePane.PointsToScreenPixelsX(0)) / ActiveSheet.[A1].Width) / Zooom lleft = (.PointsToScreenPixelsX(rng.Left * PtToPx * Zooom) / PtToPx) + cadre(0) ttop = .PointsToScreenPixelsY(rng.Top * PtToPx * Zooom) / PtToPx + cadre(1) Wwidth = IIf(rng.Columns.Count > 1, rng.Width * (Zooom) + cadre(2), usf.Width) Hheight = IIf(rng.Rows.Count > 1, rng.Height * Zooom + cadre(3), usf.Height) End With PositionForm2 = Array(lleft, ttop, Wwidth, Hheight) End Function Sub TestUserformtopleftcell2() r = PositionForm2(UserForm1, [b3]) With UserForm1: .Show 0: .Left = r(0): .Top = r(1): End With End Sub
au poil
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Function PositionForm5(usf, rng) Dim Zooom#, PtToPx#, cadre, system#, vers#, config# system = Round(Val(Split(Application.OperatingSystem, " ")(3))) vers = Val(Application.Version) config = Round(Val(Split(Application.OperatingSystem, " ")(3))) + Val(Application.Version) ' system + vers cadre = Switch(config = 15, Array(0, 0, 0, 0), _ config = 17, Array(x, x, x, x), _ config = 19, Array(x, x, x, x), _ config = 18, Array(2, 2, -6, -8), _ config = 22, Array(x, x, x, x), _ config = 24, Array(x, x, x, x), _ config = 25, Array(x, x, x, x), _ config = 26, Array(-5, 0, 10, 5)) With ActiveWindow Zooom = .Zoom / 100 PtToPx = ((.ActivePane.PointsToScreenPixelsX(ActiveSheet.[A1].Width) - .ActivePane.PointsToScreenPixelsX(0)) / ActiveSheet.[A1].Width) / Zooom lleft = (.PointsToScreenPixelsX(rng.Left * PtToPx * Zooom) / PtToPx) + cadre(0) ttop = .PointsToScreenPixelsY(rng.Top * PtToPx * Zooom) / PtToPx + cadre(1) Wwidth = IIf(rng.Columns.Count > 1, rng.Width * (Zooom) + cadre(2), usf.Width) Hheight = IIf(rng.Rows.Count > 1, rng.Height * Zooom + cadre(3), usf.Height) End With PositionForm5 = Array(lleft, ttop, Wwidth, Hheight) End Function
et la 15 pour ton portable?????
A Nicolas JACQUIN
As-tu bien mis la déclaration de la fonction dans la partie déclarative du module de code :Citation:
erreur 49 Convention d'appel de dll incorecte sur setcursorpos
Citation:
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
@unparia
résultat de ta petite expérience
j'ai été obligé de préciser le parent devant les controls
le curseur est bien en b4 top et left a zoom 100
mais 2 ou 3 point plus bas a zoom 180
Pièce jointe 281296Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long Sub test() Set cible = ActiveSheet.Range("B4") With ActiveSheet.Label1 .Caption = "" .Top = cible.Top .Left = cible.Left .BackColor = RGB(255, 200, 200) End With With ActiveSheet.TextBox1 .Top = ActiveSheet.Range("B4").Offset(1, 0).Top .Left = cible.Left .BackColor = RGB(255, 255, 255) .Text = ActiveWindow.Zoom & " " & (ActiveWindow.ActivePane.PointsToScreenPixelsX(cible.Offset(0, 1).Left) - ActiveWindow.ActivePane.PointsToScreenPixelsX(cible.Left)) / cible.Width End With With ActiveWindow.ActivePane SetCursorPos .PointsToScreenPixelsX(cible.Left), .PointsToScreenPixelsY(cible.Top) End With End Sub
@unparia
je pense avoir compris ce que tu cherche avec
mais en fait le calcul est faux tout du moins tu divise par la cible.width non seulement le width en pixel mais tout le reste jusqu'au point 0 de l'ecranCode:.Text = ActiveWindow.Zoom & " " & (ActiveWindow.ActivePane.PointsToScreenPixelsX(cible.Offset(0, 1).Left) - ActiveWindow.ActivePane.PointsToScreenPixelsX(cible.Left)) / cible.Width
c'est a dire que tu englobe le app.left, le activew...left,le cadre,la colonne des numéros de ligne même si ton calcul est logique mais la fonction ne calcule pas comme ca
d'ailleurs pour t'en rendre compte
il te suffit de faire
pour te rendre compte que le résultat est fauxCode:x=ActiveWindow.ActivePane.PointsToScreenPixelsX([b1].width)
par contre si tu fait
le résultat est bonCode:x=ActiveWindow.ActivePane.PointsToScreenPixelsX([b1].width)-ActiveWindow.ActivePane.PointsToScreenPixelsX(0)
que tu prenne le lef ou le width de la cellule ca te donnera toujours
le point 0 de l'ecran au point 0 de la grille + le width ou le left de la cellule
il nous reste plus q'a attendre les arrays de unparia pour XP
pour 2010 c'est bon je sais que c'est 0 partout
il nous restera 2013 32 bit avec w10 64
ET 2010 AVEC W7
je te donne la réponse un peu plus tard
et même soyons fous prenons en charge aussi office 64 bits puisque application.operatingsystem ne ramène rien alors c'est facile
de 12 a 16 office64 bits et W10 64 :le numéros correspond a la version d'officeCode:
1
2
3
4
5
6
7
8
9
10
11
12 cadre = Switch( _ config = 12, Array(x, x, x, x), _ config = 14, Array(x, x, x, x), _ config = 15, Array(x, x, x, x), _ config = 16, Array(x, x, x, x), _ config = 17, Array(x, x, x, x), _ config = 19, Array(x, x, x, x), _ config = 18, Array(3, 2, -6, -8), _ config = 20, Array(x, x, x, x), _ config = 24, Array(x, x, x, x), _ config = 25, Array(x, x, x, x), _ config = 26, Array(-5, 0, 10, x))
pour les versions office 32 bits
17 =xp office 2007
19= xp office 2010
18= w7 office 2007
20 =w7 office 2010
24= w10 office o 2010
25 =w10 office 2013
26 =w10 office 2016
pourquoi il me met erreur de compilation tableau attendu et il pointe cadre du left ??
system + vers = 0
sorry
system + vers = 21 re sorry
c'est bon j'essai
la ligne system et vers il faut les virer tout est dans la ligne config
j'aurais pu les mettre en commentaire c'est vrai
oulah arrête toi 5 minutes
tes config c'est quoi???? pour de bon
c'est bon j'ai compris, j'ai rajouté
zennnnnn, et je t'envoie les résultatsCode:config = 21, Array(X, X, X, X), _
config = 21 windows10 64 bits et excel 2013 32bits
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 Function PositionForm5(usf, rng) Dim Zooom#, PtToPx#, cadre, system#, vers#, config# Dim lleft#, ttop#, Wwidth#, Hheight# system = Round(Val(Split(Application.OperatingSystem, " ")(3))) vers = Val(Application.Version) config = Round(Val(Split(Application.OperatingSystem, " ")(3))) + Val(Application.Version) ' system + vers cadre = Switch(config = 15, Array(0, 0, 0, 0), _ config = 17, Array(X, X, X, X), _ config = 19, Array(X, X, X, X), _ config = 18, Array(2, 2, -6, -8), _ config = 21, Array(-2, 0, 3, 1), _ config = 22, Array(X, X, X, X), _ config = 24, Array(X, X, X, X), _ config = 25, Array(X, X, X, X), _ config = 26, Array(-5, 0, 10, 5)) With ActiveWindow Zooom = .Zoom / 100 PtToPx = ((.ActivePane.PointsToScreenPixelsX(ActiveSheet.[A1].Width) - .ActivePane.PointsToScreenPixelsX(0)) / ActiveSheet.[A1].Width) / Zooom lleft = (.PointsToScreenPixelsX(rng.Left * PtToPx * Zooom) / PtToPx) + cadre(0) ttop = .PointsToScreenPixelsY(rng.Top * PtToPx * Zooom) / PtToPx + cadre(1) Wwidth = IIf(rng.Columns.Count > 1, rng.Width * (Zooom) + cadre(2), usf.Width) Hheight = IIf(rng.Rows.Count > 1, rng.Height * Zooom + cadre(3), usf.Height) End With PositionForm5 = Array(lleft, ttop, Wwidth, Hheight) End Function
c'est quoi 21 !!!! Windows quoi ,office quoi
oulah!!! tu fausse le raisonnement alors depuis tout a l'heure
que retourne vraiment operatingsystem????????????Citation:
config = 21 windows10 64 bits et excel 2013 32bits
parce que tu disais que Windows 10 ramenait 10 donc 10 plus la version excel2013(15) ca fait 25 chez moi hein !!!!!
pareil version 64 bit qui affiche 32
Pièce jointe 281308
Pièce jointe 281312
re
desolé mon grand mais la version 6.2 c'est W 8