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 :

Graph forme automatique et survol souri


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 020
    Points : 169
    Points
    169
    Par défaut Graph forme automatique et survol souri
    Bonjour,
    Je cherche à afficher une forme automatique contenant des données par survol de la souri sur mon graphe en nuage de points.

    Jusque là aucun problème.

    Mon souci est le positionnement de cette forme (en fait il y en a 2 sur le graphe) que j'arrive à calibrer pour une extrémité (haute ou basse) du graphique mais qui se décale tout au long de ce dernier (vers le bas ou vers le haut) jusqu'à des positionnements pas très lisible pour l'utilisateur.

    Le code utilisé (et que je suis arrivé à calibrer sur des commandbutton moins étendus il est vrai), dans un module de classe:

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    Option Explicit
     
     
     
     
    Public WithEvents Graph As Chart
     
     
     
     
     
    '*** Utilisation des évènements *********
     
    Private Sub Graph_MouseMove(ByVal Button As Long, ByVal Shift As Long, _
                        ByVal X As Long, ByVal y As Long)
     
                        Dim pt As POINTAPI
     
     GetCursorPos pt
     
       Dim dX As Single, dY As Single
     
                dX = X - (X - 5): dY = y - (y / 2 - 15)
     
        Dim ElementID As Long
        Dim Arg1 As Long, Arg2 As Long
     
     
        On Error Resume Next
        ActiveChart.GetChartElement X, y, ElementID, Arg1, Arg2
     
     
     
            Dim OuX As Single, OuY As Single
            OuX = X
            OuY = (y / 100 + (dY / 0.6))
            Application.StatusBar = y & " " & OuY
     
            With ActiveChart.Shapes("Rectangle 1")
                .Visible = msoTrue
                .TextFrame.Characters.Text = _
               Worksheets("STATS").Range("V1").Offset(Arg2 - 1, 4).Value
               .AutoSize = True
     
                    If Worksheets("STATS").Range("V1").Offset(Arg2 - 1, 4).Value > 250 Then
                    .Fill.ForeColor.RGB = RGB(255, 0, 0)
                    Else
                    .Fill.ForeColor.RGB = RGB(0, 0, 0)
                    End If
     
                 .Left = OuX - 100
                .Top = OuY - 100
            End With
     
     
     
                    With ActiveChart.Shapes("Rectangle 2")
                .Visible = msoTrue
                .TextFrame.Characters.Text = _
               Worksheets("STATS").Range("V1").Offset(Arg2 - 1, -1).Value
     
              .ScaleHeight 1.5, msoTrue
     
               .Fill.ForeColor.RGB = RGB(10, 0, 0)
     
                .Left = OuX
                .Top = OuY - 75
            End With
     
     
     
     
     
     
     
    End Sub
    Le graphe s'étend sur une plage correspondant à (M1:U207) et j'ai un Zoom à 100%

    Quelqu'un peut-il m'aider s'il vous plaît.

    MERCI

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour
    non c'est pas possible les graph ne possedent pas d'evenement mouse move
    il te faut mettre un label (Activx)transparent dessus et te servir des evenement label
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 020
    Points : 169
    Points
    169
    Par défaut
    Je n'ai absolument pas le niveau pour emmètre le moindre doute mais mon code ne plante pas et mes formes s'affichent bien.
    Mon souci est leurs positionnement sur le graphique qui est aligné sur le sommet de la zone graphique quand ma souri est à cet endroit mais qui s'éloigne petit à petit de mon curseur à fur et à mesure qu'il descend sur le graphique.

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 020
    Points : 169
    Points
    169
    Par défaut
    Je connais déjà la technique du Label que tu m'avais donnée dans un autre post et que j'utilise dans ce classeur, autre part

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 020
    Points : 169
    Points
    169
    Par défaut
    J'ai trouvé ce code sur le Forum que j'essaye d'adapter tant bien que mal:


    https://www.developpez.net/forums/d1...ris-graphique/

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 020
    Points : 169
    Points
    169
    Par défaut
    Mon graphe s'étend sur plusieurs pages en hauteur (nécessaire vu ce que je souhaite afficher), avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub test()
    NbColonnes = Windows(1).VisibleRange.Columns.Count
    NbLignes = Windows(1).VisibleRange.Rows.Count
    PremLigneVisible = ActiveWindow.ScrollRow
    PremColVisible = ActiveWindow.ScrollColumn
    PlageVisible = Range(Cells(PremLigneVisible, PremColVisible), _
           Cells(PremLigneVisible + NbLignes, PremColVisible + NbColonnes)).Address
    MsgBox PlageVisible
    End Sub
    modifié, j'arrive à conserver mes formes au centre de l'écran.

    Est-il possible de leur donner un mouvement proportionnel au mouvement du pointeur de la souri entre la première ligne et la dernière ligne affichée?

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 020
    Points : 169
    Points
    169
    Par défaut
    J'en suis là:

    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
     
    Dim Soom As Long
     
    Soom = (ActiveWindow.ScrollRow + (Windows(1).VisibleRange.Rows.Count / 2)) / Windows(1).VisibleRange.Rows.Count
     
     
    OuY = Soom * pt.y 
     
    Select Case OuY
     
    Case Is < ActiveWindow.ScrollRow * 15
     
    OuY = ActiveWindow.ScrollRow * 16
     
    Case Is > (ActiveWindow.ScrollRow + Windows(1).VisibleRange.Rows.Count) * 15
     
    OuY = (ActiveWindow.ScrollRow + Windows(1).VisibleRange.Rows.Count) * 14
     
    End Select
    Ca n'est pas de la précision Suisse mais ça ressemble à ce que je souhaite obtenir

    Si quelqu'un a mieux................

    Voir même:
    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
     
    Dim Soom As Long, LiMi As Long
     
            LiMi = (ActiveWindow.ScrollRow + Windows(1).VisibleRange.Rows.Count) / 2
     
     
            Soom = (ActiveWindow.ScrollRow + (Windows(1).VisibleRange.Rows.Count / 2)) / Windows(1).VisibleRange.Rows.Count
     
     
          OuY = Soom * pt.y
     
    Select Case OuY
     
    Case Is < ActiveWindow.ScrollRow * HauteurCellule(Range(LiMi & ":" & LiMi))
     
    OuY = (ActiveWindow.ScrollRow * (HauteurCellule(Range(LiMi & ":" & LiMi)) + 1.5))
     
    Case Is > (ActiveWindow.ScrollRow + Windows(1).VisibleRange.Rows.Count) * HauteurCellule(Range(LiMi & ":" & LiMi))
     
    OuY = ((ActiveWindow.ScrollRow + Windows(1).VisibleRange.Rows.Count) * (HauteurCellule(Range(LiMi & ":" & LiMi)) - 1.5))
     
    End Select
    Avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Function HauteurCellule(oRange As Range)
    HauteurCellule = oRange.Height
    End Function

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    ca implique une boucle sans fin interompable avec l'api getcursorpos si je ne me trompe pas
    pas tres perenne comme solution
    alors qu'un lable transparent ayant ses evenement meeme avec getcursorpos dans le move ne troune pas en boucle
    cela dit je comprends pas vraiment ce que tu veux faire avec le move sur un graph
    mais dans tout les cas uneboucle sans fin sur getcursorpos n'est certainement pas une solution
    il me faudrait le code complet pour analyse


    un rangefrompoint avec les coordonné X et pos.y x etant une valeur compris entre 0 et et le left du graph te donnerait la cellule

    regarde ce que je fait avec un label transparent

    dans une feuille met un label(activX)
    et ce code dans son module feuille
    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
     
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Type POINTAPI
        X As Long
        Y As Long
    End Type
    Dim pos As POINTAPI
    Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        GetCursorPos pos
        Cells(1, 1) = pos.X & " :  " & pos.Y
        Set obj = ActiveWindow.RangeFromPoint(50, pos.Y) ' je me sert juste de pos.y et je prend 50 a adapter en fonction de l'etat de ta fenetre et window bien sur a convertir en pixel 
        Select Case TypeName(obj)
        Case "Range"
            Cells(2, 1) = TypeName(obj)
            Cells(2, 2) = obj.Address
            Rows(obj.Row).Select
        Case Else
            Cells(2, 1) = TypeName(obj)
        End Select
    End Sub
    tu pourrais tres bien mettre ton graph dessous et jouir de la possition sans boucle sans fin juste par l'evenement move du label

    demo
    Nom : demo3.gif
