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 :

.Top et plage filtrée [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    chargé d'affaires
    Inscrit en
    Novembre 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : chargé d'affaires
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2017
    Messages : 51
    Par défaut .Top et plage filtrée
    Bonjour à tous,

    J'ai un fichier où d'un clic droit j'ouvre un calendrier positionné par rapport à ma cellule active.
    Depuis quelques jours, je constate quelque chose d'étrange, et je ne saurais dire si cela est depuis le début ou non.
    Peut-être est-ce lié au numéro de la ligne et/ou la position de ma cellule dans la page.

    Info au passage, je filtre sur + de 200 lignes et n'en affiche guère plus d'une dizaine en permanence.


    Code au niveau du clic droit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ' Menu Date
        If Not Intersect(Target, Range("k:k")) Is Nothing Then
            Cancel = True
            ActiveWorkbook.Save
            Calendrier.Show
        End If
    Code au niveau du userform :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub UserForm_Initialize()
        With Me
            .Top = ActiveCell.Top + 10
            .Left = ActiveCell.Left - 100
            .MonthView1 = Date
        End With
    End Sub
    Le code est toujours le même et pourtant, en fonction de je ne sais quel paramètre, mon calendrier n'est jamais au même endroit, voir hors écran. Il me faut alors faire Alt+F4 pour reprendre la main !
    Sa position .left semble toujours OK, la .top varie.

    Please help.

    Pierre

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Essaie en mettant ceci avant les Left et Top

  3. #3
    Membre averti
    Homme Profil pro
    chargé d'affaires
    Inscrit en
    Novembre 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : chargé d'affaires
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2017
    Messages : 51
    Par défaut
    Bonjour,

    Merci, je viens d'essayer, j'ai d'abord cru que cela fonctionnait et après plusieurs essais j'ai d'abord compris que non, puis j'ai constaté autre chose.

    Etat des lieux :
    1 / mes deux premières lignes sont figées
    2 / les lignes suivantes sont filtrées

    Constat :
    3 / si je vois les premières lignes filtrées tout semble plutôt normal, même si je trouve la userform un peu haute par rapport à ma demande (à vérifier ...?)
    4 / dès que je scrolle vers le bas, ma fenêtre userform disparaît trop bas ! même avec ".StartUpPosition = 0"

    mon diagnostique avance donc ! mais ne m'aide pas à trouver...

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Peut-être devrais-tu y aller avec une valeur fixe plutôt que le haut d'une cellule (?)
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Top = Application.Top + 100  'à ajuster au besoin

  5. #5
    Membre averti
    Homme Profil pro
    chargé d'affaires
    Inscrit en
    Novembre 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : chargé d'affaires
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2017
    Messages : 51
    Par défaut
    Eh bien j'y ais pensé figure-toi, mais je préférais suivre une cellule, car plus ergonomique.
    De mémoire ça fonctionne bien en fixe. Pourquoi le mode lié à la cellule n'est donc pas fiable ?
    Et aucun forum ne semble traiter de ce point !

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Je dirais que la faute vient du ruban, en quelque sorte...
    Si Activecell.Top = 75, le Userform se positionnera à 75 par rapport au haut de l'application et non par rapport au haut de la plage.

  7. #7
    Membre averti
    Homme Profil pro
    chargé d'affaires
    Inscrit en
    Novembre 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : chargé d'affaires
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2017
    Messages : 51
    Par défaut
    C'est l'impression que ça me donne, en fait il faudrait donc une valeur "fixe" qui fasse référence à une variable qui mesure la position de ma cellule dans ma zone filtrée !! est-ce seulement possible ?

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Tu peux toujours modifier la valeur que tu ajoutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Top = ActiveCell.Top + 100

  9. #9
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Les coordonnées d'un userform sont par rapport à l'angle supérieur gauche de l'écran
    Celles d'une cellule le sont par rapport à l'angle supérieur gauche de la fenêtre activeWindow
    Tu ne peux donc placer ton userform en lui passant comme coordonnées celles, par rapport à la fenêtre activewindow, de la cellule où tu souhaites le placer
    Tu trouveras parmi les contributions déposées ce qu'il te faut pour placer ton userform comme tu le souhaites.
    Ceci dit : je ne vois pas l'intérêt réel de placer un userform sur une cellule.

    EDIT : j'ignore par ailleurs ce qu'est ton "calendrier". S'il s'agit d'un contrôle activex, il est directement positionnable sur la feuille de calcul aux coordonnées de la cellule de ton choix.
    S'il s'agit d'un "calendrier maison" utilisant un userform (une lourdeur ajoutée ...) :
    1) Lis donc ceci :
    https://www.developpez.net/forums/d1...euille-calcul/
    2) réécris ton "calendrier" dans un Frame et non un userform.
    3) un contrôle Frame peut, lui, être directement positionné (comme tout activex) sur la feuille de calcul aux coordonnées de la cellule de ton choix.

  10. #10
    Membre averti
    Homme Profil pro
    chargé d'affaires
    Inscrit en
    Novembre 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : chargé d'affaires
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2017
    Messages : 51
    Par défaut
    Bonjour,
    Merci à tous pour vos retours.

    Pour répondre aux dernières questions soulevées et aux propositions :

    Mon calendrier est "MonthView1", outils fourni par Microsoft. J'ai cherché à faire autrement car cet outils n'est pas fonctionnel sur tous les MS Office, et ai finit par trouver une macro calendrier développée par un tiers, mais je n'ai pas pris le temps de la mettre en place. Mais ça c'est une autre histoire.

    J'ai jeté un oeil à ton lien et à ce qu'est une "Frame".
    Merci bcp, cela semble très bien, je m'y pencherai plus longuement à titre privé.
    Mais vu mon niveau VBA pas si bon que ça, plus le fait que je fais ça (aujourd'hui) pour le boulot et qu'il serait mal vu que je prenne trop de temps à mettre à niveau une tache qui, mise à part ce soucis de position, fonctionne bien, je vais rester sur la méthode actuelle. Soucis qui est d'ailleurs contournable en positionnant le calendrier en milieu de page par exemple.

    Pourquoi je souhaite le positionner par rapport à ma cellule ?
    Pour la même raison que sur un site internet, lorsqu'on a un outil de choix de date, celui-ci s'ouvre là où on clique. Ce n'est qu'une question d'ergonomie. Alors effectivement je peux lui dire de s'ouvrir au milieu de la page, c'est moins propre mais ça marche très bien aussi, c'est d'ailleurs ce que j'ai fait en attendant de trouver comment obtenir la position de ma cellule malgré le filtrage...

    N'y a t-il donc pas moyen d'obtenir la position de ma cellule après filtrage ? A l'heure actuelle, une cellule en position .Top = 650 non filtré, aura la même valeur une fois filtré, alors que sa nouvelle position est plutôt .Top = 220.

  11. #11
    Membre averti
    Homme Profil pro
    chargé d'affaires
    Inscrit en
    Novembre 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : chargé d'affaires
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2017
    Messages : 51
    Par défaut
    Citation Envoyé par parmi Voir le message
    Tu peux toujours modifier la valeur que tu ajoutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Top = ActiveCell.Top + 100
    Salut,

    Oui je pourrais jouer sur la valeur additionnelle mais comment, suivant où ma cellule se trouve dans l’écran... ?

    En fait on en vient au message de @unparia, le userform se positionne par rapport à excel, ma cellule par rapport à ma feuille, et la position de ma cellule varie inexorablement lorsque je scrolle.
    Il faudrait plutôt que je prenne la position de mon curseur au moment du clique... est-ce possible ?
    Je creuse un peu cette piste et reviens poster le résultat de ma recherche

  12. #12
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    En fait on en vient au message de @unparia, le userform se positionne par rapport à excel, ma cellule par rapport à ma feuille
    Non "par rapport à Excel" (et donc la fenêtre application), mais par rapport à l'ECRAN.
    L'un est l'autre ne sont confondus QUE si l'angle supérieur gauche de la fenêtre application est à l'angle supérieur gauche de l'écran (ce qui n'est pas du tout toujours vrai, notamment si l'utilisateur fait "flotter" la fenêtre application).

  13. #13
    Membre averti
    Homme Profil pro
    chargé d'affaires
    Inscrit en
    Novembre 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : chargé d'affaires
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2017
    Messages : 51
    Par défaut
    Merci à tous les deux, je viens de trouver ma solution. La voici.

    - j'ai trouvé un code qui me donne la position du curseur de ma souris
    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
    Public CursorY As String
     
    ' Position de X et Y par rapport a l'écran
    Private Declare Function GetCursorPos Lib "user32" ( _
        lpPoint As POINTAPI) As Long
    Private Type POINTAPI
        X As Long
        Y As Long
    End Type
     
    Sub XY()
    Dim CursorX As String
    Dim pos As POINTAPI
    GetCursorPos pos
    CursorX = pos.X
    CursorY = pos.Y
    End Sub
    J'en ai sorti CursorY pour en faire une variable public pour l'utiliser dans l'initialize de mon USF. J'aurais pu nettoyer CursorX qui dans ce cas ne sert à rien !

    - Voici mon code pour la position de mon USF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub UserForm_Initialize()
        Call XY
        With Me
            .StartUpPosition = 0
            .Top = CursorY * 72 / 100 - 75
            .Left = ActiveCell.Left - 100
            .MonthView1 = Date
        End With
    End Sub
    Il semble que la souris et le USF n'utilisent pas les mêmes unités de mesure : point Vs pixel, avec un ratio de 1/72.
    Une petite règle de 3, une rehausse de 75 et j'ai mon calendrier au niveau que je souhaite, quelque soit ma position dans la page !

    Encore une fois, merci, l'échange finit toujours par payer !

    Bonne journée à chacun

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

Discussions similaires

  1. VBA - Pb Suppression lignes sur plage filtrée
    Par oracle7556 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/06/2010, 21h54
  2. [XL-2003] Trouver le min et le max d'une colonne dans une plage filtrée
    Par Gwladys dans le forum Excel
    Réponses: 2
    Dernier message: 06/04/2009, 17h37
  3. [VBA-E] Enregistrement d'une plage filtrée
    Par damsmut dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 15/01/2008, 11h14
  4. [VBA-E] selection plage + filtre auto
    Par noug dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/05/2006, 15h57

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