Se connecter avec
S'enregistrer | Connectez-vous

Excel mettre en couleur la ligne et la colonne de la cellule selection

Dernière réponse : dans Programmation

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").
Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

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 !

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

-----------------------------


  1. Private Type POINTAPI
  2. X As Long
  3. Y As Long
  4. End Type
  5.  
  6. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  7. 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
  8. Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
  9. Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
  10. 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.

-----------------------------


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

  1. Private Function WindowText(hWnd As Long) As String
  2. Dim s As String
  3. Dim l As Long
  4. Dim r As Long
  5. s = Space$(150)
  6. l = 149
  7. r = GetWindowText(hWnd, s, l)
  8. WindowText = Mid(s, 1, r)
  9. 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.

-----------------------------


  1. Private Function CelluleSurvolee() As Range
  2. Dim hWndMain As Long
  3. Dim hWndDesk As Long
  4. Dim hWndSheet As Long
  5. Dim hWndCurs As Long
  6. Dim r As Long
  7. Dim p As POINTAPI
  8. Dim c As Range
  9.  
  10. Set CelluleSurvolee = Nothing
  11.  
  12. hWndMain = FindWindow("XLMAIN", Application.Caption)
  13. If hWndMain = 0 Then
  14. Debug.Print "Je n'ai trouvé la fenêtre principale d'Excel."
  15. Exit Function
  16. End If
  17. Debug.Print "J'ai trouvé la fenêtre principale d'Excel : [" & hWndMain & "] '" & WindowText(hWndMain) & "'"
  18.  
  19. hWndDesk = FindWindowEx(hWndMain, 0, "XLDESK", vbNullString)
  20. If hWndDesk = 0 Then
  21. Debug.Print "Je n'ai trouvé la fenêtre principale d'Excel."
  22. Exit Function
  23. End If
  24. Debug.Print "J'ai trouvé la fenêtre MDI d'Excel : [" & hWndDesk & "] '" & WindowText(hWndDesk) & "'"
  25.  
  26. hWndSheet = FindWindowEx(hWndDesk, 0, vbNullString, ActiveWindow.Caption)
  27. If hWndSheet = 0 Then
  28. Debug.Print "Je n'ai trouvé la fenêtre active d'Excel."
  29. Exit Function
  30. End If
  31. Debug.Print "J'ai trouvé la fenêtre active d'Excel : [" & hWndSheet & "] '" & WindowText(hWndSheet) & "'"
  32.  
  33. r = GetCursorPos(p)
  34. Debug.Print "La souris, par rapport à l'écran, est là : " & p.X & "x" & p.Y
  35.  
  36. hWndCurs = WindowFromPoint(p.X, p.Y)
  37. Debug.Print "La fenêtre sous la souris est : [" & hWndCurs & "] '" & WindowText(hWndCurs) & "'"
  38.  
  39. If hWndCurs <> hWndSheet Then
  40. Debug.Print "La fenêtre sous la souris n'est pas la feuille Excel."
  41. Exit Function
  42. End If
  43. Debug.Print "Ca tombe, bien, c'est la fenêtre qu'on cherchait à survoler"
  44.  
  45. Set c = ActiveWindow.RangeFromPoint(p.X, p.Y)
  46. If Not (c Is Nothing) Then
  47. Debug.Print "Voilà la cellule survolée : " & c.Address
  48. Set CelluleSurvolee = c
  49. End If
  50. End Function
Yeepeeeeeee! C'est dans cette fonction que l'on récupère la cellule survolée.

-----------------------------


  1. Private Sub Survol()
  2. Dim cell As Range
  3.  
  4. If Not Boucle Then Exit Sub
  5.  
  6. Set cell = CelluleSurvolee
  7. If cell Is Nothing Then Range("A1").Value = "" Else Range("A1").Value = cell.Address
  8. DoEvents
  9. Application.OnTime Now + UneSeconde, "Survol"
  10. 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.

-----------------------------


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


-----------------------------


  1. Public Sub Survol_Arrete()
  2. Boucle = False
  3. End Sub
Stop !

-----------------------------


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

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.
Expert Programmation

?
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 !

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"))
Expert Programmation

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.

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

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
Expert Programmation

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 portée.

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
Lassé par la pub ? Créez un compte