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 commandes "supprimer" ou insérer",


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut Intercepter les commandes "supprimer" ou insérer",
    Bonjour à tous

    J'aimerais pouvoir intercepter les commandes "supprimer" ou insérer", comme ceci (exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Application.CommandBars("barre de menu feuille de calcul").Controls("Edition").Controls("Supprimer ...") Then Exit Sub
    et/ou sur le menu contextuel, mais cela ne fonctionne pas.

    Je n'ai pas trouvé ni dans la FAQ, ni sur le forum, mais je peux ne pas être tout à fait réveillé....

    Un petit coup de pouce SVP

    Merci d'avance

    Eric

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    intercepter le changement d'une ligne entière ou colonne entière (l'insertion et la suppression en font partie)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Rows.Count = Rows.Count Or Target.Columns.Count = Columns.Count Then MsgBox "kuku"
    End Sub

  3. #3
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut
    Bonsoir à tous
    Bonsoir mercatog

    Merci pour ta réponse.

    C'est ce que je faisais jusqu'à présent, mais c'est un petit peu détourner le problème et par la même ma question.

    J'aimerais quelque chose de plus standard, qui soit valable pour toutes les commandes.

    Merci encore

    Eric

  4. #4
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Hello,

    Exemple pour désactiver la commande "Supprimer"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CommandBars(1).Controls("Edition").Controls("Supprimer...").Enabled = False
    CommandBars("cell").Controls("Supprimer...").Enabled = False
    Application.OnKey "{Delete}", ""
    Sans oublier de la réactiver...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CommandBars(1).Controls("Edition").Controls("Supprimer...").Enabled = True
    CommandBars("cell").Controls("Supprimer...").Enabled = True
    Application.OnKey "{Delete}"

  5. #5
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut
    Bonjour à tous
    Bonjour mercatog, fring

    Merci fring, cela apporte de l'eau à mon moulin, mais ne répond pas "exactement" à ma question.

    Dans la même veine, on pourrait aussi mettre "visible=False", mais je ne veux pas interdire, seulement intercepter.

    Eric

  6. #6
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Un truc de ce style ?

    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
    Sub modif_cde()
        'modifier la commande "Supprimer" du menu contextuel
        CommandBars("cell").Controls("Supprimer...").OnAction = "zouzou"
        'modifier la commande "Supprimer" du menu "Edition"
        CommandBars(1).Controls("Edition").Controls("Supprimer...").OnAction = "zouzou"
        'modifier la commande "Supprimer" du clavier
        Application.OnKey "{Delete}", "zouzou"
    End Sub
     
    Sub reset_cde()
        'reset des commandes d'origine
        CommandBars("cell").reset
        CommandBars(1).reset
        Application.OnKey "{Delete}"
    End Sub
     
    Sub zouzou()
        'interception des commandes
        MsgBox "COMMANDE PERSONNALISEE"
    End Sub

  7. #7
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut
    Bonsoir à tous
    Bonsoir fring

    Merci fring

    Ta solution me fait avancer à grands pas, mais elle supprime l'action de la commande, ce que je ne voudrais pas. Mon but est d'intercepter sans supprimer l'action.

    Je tourne autour avec ta proposition, je sens que je ne suis pas loin.

    Sur Google, j'ai lu des sujets sur les CommandBarControls, mais je ne m'y connais pas assez en VBA pour adapter, pourtant je pense qu'il y a une réponse à ma question.

    A ce jour je vais continuer sur la proposition de Mercatog que j'avais déjà adoptée.

    Je laisse le sujet "ouvert" encore un moment, j'ai de l'espoir .....

    Merci encore

    Eric

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    389
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 389
    Points : 437
    Points
    437
    Par défaut
    Bonjour,

    Je n'ai jamais utilisé mais la propriété ActionControl ne pourait-elle pas aider?

  9. #9
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut
    Bonsoir à tous, et Merci

    Avec un peu de retard, mais je ne pouvais pas répondre sans avoir essayé.

    J'ai effectué 2 tests. Le 1er, en complément du code de fring, dans "zouzou" :
    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
    Sub modif_cde()
    CommandBars("cell").Controls("Supprimer...").OnAction = "zouzou"
    CommandBars(1).Controls("Format").Controls("Supprimer...").OnAction = "zouzou"
    Application.OnKey "{Delete}", "zouzou"
    End Sub
     
    Sub reset_cde()
    'reset des commandes d'origine
    CommandBars("cell").Reset
    CommandBars(1).Reset
    Application.OnKey "{Delete}"
    End Sub
     
    Sub zouzou()
     
    If CommandBars.ActionControl.ID = "478" Then MsgBox "oui"
     
    MsgBox "COMMANDE PERSONNALISEE"
     
    End Sub
    on récupère bien l'ID, mais la commande "effacer" n'est plus effectuée.

    Le 2ème test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Application.CommandBars.ActionControl.ID = "478" Then MsgBox "oui"
    End Sub
    là, la fenêtre :
    "Erreur d'exécution '91':
    Variable objet ou variable de bloc With non définie" apparaît.

    "478" est l'ID de : CommandBars(1).Controls("Format").Controls("Supprimer...").OnAction

    "ActionControl" me paraît une bonne piste, mais je ne sais pas m'en servir.

    Si une bonne âme pouvait me mettre sur la voie.

    Merci à vous trois, et merci d'avance pour la/les prochaine réponse

    Eric

  10. #10
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Tu sais te servir de "ActionControl"
    La bonne utilisation est celle dans ton premier test.

    Pour intercepter une commande, tu n'as pas d'autre choix que de détourner cette commande vers une macro dans laquelle tu indiques ce qu'il doit se produire lorsqu'on clique sur la commande. Rien ne t'empêche dans cette macro d'ajouter, après l'interception, quelques lignes de code pour exécuter ce que cette commande est censée faire.

    Lorsqu'on clique sur "Supprimer..." il y a un menu qui s'ouvre avec différents choix de suppressions possibles et là mes connaissances ne me permettent pas d'intercepter ce menu (en supposant que c'est réalisable...).
    Sans oublier que par exemple la commande "Supprimer ligne" peut être exécutée depuis le menu "Edition", depuis le menu contextuel et depuis le bouton de commande que l'on peut insérer dans n'importe quel menu...

    Perso j'arrêterais de tourner en rond et je ferais la chose suivante, puisque tu veux personnaliser certaines commandes, désactive les commandes originales et crée une barre de menu personnalisée à partir de laquelle tu pourras faire ce que tu veux.

  11. #11
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut
    Bonjour à tous

    Citation Envoyé par fring Voir le message
    ...
    Pour intercepter une commande, tu n'as pas d'autre choix que de détourner cette commande vers une macro dans laquelle tu indiques ce qu'il doit se produire lorsqu'on clique sur la commande. Rien ne t'empêche dans cette macro d'ajouter, après l'interception, quelques lignes de code pour exécuter ce que cette commande est censée faire.
    ...
    pas facile d'accepter !!!! si j'en suis réduit à cela, et bien soit pour l'instant je garde ma première solution et donc celle de mercatog, soit je me fais une barre menu perso.

    Pour ce fichier, j'ai opté pour le code tout simple (1ère solution), et ne réagit qu'aux "supprimer" lignes ou colonnes. Pour le menu perso, ce sera pour une autre fois.

    Merci à vous

    Eric

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

Discussions similaires

  1. Intercepter les resultats d'une commande
    Par b_reda31 dans le forum C++Builder
    Réponses: 1
    Dernier message: 06/10/2010, 09h19
  2. Commande pour supprimer les cookies
    Par tiptop4 dans le forum Administration
    Réponses: 11
    Dernier message: 19/09/2008, 20h31
  3. Intercepter les erreurs d'une commande ?
    Par Olivier Regnier dans le forum Linux
    Réponses: 2
    Dernier message: 01/12/2006, 12h28
  4. Réponses: 6
    Dernier message: 08/08/2006, 09h14

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