Résolu Excel mettre en couleur la ligne et la colonne de la cellule selection

SCHMITX

Habitué
Bonjour,
J'aimerai sur excel, lorsque je déplace le curseur de la souris sur une cellule, que la ligne et la colonne, correspondants à cette dernière se mettent en couleur.
Par exemple si la souris se trouve sur la cellule I23, la ligne 23 et la colonne I se colorient.
De même, si la cellule D8 se trouve sous le curseur de la souris, la ligne 8 et la colonne D se colorient.

J'aimerai pouvoir effectuer cette opération dans une plage donné, par exemple range ("E5;S31").
 

zeb

Modérateur
Bonjour,

Utilise la méthode SelectionChange de l'objet Worksheet dans le code de la feuille à considérer.
 

SCHMITX

Habitué
Mais il me semble que l'objet selection change du worksheet, s'active que lorsque l'on active une cellule.
Alors que ce que je souhaite c'est activer le code simplement au passage de la souris
 

zeb

Modérateur
Ah. Et bien ce n'est pas possible (*).
L'événement OnMouseOver n'existe pas. :spamafote:

_____________
(*) A moins de monter une usine à gaz qui nous ferait quitter de facto le cadre de la programmation Excel/VBA.
 

SCHMITX

Habitué
Je viens d'avoir la réponse.
Effectivement , par macro on ne peut pas. Cependant, en utilisant les mises en formes conditionnelles avec une formule, on y arrive
 

zeb

Modérateur
?
Par macro, on peut, puisque le VBA se base sur le VB. Toute l'API Windows est donc disponible. Mais je me vois mal t'expliquer comment utiliser en VB les fonction C WindowFromPoint et autres GetCursorPos, avec le passage des paramètres de VB à C, ainsi que la création d'un timer pour scruter régulièrement si le curseur est ou pas au dessus de la fenêtre Excel....

Par contre, je serais curieux de voir quelle formule tu utilises !
 

SCHMITX

Habitué
Effectivement, celà me parait compliqué pour creer cette macro :), mais curieux comme je suis j'irai rechercher certaines notions lool
Concernant le code pour les mise en formes conditionnelles, il se déclenche aussi sur le click de la souris, et non pas au passage de celle-ci sur la cellule.
Mais bon j'ai du me résigner à celà.

Après avoir défini la zone ou l'on souhaite appiliquer les régles de mise en forme, on créer 2 règles

1) La première pour indiquer toute les cellules que l'on ne souhaite pas mettre en couleur

=OU(CELLULE("ligne")<8;CELLULE("ligne")>38;CELLULE("colonne")<3;CELLULE("colonne")>8)


2) La deuxième, pour indiquer les cellules que l'on souhaite mettre en couleur

=OU(LIGNE()=CELLULE("ligne");COLONNE()=CELLULE("colonne"))
 

zeb

Modérateur
Si le montage de l'usine à gaz t'intéresse, on peut en discuter sur ce forum. Il y a juste que je te sens un peu ... bleu. Mais c'est en forgeant, qu'on devient forgeron.
 

SCHMITX

Habitué
Oui je ne peux pas nier que je suis débutant en la matière, mais bon celà ne me dérange pas d'apprendre.
Je voudrais bien en effet, en savoir davantage sur cette "usine à gaz".
Si tu peux me donner des liens ou des références afin que je puisse me documenter celà serai vraiment bien.
Merci
 

zeb

Modérateur
Meilleure réponse
Salut les ptits gars.

Aujourd'hui, je vous montre comment récupérer la cellule au dessus de laquelle le curseur de la souris se balade. Comme promis, c'est une usine à gaz !

Code:
Option Explicit
Obligatoire, sinon je m'énerve :fou:

-----------------------------​

Code:
Private Type POINTAPI
    X As Long
    Y As Long
End Type

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Excel/VBa ne sait pas le faire. Windows, si. Voici les fonctions C présentent dans la DLL %windir%\system32\user32.dll qui vont nous être utiles.

-----------------------------​

Code:
Const UneSeconde As Double = #12:00:01 AM#
Dim Boucle As Boolean
Deux variables globales. C'est laid le VB :(

Code:
Private Function WindowText(hWnd As Long) As String
    Dim s As String
    Dim l As Long
    Dim r As Long
    s = Space$(150)
    l = 149
    r = GetWindowText(hWnd, s, l)
    WindowText = Mid(s, 1, r)
End Function
Spa trivial de passer du C au VB. :o
Cette fonction ne sert à rien, sinon à voir un peu mieux ce que nous faisons. Nous nous en servirons en debug pour voir le titre des fenêtres repérées.

-----------------------------​

