IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Position de formulaire


Sujet :

Macros et VBA Excel

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 301
    Points : 1 900
    Points
    1 900
    Par défaut Position de formulaire
    Bonjour,

    Dans un environnement multi-écran, j'experimente des difficultés à positionner un formulaire dans le coin haut/gauche de la feuille active.
    Après recherche, il s'avère que c'est lié au facteur d'échelle de windows.

    Comment contourner ce problème ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 637
    Points : 34 342
    Points
    34 342
    Par défaut
    Salut,

    quel est ton code actuel ?

    Est-ce que tes Application.Top ou .Left ne suffisent pas à arriver à tes fins ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 301
    Points : 1 900
    Points
    1 900
    Par défaut
    Ben non,

    Application.Top et Application.Left correspondent au coin supérieur gauche de la fenêtre Excel, le formulaire s'affiche sur le ruban (et j'utilise ce dernier).
    C'est la première cellule visible qui m'intéresse.

    Je poste un extrait de code dès que possible.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 301
    Points : 1 900
    Points
    1 900
    Par défaut
    J'ai le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Sub Test()
        Dim Rect As Rect
         Rect = GetCellRect(ActiveWindow.ActivePane.VisibleRange.Cells(1))
     
        Dim Frm as Form1
        Set Frm = New Form1
        Frm.Top = Rect.Top
        Frm.Left = Rect.Left
    End Sub
     
    '// Source: https://github.com/nervgh/vba/blob/master/GetRectForExcel2007Plus/test.xlsm_VBProject/mod_GetRectForExcel2007Plus.bas
    ' ----------------------------------------
    ' Returns the cell coordinates in points relative to the screen
    '
    ' @param {Object} Target the cell
    ' @return {Rect} the cell coordinates
    ' ----------------------------------------
    Public Function GetCellRect(ByVal Target As Excel.Range) As Rect
        Const FunctionName As String = "GetCellRect"
        Dim ErrorLogger As ErrorLogger
        Set ErrorLogger = Factory.CreateErrorLogger(ModuleName, FunctionName)
     
        With ActiveWindow
            Set Target = Target.MergeArea
     
            Dim Index As Integer
            For Index = 1 To .Panes.Count
                If Not Intersect(Target, .Panes(Index).VisibleRange) Is Nothing Then
                    Dim Rect As Rect
                    With .Panes(Index)
                        Rect.Left = PixelsToPoints(.PointsToScreenPixelsX(Target.Left))
                        Rect.Top = PixelsToPoints(.PointsToScreenPixelsY(Target.Top))
                    End With
                    Rect.Right = Target.Width * .Zoom / 100 + Rect.Left
                    Rect.Bottom = Target.Height * .Zoom / 100 + Rect.Top
                    GetCellRect = Rect
                    Exit Function
                End If
            Next
        End With
    End Function
    Avec un facteur d'échelle de 100%, pas de problème.
    Avec un facteur autre, le formulaire est mal positionné.

  5. #5
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 110
    Points : 9 919
    Points
    9 919
    Billets dans le blog
    5
    Par défaut
    Bonjour,


    j'ai cette approximation qui traine dans mes tiroirs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Option Explicit
    Declare PtrSafe Function GetDC& Lib "user32.dll" (ByVal hwnd&)
    Declare PtrSafe Function GetDeviceCaps& Lib "gdi32" (ByVal hDC&, ByVal nIndex&)
     
    Sub position_usf(usf, cel)
        ' 1 inch = 72 points for usually 96 or 120 dpi
        Dim x As Double, y As Double
        x = GetDeviceCaps(GetDC(0), 88) / 72
        y = GetDeviceCaps(GetDC(0), 90) / 72
        With usf
            .StartUpPosition = 0
            .Left = (ActiveWindow.PointsToScreenPixelsX(cel.Left * x) * 1 / x)
            .Top = (ActiveWindow.PointsToScreenPixelsY(cel.Top * y) * 1 / y)
        End With
        ActiveWindow.ScrollRow = cel.Row
        ActiveWindow.ScrollColumn = cel.Column
    End Sub

    A utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Activate()
        position_usf Me, Cells(1, 1)
    End Sub

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 301
    Points : 1 900
    Points
    1 900
    Par défaut
    Ca fait le café.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Cache de position des formulaires et des états
    Par 3ug3n dans le forum IHM
    Réponses: 2
    Dernier message: 01/04/2015, 09h57
  2. [Formulaire] position des formulaires
    Par Frenchguy dans le forum IHM
    Réponses: 1
    Dernier message: 28/11/2006, 11h21
  3. [c#] Position du formulaire enfant!
    Par pocket dans le forum Windows Forms
    Réponses: 6
    Dernier message: 27/06/2006, 14h39
  4. formulaire position de page
    Par Ryadus dans le forum Access
    Réponses: 4
    Dernier message: 27/02/2006, 16h04
  5. Modifier la position d'un champs formulaire
    Par gg14bis dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/09/2005, 08h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo