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 :

Subclassing / hooking pour déclencher événement sous Excel 64 bits


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut Subclassing / hooking pour déclencher événement sous Excel 64 bits
    Bonjour,

    Je cherche déspérement un moyen de pouvoir déclencher des évenemnts, notamment lorsque la feuille est scrollée. D'après mes recherches, celà passerait par du subclassing (voire du hooking), mais c'est encore des concepts qui me sont quelques peu étranges.

    J'ai réussi à utiliser cet exemple http://www.cpearson.com/excel/DetectScroll.htm avec ma version d'évalution d'Excel en 32 bits. Mais étant passé à la version 64 bits, cela ne fonctionne plus.

    Bien sûr, j'ai appris qu'il fallait quelque peu changer les déclarations des fonctions, mais ça ne laisse guère d'espoir car la librairie SsubTmr.6dll ne me semble compatible qu'avec Excel 32 bits.

    Est-ce que quelqu'un pourrait m'aider à ce sujet ? Dans l'idéal, je ne souhaiterais pas utiliser de .dll externe.

    Merci par avance !

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Sous-classement et/ou harponnage = dégâts assurés en cas de la moindre erreur (n'importe où dans les modules de code) ou d'interruption brutale. A éviter si tu ne maîtrises pas parfaitement tout.
    Quel est ton problème ? Décider d'une action si l'on utilise un ascenseur de la feuille ?
    Sers-toi donc de la méthode application.ontime
    Regarde ce que fait par exemple ceci en cas de déroulement vertical :
    dans un module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public anc As Integer
    Public Sub toto()
      If anc = 0 Then anc = ActiveWindow.ScrollRow
      If anc <> ActiveWindow.ScrollRow Then MsgBox "mets ici tes instructions en lieu et place de ce message"
      anc = ActiveWindow.ScrollRow
      Application.OnTime Now + TimeValue("00:00:01"), "toto"
    End Sub
    Dans un évènement (Open, par exemple) de ton choix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.OnTime Now, "toto"

  3. #3
    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
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour avec cette methode il y aura toujours des defauts au cas ou par exemple on souhaiterait avoir les coordonnées de cellules
    en effet toto peut se declencher pendant le scroll et les données sont pas bonnes

    testé!!
    avec par exemple msgbox activewindow.visiblerange.cells(1).address c'est le toto suivant qui me donne la bonne a condition que je ne soit pas en train d'utiliser l'ascenceur
    a prendre en compte

    si l'utilisateur n'utilise pas la molette mais bien le curseur de l'ascenceur j'aurais proposé la substitution de la scroll par une scroll dans un userform qui elle benificie de ses evenements(testé)

    @unparia
    n'y aurait il pas un moyen dans un do loop par exemple limité par un timer tres court apres que anc soit declaré comme different et donc avant le declanchement de ton msgbox de permettre a la sub de terminer selon l'interval du timer si on est en train de scroller ou pas ce serait pas parfait mais il y aurait moins d'erreurs

    ou

    peut etre une récursivité limité par compteur et on prendrait en compte "anc" uniquement apres que la sub ai tourné autant de fois que le compteur en récursivité

    en tous ca comme tel j'ai la bonne adresse 1 fois sur 4 a peu pres
    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

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    j'aurais proposé la substitution de la scroll par une scroll dans un userform
    Juste un rappel --->>
    pouvoir déclencher des évenemnts, notamment lorsque la feuille est scrollée

    au cas ou par exemple on souhaiterait avoir les coordonnées de cellules
    jute un autre rappel : --->>
    pouvoir déclencher des évenemnts, notamment lorsque la feuille est scrollée
    et telle est la demande (et rien d'autre)
    Si d'autres veulent autre chose -->> qu'ils ouvrent donc leur propre discussion

  5. #5
    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
    Billets dans le blog
    8
    Par défaut re
    re
    ce que j'ai voulu demontrer c'est qu'entre 2 toto il est fort possible de scroller X fois avec la molette mais seule la derniere sera prise en compte
    si le scroll doit etre detecté a chaque fois c'est rapé
    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

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    il est fort possible de scroller X fois avec la molette mais seule la derniere sera prise en compte
    Oui. Et alors ?
    Ce serait exactement la même chose avec un évènement, la seule différence étant le délai minimum (1 seconde) de application.ontime *******
    Nous allons attendre (ce sera sans aucun doute mille fois plus sage) de savoir ce que le demandeur veut faire en cas d'utilisation de l'ascenseur de la feuille, hein ...

    EDIT : ******* : j'ajoute que dans mon exemple, j'ai choisi de ne pas compliquer (si inutile selon l'action à décider) en me contentant d'un "timing" de 1 seconde. Il est toutefois possible d'augmenter (si vraiment nécessaire) énormément la fréquence de ce "timing" pour déclencher tous les centièmes de seconde (en utilisant application.Ontime). J'ai souvenir d'avoir déjà montré comment; je le redémontrerai si le demandeur souhaite vraiment une fréquence élevée, mais plus gourmande.
    J'ajoute également ceci, puisqu'allusion a été faite à l'utilisation de la molette de la souris plutôt qu'à une action normale de l'ascenseur. Une telle utilisation de la molette (avec ou sans code) ne passera de toutes manières pas forcément par chacune des cellules -->> les "sauts", sont définis par le système --->> sur MA machine, la molette saute de trois cellules en 3 cellules --> si la première ligne est par exemple la ligne 4, la molette ne permettra pas de passer la ligne 5 en tête; la moindre action de déroulement vers le bas (avec la molette) mettra directement la ligne 7 en tête.

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