Affichages : 237
Taille : 250,5 Ko
    je peux pas te donner plus simple
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    1 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 020
    Points : 169
    Points
    169
    Par défaut
    Le code auquel je suis arrivé ne plante pas et j'arrive à avoir ma forme automatique rectangle qui affiche des données supplémentaires sur mon graphe, cette forme ne sort jamais de l'écran et suit peu ou proue mon pointeur de souri sans renvoi d'erreur.
    Si plus précis (suivi du pointeur de la souri) est possible, je suis preneur.

    La technique du commandbutton activeX m'est très utile dans ce classeur à d'autres endroits mais pour ce qui est du graphe j'avais trouvé un code mais le problème rencontré est qu'il n'est précis que pour un zoom à 120% (sans que je sois arrivé à modifier la chose) or je souhaitais quelque chose de plus flexible.


    Merci patricktoulon en tout cas

Discussions similaires

  1. Mise en forme automatique d'un tableau
    Par Gestion dans le forum Access
    Réponses: 2
    Dernier message: 24/03/2006, 22h19
  2. Rajout d'une ligne à l'aide contextuelle survol souris
    Par patrick24 dans le forum Langage
    Réponses: 3
    Dernier message: 28/12/2005, 11h13
  3. Réponses: 3
    Dernier message: 13/10/2005, 11h31
  4. Atteindre NewRec dans sous form automatiquement !
    Par samlepiratepaddy dans le forum Access
    Réponses: 10
    Dernier message: 25/09/2005, 10h25
  5. mise en forme automatique du code a 80 colonnes ??
    Par benwa dans le forum JBuilder
    Réponses: 1
    Dernier message: 27/03/2005, 22h43

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