Code:
Private Function CelluleSurvolee() As Range
    Dim hWndMain As Long
    Dim hWndDesk As Long
    Dim hWndSheet As Long
    Dim hWndCurs As Long
    Dim r As Long
    Dim p As POINTAPI
    Dim c As Range
    
    Set CelluleSurvolee = Nothing
    
    hWndMain = FindWindow("XLMAIN", Application.Caption)
    If hWndMain = 0 Then
        Debug.Print "Je n'ai trouvé la fenêtre principale d'Excel."
        Exit Function
    End If
    Debug.Print "J'ai trouvé la fenêtre principale d'Excel : [" & hWndMain & "] '" & WindowText(hWndMain) & "'"
    
    hWndDesk = FindWindowEx(hWndMain, 0, "XLDESK", vbNullString)
    If hWndDesk = 0 Then
        Debug.Print "Je n'ai trouvé la fenêtre principale d'Excel."
        Exit Function
    End If
    Debug.Print "J'ai trouvé la fenêtre MDI d'Excel : [" & hWndDesk & "] '" & WindowText(hWndDesk) & "'"
    
    hWndSheet = FindWindowEx(hWndDesk, 0, vbNullString, ActiveWindow.Caption)
    If hWndSheet = 0 Then
        Debug.Print "Je n'ai trouvé la fenêtre active d'Excel."
        Exit Function
    End If
    Debug.Print "J'ai trouvé la fenêtre active d'Excel : [" & hWndSheet & "] '" & WindowText(hWndSheet) & "'"
    
    r = GetCursorPos(p)
    Debug.Print "La souris, par rapport à l'écran, est là : " & p.X & "x" & p.Y

    hWndCurs = WindowFromPoint(p.X, p.Y)
    Debug.Print "La fenêtre sous la souris est : [" & hWndCurs & "] '" & WindowText(hWndCurs) & "'"
    
    If hWndCurs <> hWndSheet Then
        Debug.Print "La fenêtre sous la souris n'est pas la feuille Excel."
        Exit Function
    End If
    Debug.Print "Ca tombe, bien, c'est la fenêtre qu'on cherchait à survoler"
    
    Set c = ActiveWindow.RangeFromPoint(p.X, p.Y)
    If Not (c Is Nothing) Then
        Debug.Print "Voilà la cellule survolée : " & c.Address
        Set CelluleSurvolee = c
    End If
End Function
Yeepeeeeeee! C'est dans cette fonction que l'on récupère la cellule survolée.

-----------------------------​

Code:
Private Sub Survol()
    Dim cell As Range
    
    If Not Boucle Then Exit Sub
    
    Set cell = CelluleSurvolee
    If cell Is Nothing Then Range("A1").Value = "" Else Range("A1").Value = cell.Address
    DoEvents    
    Application.OnTime Now + UneSeconde, "Survol"
End Sub
C'est là que l'on boucle et qu'on fait quelque chose de la cellule récupérée. A la fin, on réarme le timer.

-----------------------------​

Code:
Public Sub Survol_Demarre()
    Boucle = True
    Application.OnTime Now + UneSeconde, "Survol"
End Sub
C'est ici qu'on initialise le timer et la boucle. C'est parti !


-----------------------------​

Code:
Public Sub Survol_Arrete()
    Boucle = False
End Sub
Stop !

-----------------------------​

Et voilà. :sol:
Ne vous avais-je pas promis une usine à gaz ? :o
 

SCHMITX

Habitué
Effectivement je me rend compte de la complexité de la chose. Je vais donc me contenter du click sur la cellule mdrr. En revanche, cela m aspire a une autre question; peux tu m expliquer la nuance entre les diiferentes procedures private public type et les autres? Et sans vouloir chnger de sujet tu saurai ou je pourais avoir des info pour recuperer mon mot de passe oublié sur msn? Je te pose cette question au cas ou tu sois polyvalent sur la programmation
 

zeb

Modérateur
Désolé, je ne récupère pas les mots de passe MSN.
(Comment est-ce possible d'oublier son MDP ? :pfff: )
(Comment est-ce possible de récupérer un MDP ? :o )

Euh, par contre, côté polyvalence sur la programmation, je ne me plains pas. :sol:

L'élément de syntaxe Private indique que la procédure, la fonction ou la variable déclarée n'est accessible qu'à d'autres procédures ou fonctions du module dans lequel elle a été déclarée. C'est une question de .
 

SCHMITX

Habitué
Merci encore pour tes réponses
C'est un mot de passe d'une adresse que je n'ai presque pas utilisé, donc pas de gravité.. heureusement pour moi lool
En revanche si tu connais des liens qui peuven m'expliquer... mais j'en doute mdr
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 045
Membres
1 586 389
Dernier membre
ROCKET8
Partager cette page
Haut