Handle d'un contrôle en VBA

Résolu
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 - 14 oct. 2008 à 06:24
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 - 15 oct. 2008 à 05:03
Bonjour tout le monde

Je souhaiterais récupérer des handle d'objets sous Excel, par exemple les contrôles d'un formulaire, ou encore les objets picture, shape, etc d'une feuille de calcul.
A la différence de VB6, seul l'objet application a une propriété hwnd sous Excel. J'ai réussi à récupérer le handle d'un UserForm par la fonction API FindWindow, mais rien de plus. Je n'ai rien trouvé sur le site et sur Internet.

Si quelqu'un peut m'aider, je le remercie par avance

Philippe

Il faut quarante-sept muscles pour froncer les sourcils et seulement treize pour sourire
 

3 réponses

cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
15 oct. 2008 à 05:03
Malheureusement, en cherchant dans d'autres forums, je viens de tomber sur une discussion d'où il ressort qu'Excel n'expose pas les handle des contrôles des formulaires.

Pour oublier tout ça, ce soir, je vais me soûler. Mais pas avec n'importe quoi, car comme disait Pierre Dac :

Les bons crus font les bonnes cuites
3
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
14 oct. 2008 à 08:12
Bonjour,


Celà m'étonneraot assez que tu puisses, sous Excel, récupérer le handle d'une ... PictureBox placée sur un formulaire !!!!... Explique ...


Sinon, la solution toute bête est de donner le focus à ton contrôle puis d'utiliser (dans la foulée) la fonction GetFocus de l'Api de Windows ... Si, à la fois, le contrôle peit recevoir le focus et est une fenêtre non "inerte" (donc dotée d'un hwnd) son handle te sera retourné.
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
14 oct. 2008 à 23:28
Bonjour jmfmarques

Merci pour cette réponse.

Voici l'explication demandée. Je prends l'exemple d'une image dans une feuille de calcul ou dans un formulaire Excel, et une référence de cette image est attribuée à une variable par une instruction telle que :

   set c = activesheet.pictures("monImage")

s'il s'agit d'un objet dans une feuille de calcul , et

   set c = userform1.image1

si l'objet est dans un formulaire Excel.


Pour obtenir des infos sur mon image, les propriétés de mon objet sont suffisantes dans beaucoup de cas, et je n'ai pas besoin du handle de l'image. Mais si, par exemple, je veux lire un pixel, mon objet ne me le permet pas. Je dois alors faire appel à la fonction GetPixel de l'API de Windows, ce qui nécessite, comme tu le sais, de récupérer le handle de l'objet, ce que je ne sais pas faire.

En VB6, il me semble que les objets ont souvent une propriété hwnd. Mais sous VBA Excel, seul l'objet application dispose cette propriété.

Concernant la fonction GetFocus() que tu me suggères, je lis sur le site MSDN :

The GetFocus function retrieves the handle to the window that has the keyboard focus, if the window is attached to the calling thread's message queue

ce qui, si je ne me trompe pas, correspond à la propriété application.hwnd de VBA Excel.

Mais l'objet de cette discussion est bien le Handle d'un contrôle, et non le Handle d'une fenêtre.

Est-ce que tu connais la solution ?

Cordialement
0
Rejoignez-nous