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 :

Distinguer sélection de cellule et de bouton [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut Distinguer sélection de cellule et de bouton
    Bonjour,
    Je développe une petite application de résolution automatique de sudoku.
    Pour cela, à chaque entrée de valeur dans une case de la grille, le programme annule automatiquement toutes les valeurs qui ne sont plus envisageables dans les autres cases, à partir de l'évènement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Worksheet_Change(ByVal Selection As Range)
    Après un certain temps de mise au point il fonctionne.
    Une fois la grille résolue je souhaite la remettre à zéro par un bouton (intitulé RAZ) associé à une macro. C'est là que je rencontre mon problème. En effet je fais quelques tests sur la sélection tels que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Test du nombre de cellules sélectionnées
    If Selection.Count > 1 Then
           MsgBox "Erreur de sélection"
           Exit Sub
           End If
    Ce message d'erreur est systématiquement affiché quand je sélectionne le bouton. C'est ce que je voudrais éviter.

    L'évènement est placé dans la feuille, la macro associée au bouton dans un module

    Comment, dans le contenu du programme de cet évènement, au départ, distinguer la sélection d'une cellule de la sélection du bouton RAZ ?

    Y a-t-il une instruction du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Test du bouton RAZ
    If Selection.Bouton Then Exit Sub
    qui permettrait de détecter la sélection du bouton et de sortir de l'évènement ?

    Merci

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Un bouton placé sur une feuille, est soit un bouton Formulaire, soit un bouton ActiveX.
    Un bouton formulaire lance une procédure lorsque l'on clique dessus (à condition bien entendu qu'on le lui ait associé)
    Quant au bouton ActiveX, il a ses propres événements comme par exemple Private Sub CommandButton1_Click(). Il suffit donc de lancer l'effacement par la méthode ClearContents de l'objet Range dans cette procédure événementielle
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre confirmé Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    Le bouton est un bouton Formulaire qui active l'évènement Worksheet_Change qui, lui-même, envoie un msgbox "Erreur de sélection" lors du test Selection.Count. C'est ce que je veux éviter.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pourquoi utiliser un bouton pour activer une procédure événementielle ?

    Exemple
    Suivant l'illustration ci-dessous, il y a dans la feuille
    • Une plage de cellules (plage B3:E7)) nommée maGrille (Attention de portée : Feuille)
    • Un bouton ActiveX nommé cmdDeleteValue qui sert à effacer les valeurs de la plage maGrille
    • Dans le module de cette feuille deux procédures événementielle dans la feuille où se trouve une grille (plage B3:E7) et nommée maGrille (Attention de portée : Feuille)

    Lorsque l'on sélectionne l'une des cellules de la plage maGrille, la valeur de celle-ci prend comme Valeur un X si elle est vide et s'efface si c'est l'inverse

    Les procédures
    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
     
    Const rngName As String = "maGrille"
     
    Private Sub cmdDeleteValue_Click()
      Range(rngName).ClearContents
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      If Not Intersect(Range(rngName), Target) Is Nothing Then
         With Target
          If .Count = 1 Then
          .Value = IIf(.Value = "X", "", "X")
          End If
         End With
      End If
    End Sub
    Illustration
    Nom : 211229 dvp Raz Grille.png
Affichages : 76
Taille : 5,8 Ko
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre confirmé Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Par défaut
    Effectivement, je pourrais utiliser un bouton ActiveX, j'ai utilisé un bouton de formulaire par habitude.

    Si j'ai bien compris la méthode utilisée, il s'agit de comparer la plage de cellules générée par l'action sur le bouton et celle de la grille pour obtenir l'effet recherché.

    Est-ce bien cela ?

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Effectivement, je pourrais utiliser un bouton ActiveX, j'ai utilisé un bouton de formulaire par habitude.
    J'aurais pu également utiliser un bouton formulaire qui aurait pointé sur une procédure placée alors dans un module Standard avec comme seule action d'effacer la grille.

    Cependant pour aller plus vite et utiliser l'objet Range pour la plage nommée, j'ai utilisé un nom de portée feuille et ainsi l'instruction Range("maGrille") pouvait être utilisée au sein du module de la feuille où la grille et le bouton ActiveX se trouvaient.

    Si j'ai bien compris la méthode utilisée, il s'agit de comparer la plage de cellules générée par l'action sur le bouton et celle de la grille pour obtenir l'effet recherché.
    Non. Il y a deux procédures événementielles.
    • cmdDeleteValue_Click intercepte le clic sur le bouton nommé cmdDeleteValue et efface les valeur de la plage nommée maGrille à l'aide de l'instruction Range(rngName).ClearContents
    • Worksheet_SelectionChange intercepte la sélection d'une cellule, vérifie que c'est bien dans les cellules de la plage nommée maGrille que la sélection a eu lieu (If Not Intersect(Range(rngName), Target) Is Nothing) Then et que la sélection est faite sur une seule cellule (If .Count = 1 Then) et met un X ou l'efface (.Value = IIf(.Value = "X", "", "X"))

    Je vous conseille la lecture de ces deux tutoriels
    Fichiers attachés Fichiers attachés
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

Discussions similaires

  1. [VBA] Trouver l'adresse de la cellule sous le bouton
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/02/2006, 22h53
  2. [C#]Comment forcer la sélection d'un noeud avec bouton droit
    Par irnbru dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/11/2005, 19h39
  3. automation Excel: sélection de cellule
    Par jarod_bx dans le forum Access
    Réponses: 3
    Dernier message: 03/11/2005, 15h33
  4. [VBA]Sélection de cellules
    Par joseph1 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/10/2005, 18h08
  5. [JTable] Cellule avec deux boutons
    Par cherbox dans le forum Composants
    Réponses: 3
    Dernier message: 12/08/2004, 17h26

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