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 :

Auto completion d'une cellule à partir d'une plage nommée


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Auto completion d'une cellule à partir d'une plage nommée
    Bonjour,

    Je souhaiterai activer l'autocomplétion lors de la saisie dans une cellule d'une feuille excel, à partir d'une liste de valeurs extérieure à la feuille (plage de cellules nommées dans une autre feuille).

    J'ai pu voir la méthode Autocomplete (sur un range) qui me permettrait de récupérer les valeurs possibles.
    Cependant, je ne vois pas comment :
    • récupérer les évènements de frappe clavier simplement,
    • afficher cette complétion dans la cellule, comme lors d'une autocomplétion "classique".

    D'avance, merci.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Bonjour p2n2k2, bienvenue sur le forum.
    En fait, la question essentielle est "Comment récupérer les événements de frappe clavier"
    Jète un oeil à la fonction GetAsyncKeyState. L'explication se trouve dans la FAQ VB6 mais il est possible de l'adapter à VBA.
    Si tu as des difficulté tu reviens, DarkVader qui connaît tout ça par coeur se fera un plaisir de t'aider
    Bonne journée

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci,

    J'ai jeté un oeil à la fonction GetAsyncKeyState qui me permet de repérer une frappe de touche, mais je ne vois toujours pas à quel évènement vb excel me raccrocher pour pouvoir utiliser cette fonction.

    J'ai essayé sur les évènements Worksheet_Change et Application_OnEntry, mais l'évènement est intercepté lors de la validation de la cellule (à la fin de ma saisie) alors que je voudrais lever l'évènement à chaque frappe.

    Si quelqu'un avait un petit exemple à me fournir...

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Pas d'exemple, désolé. En outre je n'aime pas bien utiliser GetAsyncKeyState qui ferait ce que tu demandes mais de manière aléatoire.
    (Je croyais que c'était une mauvaise utilisation de ma part mais je viens de tomber sur cette explication et ça me rassure)
    A ta place je ferais autrement même s'il n'est pas certain que ça te plaise.
    Consiste à repérer les cellules concernées.
    Dans l'événement Workbook_Selectionchange, tester les cellules sélectionnées et s'il s'agit de l'une d'elle, ouvrir un userform avec une textbox. Je sais, ça paraît n'importe quoi mais lis jusqu'au bout

    Tu testes les caractères frappés dans l'un des événements Keydown. KeyPress, KeyUp du textbox (je ne me souviens plus de celui qui va bien) pour vérifier dans ta liste de mots celui qui correspond.

    La propriété EnterKeyBehavior de la textbox doit être sur False.

    La validation du mot se faisant par la touche Entrée, l'userform est en même temps fermé dans l'événement Keyup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then Unload Me
    End Sub
    L'userform : SilkyRoad donne la solution dans la FAQ pour supprimer la croix et l'en-tête.
    Tu peux ainsi avoir un userform de la taille de la cellule, placé sur la cellule dans l'événement Workbook_Selectionchange, et tester ta liste dans un fauteuil.

    Juste une idée à défaut d'une bien meilleure qui saurait où positionner le test des touches frappées.
    Je crois bien avoir vu une solution sur le forum (sans certitude ni pour quelle application)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    J'ai vu entre temps une question du même genre, qui n'a pas eu de réponse mais qui me renvoyait sur une solution du même type que ce que tu m'as donné (avec une combobox cachée sur la feuille de calcul, et qui est repositionné sur la cellule sur un double clic)
    le topic est

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Effectivement, c'est une bonne solution. Mais pas besoin d'un double clic sur la cellule si tu places le code dans SelectionChange (les cellules concernées étant repérées)

    Edit
    Tiens, je viens de tomber là-dessus par Cafeine.
    Pas tout à fait ce que je voyais mais le principe reste le même.

    A toutes fins utiles

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Je progresse, mais c'est pas encore ça.

    J'ai ajouté un combobox que je déplace et redimensionne selon ma sélection.
    J'ai encore quelques problèmes :
    • si je fais une saisie directe sur la cellule (sans cliquer dans le combobox) ou dans la barre de formule ou en faisant F2 sur la cellule, je perds la complétion.
    • Lorsque le combobox est éditable (j'ai sélectionné la cellule et cliqué sur le combobox) la barre de formule est impossible à éditer.
    • Le copier coller de cellules marche pas...


    Si quelqu'un a des pistes (en PJ mon fichier de tests) et ci dessous mon code

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Option Explicit
    Private Sub ComboBox1_Change()
        If Left(ComboBox1.Value, 1) <> "=" Then
            Selection.Value = ComboBox1.Value
        End If
    End Sub
    Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = 13 Then
            If Left(ComboBox1.Value, 1) <> "=" Then
                Selection.Value = ComboBox1.Value
            Else
                'Gestion des formules
                Selection.FormulaLocal = ComboBox1.Value
            End If
            Me.ComboBox1.Visible = False
            ActiveSheet.Cells(Selection.Row + 1, Selection.Column).Activate
        End If
    End Sub
    Private Sub Worksheet_Selectionchange(ByVal Target As Range)
        If ActiveSheet.Name = "AutoComplete" And _
         Target.Areas.Count = 1 And Target.Rows.Count = 1 And Target.Columns.Count = 1 Then
            With Me.ComboBox1
                .Visible = True
                .Left = Target.Left
                .Top = Target.Top
                .Value = Target.Value
                .Width = Target.Width
                .Height = Target.Height
                .Value = Target.Value
            End With
        Else
            With Me.ComboBox1
                .Visible = False
            End With
        End If
    End Sub
    'Pour gérer la touche "del" sur une cellule
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Me.ComboBox1.Visible Then
            Me.ComboBox1.Value = Target.Value
        End If
    End Sub
    Pièce jointe 40886
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Filtrer une colonne à partir d'une cellule
    Par D-D-Du-06 dans le forum Excel
    Réponses: 7
    Dernier message: 21/04/2016, 11h26
  2. [XL-2003] Problème pour renommer un fichier à partir d'une variable contenu dans une cellule
    Par the-geut dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/05/2010, 11h43
  3. [XL-2007] Renvoie d'une cellule à partir d'une autre
    Par jeremiefiber dans le forum Excel
    Réponses: 2
    Dernier message: 08/05/2009, 14h19
  4. Compléter une cellule à partir d'une TextBox
    Par Le Marsu dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 31/08/2008, 22h48
  5. Lancer une macro à partir d'une cellule
    Par marc56 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/09/2007, 16h58

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