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 :

Intercepter les click dans un XLA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Mai 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 104
    Par défaut Intercepter les click dans un XLA
    Bonjour,

    Avant de poser ma question, je vous brosse le contexte :
    Je développe et maintiens un certain nombre de tableaux sous Excel 2003, et à force de recycler les mêmes bouts de code, j'ai décidé de devenir intelligent et d'en mettre un max dans un fichier XLA.
    J'utilise un onglet, disons $param dans chaque classeur, je le teste pour savoir si c'est un "bon" tableau, je récupère le paramétrage et le tour est joué.
    Avec ça je peux traiter des imports, exports, manipulations sur des onglets protégés comme le tri, le filtre automatique, l'insertion et la supression "propres", l'insertion d'infobulles etc.
    Les fonctions sont accessibles via menu et/ou barre d'outil, ça roule, et tout ça sans une ligne de code dans le tableau automatisé. Distribution, maintance simplifiés, c'est le pied.
    Sauf que pour certaines fonctions j'avais pris l'habitude d'utiliser le click droit+menu contextuel ou le double-clic. Au point de vue ergonomie, c'est quand même plus sympa que d'avoir à remonter sur l'entête chercher le bon bouton.
    Ça m'obligerait à redescendre même un minimum de code dans les classeurs ; je vois à peu près comment l'automatiser mais ça n'est pas drôle.

    Voici donc la question :

    En fait je me demandais si avec une DLL ou quelquechose du genre on ne pourrait pas intercepter l'événement Windows (click-droit, double-click) de façon à le traiter dans le XLA.
    Si l'activeworkbook est un "bon" tableau, je traite l'événement (et donc je l'intercepte définitivement comme un cancel = true) sinon je le laisse passer et il sera traité "normalement" par le classeur (éventuellement par une maccro locale).

    Quelqu'un a déjà fait ou vu ca ? Ou a une idée de comment il faut faire ?

    Merci d'avance.
    Bevan.

  2. #2
    Membre émérite
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Par défaut
    bonjour
    Peux tu laisser dans tes classeurs le code suivant
    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
    Option Explicit
     
    Private Sub Workbook_Activate()
    Application.Run "'Macro_Complémentaire.xlam'!Ouverture"
    End Sub
     
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.Run "'Macro_Complémentaire.xlam.xls'!Fermeture"
    End Sub
     
    Private Sub Workbook_Deactivate()
    Application.Run "'Macro_Complémentaire.xlam.xls'!Fermeture"
    End Sub
     
    Private Sub Workbook_Open()
    Application.Run "'Macro_Complémentaire.xlam.xls'!Ouverture"
    End Sub
    et dans ta macro complémentaire, les codes d'Ouverture et Fermeture.
    Par exemple
    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
    Public Const strMenu As String = "Macro &Fred65200"
    Sub MaMacro()
    MsgBox "test"
    End Sub
    Sub Ouverture()
    'Ajout d'une ligne dans le menu contextuel en 3ème position
    Fermeture
    With CommandBars("Cell")
      Set NewCtrl = .Controls.Add(Type:=1, ID:=1, before:=3)
      With NewCtrl
        .Caption = strMenu
        .OnAction = "MaMacro"
        .FaceId = 85
      End With
    End With
     
    End Sub
    Sub Fermeture()
    'Suppression de la ligne
    On Error Resume Next
     CommandBars("Cell").Controls(strMenu).Delete
    On Error GoTo 0
    End Sub
    @+

  3. #3
    Membre éprouvé
    Inscrit en
    Mai 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 104
    Par défaut
    Bonsoir,

    fred65200, merci de ta réponse rapide.

    Mais en plus mes menus contextuels sont vraiment contextuels (je détourne les styles Excel pour savoir où je suis et en fonction de ça faire ce que j'ai à faire) donc c'est un peu plus compliqué...

    Si je dois laisser du code dans les classeurs se sera plutôt qqchose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    Application.Run "'MonXla.xla'!DoubleClick", target, Cancel
    End Sub
     
    Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    Application.Run "'MonXla.xla'ClickDroit", target, Cancel
    End Sub
    Avec coté MonXla :

    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
    Sub DoubleClick(Target as range, Cancel as boolean)
    Dim MonAction as String
    MonAction = GetParametre(target.cells(1).style)
    select case MonAction
       Case Dummy ' Pas trouvé
       Case "Action1"
            Action1
            Cancel = true
       Case "Action2"
            Action2
            Cancel = true
       Case "Action3"
            Action3
            Cancel = true
       Case else
            ActionDefaut
            Cancel = true
    End select
    End Sub
    Avec GetParametre qui va attaquer la feuille Param du classeur actif et regarder qu'est-ce qui est associé donc au style de la cellule courante. Action1 etc peuvent attaquer les menu contextuels ou autrechose.

    Mais ma question est bien : y a-t-il moyen de s'en passer complétement. Ok, c'est plus pour la beauté du geste (je trouve ça bluffant d'automatiser à 100% un classeur sans qu'il y ait une ligne de macro dedans...) que par pure nécessité, mais quand même !

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Par défaut
    bonjour


    Tu peux placer ces procédures dans le module objet ThisWorkbook de ton classeur xla.
    Le code affiche le nom de tous les classeurs qui sont ouverts, après que le complément soit lancé, et ensuite identifie les evenements RighClick et DoubleClick dans ces classeurs :



    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
    Option Explicit
     
    Public WithEvents XL As Excel.Application
     
     
    Private Sub Workbook_Open()
      Set XL = Excel.Application
    End Sub
     
     
    Private Sub XL_WorkbookOpen(ByVal Wb As Workbook)
        'Affiche le nom du nouveau classeur ouvert
        If Wb.Name <> ThisWorkbook.Name Then MsgBox Wb.Name
    End Sub
     
     
    Private Sub XL_SheetBeforeDoubleClick(ByVal Sh As Object, _
        ByVal Target As Range, Cancel As Boolean)
     
        'Identifie le double clic
        MsgBox Sh.Parent.Name & vbCrLf & Sh.Name & vbCrLf & Target.Address
    End Sub
     
     
    Private Sub XL_SheetBeforeRightClick(ByVal Sh As Object, _
        ByVal Target As Range, Cancel As Boolean)
     
        'Identifie le clic droit
        MsgBox Sh.Parent.Name & vbCrLf & Sh.Name & vbCrLf & Target.Address
    End Sub



    http://excel.developpez.com/faq/?pag...eTousClasseurs




    bonne journée
    michel

  5. #5
    Membre émérite
    Avatar de fred65200
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    901
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 901
    Par défaut
    Bonjour Michel et merci
    Je cherchais en vain une solution.
    Je garde ce code sur mes tablettes.
    fred

  6. #6
    Membre éprouvé
    Inscrit en
    Mai 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 104
    Par défaut
    Bonjour,
    alors là, je suis partagé entre la honte et l'admiration tellement c'est simple.

    Ça marche du feu de Dieu, c'est exactement ce que je cherchais !
    Merci Michel.
    Derechef :

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer les clicks dans une Iframe
    Par zooffy dans le forum Général JavaScript
    Réponses: 23
    Dernier message: 30/03/2011, 16h27
  2. Intercepter les erreurs dans un vbs
    Par fleurparis dans le forum VBScript
    Réponses: 1
    Dernier message: 17/10/2010, 22h50
  3. Intercepter les objets dans un client WCF
    Par anthyme dans le forum Windows Communication Foundation
    Réponses: 10
    Dernier message: 21/07/2010, 09h03
  4. Intercepter les clicks de la souris
    Par lvr dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 24/09/2009, 17h51
  5. [SimpleXML] Intercepter les warning dans simplexml_load_file
    Par lenwil dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 24/01/2008, 14h42

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