Bonjours tout le monde,
Je me permets de ressortir un sujet qui revient assez souvent mais sans vraiment coller pour chacun.
Le placement d'un userform dans le coin supérieur gauche d'une cellule sélectée.
Depuis 2017, avec Patrick on a travaillé sur le sujet un bon moment sans réel succès selon les configurations,
avec souvent une erreur de -5 au left en rapport avec le cadre de l'userform.
Pour ma part, fonctionne sur:
- Excel 2016, 2019, 2021 32 bits sous W10 64bits
- Mode fenêtre ou pleine écran
- Avec ou sans Zoom
- Colonne + ou - réduite
Je vous laisse donc juger.
Voici déjà une fonction,
Et une Sub,
Donc si ça fonctionne chez vous, n'hésitez pas à laisser votre configuration, ça permettra de voir.
Merci à tous.
Nicolas
Je me permets de ressortir un sujet qui revient assez souvent mais sans vraiment coller pour chacun.
Le placement d'un userform dans le coin supérieur gauche d'une cellule sélectée.
Depuis 2017, avec Patrick on a travaillé sur le sujet un bon moment sans réel succès selon les configurations,
avec souvent une erreur de -5 au left en rapport avec le cadre de l'userform.
Pour ma part, fonctionne sur:
- Excel 2016, 2019, 2021 32 bits sous W10 64bits
- Mode fenêtre ou pleine écran
- Avec ou sans Zoom
- Colonne + ou - réduite
Je vous laisse donc juger.
Voici déjà une fonction,
VB:
Function PositionForm(FORM As Object, rng As Range)
With CreateObject("WScript.Shell"): Ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With
With FORM: bord = ((.InsideWidth - .Width) / 2) + 1: End With
With ActiveWindow
Zom = .Zoom / 100
lleft = .PointsToScreenPixelsX(rng.Left * Ppx * Zom) / Ppx + bord
ttop = .PointsToScreenPixelsY(rng.Top * Ppx * Zom) / Ppx
Hheight = (rng.Height * Ppx) / Ppx * Zom - bord
Wwidth = (rng.Width * Ppx) / Ppx * Zom - bord * 2
End With
PositionForm = Array(lleft, ttop, Hheight, Wwidth)
End Function
Sub placement_form1()
R = PositionForm(UserForm1, ActiveCell)
With UserForm1: .Show 0: .Left = R(0): .Top = R(1): End With
End Sub
Sub placement_form2()
R = PositionForm(UserForm1, Range("F17"))
With UserForm1: .Show 0: .Left = R(0): .Top = R(1): End With
End Sub
Sub placement_form3()
R = PositionForm(UserForm1, Range("I9:N25"))
With UserForm1: .Show 0: .Left = R(0): .Top = R(1): .Height = R(2): .Width = R(3): End With
End Sub
Sub placement_form4()
R = PositionForm(UserForm1, Range("C4:I20"))
With UserForm1: .Show 0: .Left = R(0): .Top = R(1): .Height = R(2): .Width = R(3): End With
End Sub
Sub placement_form5()
R = PositionForm(UserForm1, Range("N4:P31"))
With UserForm1: .Show 0: .Left = R(0): .Top = R(1): .Height = R(2): .Width = R(3): End With
End Sub
Et une Sub,
Code:
Sub Placement_form6()
With CreateObject("WScript.Shell"): Ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With
With UserForm1
bord = ((.InsideWidth - .Width) / 2) + 1
With ActiveWindow
Zom = .Zoom / 100
lleft = .PointsToScreenPixelsX(ActiveCell.Left * Ppx * Zom) / Ppx + bord
ttop = .PointsToScreenPixelsY(ActiveCell.Top * Ppx * Zom) / Ppx
End With
.Show 0
.Left = lleft
.Top = ttop
End With
End Sub
Donc si ça fonctionne chez vous, n'hésitez pas à laisser votre configuration, ça permettra de voir.
Merci à tous.
Nicolas