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

Contribuez Discussion :

effet mouse over sur les lignes d'un sheet


Sujet :

Contribuez

  1. #21
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    rebonjour arkham46

    je viens de faire un peu le tour autour de cette fonction

    il semblerais que dans une boucle avec "getcursorpos" ça me donnerait le type d'object en dessous le curseur y compris "range"

    mais pour déterminer quel range(son address) il n'y ai pas de variable pour ça
    mais je cherche encore

    cela dit cette fonction me permettrait de supprimer les fonction de test de la fenêtre pour le pointeur(handle) car en dehors de la grille ça me donne "nothing"

    mais pour les coordonnées je suis dans le flou avec cette fonction

    tu va me donner encore mal a la tête si je comprend bien


    au plaisir

  2. #22
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    je viens de faire un peu le tour autour de cette fonction

    il semblerais que dans une boucle avec "getcursorpos" ça me donnerait le type d'object en dessous le curseur y compris "range"

    mais pour déterminer quel range(son address) il n'y ai pas de variable pour ça
    mais je cherche encore
    RangeFromPoint renvoie un objet Range
    Donc tu as accès à toutes ses méthodes et propriétés : Address, Row, Column, ...

  3. #23
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    rebonjour


    oui tu a raison

    il y a une petite condition
    c'est comment l'api "getcursorpos" est déclarée
    il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Function GetCursorPos Lib "user32" (lpPoint As POINT_) As Long
    et il ya :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long
    allez!! un premier jet sur cette methode
    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
     
    Option Explicit
    Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long
    Type POINTAPI
    X As Long
    Y As Long
    End Type
     
    Type POINT_
          X As Long
          Y As Long
    End Type
    Dim newposition As Variant, oldposition As Variant
    Public tourne As Boolean
    Dim obj As Object
    Dim typeobj As Object
    Dim cpos As POINTAPI
     
    Function ou_on_est()
    With ActiveWindow
    Do
     
    GetCursorPos cpos
    Set obj = .RangeFromPoint(cpos.X, cpos.Y)
    If TypeName(obj) = "Range" Then
    Range("a1").Value = TypeName(obj)
    newposition = obj.Address
    Range("b1").Value = newposition
    Range("c1").Value = Range(newposition).Row
    End If
    If newposition <> oldposition And oldposition <> "" Then
    Range(newposition).Interior.Color = vbRed
    Range(oldposition).Interior.Color = xlNone
    End If
    DoEvents
    oldposition = newposition
    Loop Until tourne = False
    End With
     
    'Set obj = Nothing
    End Function
    beaucoup moins lourd forcément

    ca va cette fois si je n'ai pas trop forcer sur les neuronnes

    merci a toi pour la remarque

    j'adapte le reste du code et je reviens


    au plaisir

  4. #24
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    il y a une petite condition
    c'est comment l'api "getcursorpos" est déclarée
    il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Function GetCursorPos Lib "user32" (lpPoint As POINT_) As Long
    et il ya :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long
    c'est la même chose

    le ".dll" est facultatif
    le "byref" aussi
    "point_" ou "pointapi" c'est comme on veut pourvu que le type soit déclaré avec le même nom

    bonne continuation

  5. #25
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut
    re
    et figure toi que j'ai essayé les deux ,avec une j'ai une erreur lorsque je sort de la grille


    au plaisir

    alors c'etait ca le probleme


    "point_" ou "pointapi" c'est comme on veut pourvu que le type soit déclaré avec le même nom
    merci

    au plaisir

  6. #26
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut le meme avec "rangefrompoint"
    bonjour a tous


    comme arkham46 m'a mis dos au mur avec son "rangefrompoint"

    je livre le nouveau model
    je n'utilise maintenant qu'une seule api le" getcursorpos"

    donc plutot qu'utiliser un rectangle avec les apis pour determiner la grille

    j'utilise le typename de l'object rangefrompoint x y
    si c'est nothing on sort de boucle
    sinon on continue
    le reste n'apas trop changé

    la facon d'appeler la fonction n'a pas changé
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Type POINTAPI
          X As Long
          Y As Long
    End Type
    Type RECT
          Left As Long
         Top As Long
         Right As Long
         Bottom As Long
    End Type
    Dim point As POINTAPI
    Dim coord As RECT
    Dim nomclasse As String * 200
    Dim newposition As Variant, oldposition As Variant
    Dim couleur() As Long
    Public tourne As Boolean
    Dim oldcouleur As Long
    Dim obj As Object
    Dim adresse As String
    Function pos_souris(choix As Variant, maplage As Variant, overcouleur As Variant)
    Do
    DoEvents
          GetCursorPos point
          Set obj = ActiveWindow.RangeFromPoint(point.X, point.Y)
     
     
     
    If TypeName(obj) = "Range" Then
     
    adresse = obj.Address
     
     col = Range(adresse).Column
     lin = Range(adresse).Row
    Else
     GoTo fin
    DoEvents
     
     End If
     '****************************************
     
     'résultat
         pos_souris = Range(adresse).Address
    newposition = pos_souris
     
    ' pas de couleur si le curseur se trouve hors de la grille
        If TypeName(obj) = "Nothing" Then
            'Cells.Interior.Color = xlNone
            Range(oldposition).Interior.Color = oldcouleur
            newposition = oldposition
     
     
                For i = maplage.Column To maplage.Columns.Count + maplage.Column - 1
     
                    If couleur(i) = vbWhite Then couleur(i) = xlNone
                    Cells(Range(oldposition).Row, i).Interior.Color = couleur(i)
                Next
     
        Else
              'ici pour eviter le scintillement de la cellule on verifie si la position (adresse celule) a changé
            If newposition <> oldposition Then
     
                 'on memorise la couleur initiale de la cellule des que oldposition a une valeur
              If oldposition <> "" Then
                       If oldcouleur = vbWhite Then oldcouleur = xlNone ' si c'est blanc il n'y a pas de couleur
     
                       Range(oldposition).Interior.Color = oldcouleur
     
                    For i = maplage.Column To maplage.Columns.Count + maplage.Column - 1
     
                     If couleur(i) = vbWhite Then couleur(e) = xlNone
                     Cells(Range(oldposition).Row, i).Interior.Color = couleur(i)
                    Next
                     End If
     
     
                oldcouleur = Range(newposition).Interior.Color
                If oldcouleur = vbWhite Then oldcouleur = xlNone
     
     
                  For i = maplage.Column To maplage.Columns.Count + maplage.Column - 1
                   ReDim Preserve couleur(i)
                   If Cells(Range(newposition).Row, i).Interior.Color = vbWhite Then
                   couleur(i) = xlNone
                   Else
                   couleur(i) = Cells(Range(newposition).Row, i).Interior.Color
                   End If
                  Next
     
     
                        If choix <> "" Then
                           Select Case choix
     
                           Case "celule"
                        'ici on remplie de rouge la cellule survoléesi les condition de debut et de fin de colonne et debut et et de fin de ligne
                           If col >= maplage.Column And col <= maplage.Columns.Count + maplage.Column - 1 And lin >= maplage.Row And lin <= maplage.Rows.Count + maplage.Row - 1 Then
                             If overcouleur < 56 Then
                             Range(newposition).Interior.ColorIndex = overcouleur
                             Else
                             Range(newposition).Interior.Color = overcouleur
                             End If
                           End If
                           ' on remplie une partie de la ligne
                           Case "ligne"
                           'ici on remplie de rouge la ligne survolée dans la zone si les condition de debut et de fin de colonne et debut et et de fin de ligne
                           If col >= maplage.Column And col <= maplage.Columns.Count + maplage.Column - 1 And lin >= maplage.Row And lin <= maplage.Rows.Count + maplage.Row - 1 Then
                            If overcouleur < 56 Then
                            Range(Cells(lin, maplage.Column).Address & ":" & Cells(lin, maplage.Columns.Count + maplage.Column - 1).Address).Interior.ColorIndex = overcouleur
                            Else
                            Range(Cells(lin, maplage.Column).Address & ":" & Cells(lin, maplage.Columns.Count + maplage.Column - 1).Address).Interior.Color = overcouleur
                            End If
                           End If
                           End Select
                        End If
     
     
     
             End If
          End If
     
     
              oldposition = newposition ' on attribu a la variables olposition celle de la newposition pour la comparer a newposition l'ors de la prochaine boucle
    fin: DoEvents
             Loop While tourne = True
    col = ""
    lin = ""
    oldcouleur = xlNone
     
    End Function
    pour arkham: a tu encore un truc pour me torturer les neuronnes?
    parceque la """trop facile"""


    au plaisir

  7. #27
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonsoir a tous

    allez on continu dans l'allegement du code

    on utilise plus de variables lin,col
    on ne teste plus la colonne ni la ligne ,on utilise maintenant le "intersect"du range pour la limite de l'effet

    allez moind de blabla on y va

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Type POINTAPI
          X As Long
          Y As Long
    End Type
    Type RECT
          Left As Long
         Top As Long
         Right As Long
         Bottom As Long
    End Type
    Dim point As POINTAPI
    Dim coord As RECT
    Dim nomclasse As String * 200
    Dim newposition As Variant, oldposition As Variant
    Dim couleur() As Long
    Public tourne As Boolean
    Dim oldcouleur As Long
    Dim obj As Object
    Dim adresse As String
    Function pos_souris(choix As Variant, maplage As Variant, overcouleur As Variant)
    Do
    DoEvents
          GetCursorPos point 'trouve les coordonnées du curseur
          Set obj = ActiveWindow.RangeFromPoint(point.X, point.Y) 'trouve l'object sous le curseur
     
     
     
    If TypeName(obj) = "Range" Then 'si le type d'object est un "range"
     
    adresse = obj.Address 'la variable "adresse" est l'adresse du range
     
     
    Else
    DoEvents
    GoTo fin
     
     
     End If
     '****************************************
     
     'résultat
    newposition = Range(adresse).Address
     
     
    ' pas de couleur si le curseur se trouve hors de la grille car la variable obj donne "nothing en dehors de la grille
        If TypeName(obj) = "Nothing" Then
        newposition = oldposition
        End If
                  'ici pour eviter le scintillement de la cellule on verifie si la position (adresse celule) a changé
            If newposition <> oldposition Then
     
                If oldposition <> "" Then
     
                    'ici on boucle sur toutes les colones de la plage delimité sur la ligne survolée et on remet toutes les couleurs de chaques cellules de cette ligne
                    For i = maplage.Column To maplage.Columns.Count + maplage.Column - 1
                      If couleur(i) = vbWhite Then couleur(e) = xlNone
                      Cells(Range(oldposition).Row, i).Interior.Color = couleur(i)
                    Next
                End If
     
     
     
     'on memorise la couleur initiale de la cellule des que oldposition a une valeur
     
                  For i = maplage.Column To maplage.Columns.Count + maplage.Column - 1
                  ReDim Preserve couleur(i)
                   If Cells(Range(newposition).Row, i).Interior.Color = vbWhite Then
                   couleur(i) = xlNone
                   Else
                   couleur(i) = Cells(Range(newposition).Row, i).Interior.Color
                   End If
                  Next
     
             If Not Intersect(maplage, Range(newposition)) Is Nothing Then
     
                      If choix <> "" Then
                           Select Case choix
     
                           Case "celule"
                        'ici on remplie de rouge la cellule survoléesi les condition de debut et de fin de colonne et debut et et de fin de ligne
                               If overcouleur < 56 Then
                             Range(newposition).Interior.ColorIndex = overcouleur
                             Else
                             Range(newposition).Interior.Color = overcouleur
                             End If
     
                           ' on remplie une partie de la ligne
                           Case "ligne"
                           'ici on remplie de rouge la ligne survolée dans la zone si les condition de debut et de fin de colonne et debut et et de fin de ligne
                              If overcouleur <= 56 Then
                              Range(Cells(Range(newposition).Row, maplage.Column).Address & ":" & Cells(Range(newposition).Row, maplage.Columns.Count + maplage.Column - 1).Address).Interior.ColorIndex = overcouleur
                              Else
                              Range(Cells(Range(newposition).Row, maplage.Column).Address & ":" & Cells(Range(newposition).Row, maplage.Columns.Count + maplage.Column - 1).Address).Interior.Color = overcouleur
                              End If
     
                           End Select
                       End If
     
            End If
     
        End If
     
     
     
              oldposition = newposition ' on attribu a la variables olposition celle de la newposition pour la comparer a newposition l'ors de la prochaine boucle
    fin: DoEvents
             Loop While tourne = True
     
    oldcouleur = xlNone
     
    End Function
    voila au plaisir

  8. #28
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonjour a tous


    allez!! encore une énième version

    nouveauté

    avec les versions d'avant si on choisissait la premiere ligne dans le range deffinissant la limite il y avait un tout petit bug
    en effet

    dèes que l'on sortait de la grille apres etre passé sur la ligne 1 ou la colonne 1
    la cellule ou la ligne restait rouge et quand on revenait sur la meme cellule
    ca ne fonctionnait pas

    alors un petite corection s'imposait

    pour le reste ca n'a pas changé

    voila allez je depose meme un exemple
    Fichiers attachés Fichiers attachés

  9. #29
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    bjr,

    quelques remarques, à prendre ou à laisser

    Remarque 1 :
    Il y a du traitement superflus.
    On a le sablier qui indique que le VBA tourne (quand on passe sur le menu par exemple).
    en fin de procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If TypeName(obj) = "Nothing" And oldposition = newposition Then
        oldposition = newposition
    en ajoutant le test sur le changement de position, on évite de traiter le code qui me paraît inutile à ce moment (à confirmer, j'ai regardé vite fait)


    Remarque 2 :
    Le CPU tourne à plein régime, même si on ne touche à rien.
    Pour éviter ça :
    Ajouter la déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Sub WaitMessage Lib "user32" ()
    Appeler WaitMessage en début de boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Do
        WaitMessage
    [...]
    Le WaitMessage attend (sans manger tout le CPU) qu'il y a ait au moins un message dans la file d'attente.
    Le DoEvents qui suit traitera ces message et le code s'enchaînera.

    Remarque 3 :
    Un bout coup de SmartIndenter ne ferait pas de mal, le code se lit difficilement.

    Remarque 4 :
    Il y a quelques variables inutilisées...

    Remarque 5 :
    Que font les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If couleur(i) = vbWhite Then couleur(e) = xlNone
    e n'est pas défini ?
    En fait si on a du blanc dans une cellule, ça l'enlève avec le xlNone

  10. #30
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut rer
    bonjour arkham

    oui je suis en train de traiter le problème du cpu bien que chez moi il n'est pas très bousculé


    pour le vbwite et xlnone
    en fait quand je mémorise les couleurs sur la ligne si je tombe sur une cellule qui n'est pas coloriée il m'enregistre la couleur comme blanche et quand on sort de la cellule et que la boucle qui remet les couleurs d'origine la cellule qui était en xlnone devient blanche ce qui m'efface la grille

    enlève cette condition et tu verra

    c'est pour ça que dans la boucle la couleur blanche devient "xlnone"


    je vais essayer de comprendre ce que tu ma indiquer au début et je reviens


    au plaisir

  11. #31
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonjour arkham

    je viens de faire l'essai avec le "waitmessage" et effectivement

    ca reduit grandement la consomation cpu

    chez moi

    12% sans le "waitmessage"

    3%avec le "waitmessage" wouawhhhh!! ca va faire plaisir au ventilo

    je te remerci pour le tuyau

    heu!..... t'en a d'autres

    merci a toi

    ps j'ai telecharger le smart indenter sa simplifie la tache en plus il s'integre dans le menu edition du vbe !! tres bien!!
    voila le nouveau code netoyé indenter dis moi ce que tu en pense
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Declare Sub WaitMessage Lib "user32" ()
    Type POINTAPI
        X As Long
        Y As Long
    End Type
    Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
    End Type
    Public tourne As Boolean
    Dim point As POINTAPI
    Dim newposition As Variant, oldposition As Variant
    Dim couleur() As Long
    Dim obj As Object
    Sub pos_souris(choix As Variant, maplage As Variant, overcouleur As Variant)
        Do
     
            WaitMessage    'en attente d'un message (en l'occurence dans le cas présent  si j'ai bien compris "nothing ou range")
     
     
            DoEvents    'permet au reste du fichier de fonctionner
            GetCursorPos point    'trouve les coordonnées du curseur
            Set obj = ActiveWindow.RangeFromPoint(point.X, point.Y)    'trouve l'object sous le curseur(en l'occurence "Range ou nothing")
     
     
     
            If TypeName(obj) = "Range" Then    'si le type d'object est un "range" on va a la ligne "go
     
                GoTo go    '
     
            Else    'autrement on va a la ligne "fin"
     
                DoEvents
                GoTo fin
     
     
            End If
            '****************************************
    go:
            'résultat
            newposition = obj.Address
     
     
            ' pas de couleur si le curseur se trouve hors de la grille car la variable obj donne "nothing en dehors de la grille
            If TypeName(obj) = "Nothing" Then
                newposition = oldposition
            End If
            'ici pour eviter le scintillement de la cellule on verifie si la position (adresse celule) a changé
            If newposition <> oldposition Then
     
                If oldposition <> "" Then
     
                    'ici on boucle sur toutes les colones de la plage delimité sur la ligne survolée et on remet toutes les couleurs de chaques cellules de cette ligne
                    For i = maplage.Column To maplage.Columns.Count + maplage.Column - 1
                        If couleur(i) = vbWhite Then couleur(e) = xlNone
                        Cells(Range(oldposition).Row, i).Interior.Color = couleur(i)
                    Next
                End If
     
     
     
                'on memorise la couleur initiale de la cellule des que oldposition a une valeur
     
                For i = maplage.Column To maplage.Columns.Count + maplage.Column - 1
                    ReDim Preserve couleur(i)
                    If Cells(Range(newposition).Row, i).Interior.Color = vbWhite Then
                        couleur(i) = xlNone
                    Else
                        couleur(i) = Cells(Range(newposition).Row, i).Interior.Color
                    End If
                Next
     
                If Not Intersect(maplage, Range(newposition)) Is Nothing Then
     
                    If choix <> "" Then
                        Select Case choix
     
                        Case "celule"
                            'ici on remplie de rouge la cellule survoléesi les condition de debut et de fin de colonne et debut et et de fin de ligne
                            If overcouleur < 56 Then
                                Range(newposition).Interior.ColorIndex = overcouleur
                            Else
                                Range(newposition).Interior.Color = overcouleur
                            End If
     
                            ' on remplie une partie de la ligne
                        Case "ligne"
                            'ici on remplie de rouge la ligne survolée dans la zone si les condition de debut et de fin de colonne et debut et et de fin de ligne
                            If overcouleur <= 56 Then
                                Range(Cells(Range(newposition).Row, maplage.Column).Address & ":" & Cells(Range(newposition).Row, maplage.Columns.Count + maplage.Column - 1).Address).Interior.ColorIndex = overcouleur
                            Else
                                Range(Cells(Range(newposition).Row, maplage.Column).Address & ":" & Cells(Range(newposition).Row, maplage.Columns.Count + maplage.Column - 1).Address).Interior.Color = overcouleur
                            End If
     
                        End Select
                    End If
     
                End If
     
            End If
     
     
     
            oldposition = newposition    ' on attribu a la variables olposition celle de la newposition pour la comparer a newposition l'ors de la prochaine boucle
    fin:
     
            'dès que l'on sort de la grille et que (l'obj)deviens "Nothing" on remet les couleurs de la derniere ligne survolée
            'et on donne une valeur vide a oldposition car la condition pour que le changement soit effectif _
             c'est que la newposition soit différente de la oldposition comme ca si on revient sur la meme cellule l'effet sera actif
     
     
            If TypeName(obj) = "Nothing" Then
                oldposition = newposition
                For i = maplage.Column To maplage.Columns.Count + maplage.Column - 1
                    If couleur(i) = vbWhite Then couleur(i) = xlNone
                    Cells(Range(oldposition).Row, i).Interior.Color = couleur(i)
                Next
     
                oldposition = ""
            End If
            DoEvents
        Loop While tourne = True
     
     
     
    End Sub
    ps:y a t-il un truc similaire pour les userforms????

    au plaisir

  12. #32
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Citation Envoyé par patricktoulon Voir le message
    bonjour arkham



    ps:y a t-il un truc similaire pour les userforms????
    je crois que j'ai trouvé tout seul la meme fonction pour les controls
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Type POINTAPI
        X As Long
        Y As Long
    End Type
    Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As  Long
    Private Function GetHwndFromPoint(ByRef p As POINTAPI) As Long
        GetHwndFromPoint = WindowFromPoint(p.X, p.Y)
    End Function
    au plaisir

Discussions similaires

  1. [ExtJS 3.2] Effet sur les Lignes d'un tableau (Editgrid)
    Par pitou26 dans le forum Ext JS / Sencha
    Réponses: 0
    Dernier message: 07/01/2013, 09h44
  2. Réponses: 1
    Dernier message: 02/02/2008, 08h39
  3. changement de couleur sur les lignes d'un tableau
    Par brasco06 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 13/04/2006, 18h03
  4. Fonction MAX sur les lignes
    Par yostane dans le forum Langage SQL
    Réponses: 7
    Dernier message: 01/04/2006, 21h49
  5. statistiques sur les lignes et colonnes d'un fichier
    Par ericbareke dans le forum Langage
    Réponses: 5
    Dernier message: 23/03/2006, 16h09

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