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 :

bloquer la saisie dans combobox si non occurence sans effacer la partie bonne de la chaine tapée


Sujet :

Macros et VBA Excel

  1. #1
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut bloquer la saisie dans combobox si non occurence sans effacer la partie bonne de la chaine tapée
    bonjours a tous

    je cherche le moyen de gerer (bloquer )la saisie dans le . value d'une combobox sans pour autant effacer (et/ou) revenir la partie bonne de la saisie

    pour ca j'ai reussi mais j'ai un autre soucis
    quand bloquage est fait ou correction avec la touche BACK pour revenir a une partie valide il n'y a pas re selection

    je ne sais pas si ca sera possible
    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
    Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Static mem As Long
          With ComboBox1
            If KeyCode = 8 Then mem = mem - IIf(mem > 0, 1, 0): .Value = Left(.Value, mem) Else mem = mem + 1   'gestion de la touche back
            If KeyCode <> 8 And KeyCode <> 46 And .ListIndex = -1 Then
                mem = mem - IIf(mem > 0, 1, 0)
                 .Value = Left(.Value, mem) 'gestion de la validité de la chaine tapée
                 End If
            If KeyCode = 46 Then mem = 0: .Value = ""
            TextBox1 = Left(.Value, mem)
             .DropDown
        End With
    End Sub
    '
    '
    Private Sub UserForm_Activate()
        Me.ComboBox1.List = Array("pomme", "banane", "ananas", "poire", "raisin", "tomate", "jambon", "cerise")
    End Sub
    des idées ?
    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

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut.

    Pourquoi ne pas se contenter de ce que les contrôles proposent comme ergonomie? Tenter de gérer la saisie à coup d'évènement KeyUp est pour moi une ineptie technique dans la majorité des cas.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonsoir,

    -On affiche dans le ComboBox tous les items commençant par les caractères frappés.
    -Si on frappe un caractère et qu'il n'y a plus d'items associés dans le ComboBox, le caractère frappé est effacé.

    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
    Option Compare Text
    Dim Tbl()
    Private Sub UserForm_Initialize()
      Set f = Sheets("BD")
      Tbl = f.Range("A2:A" & f.[A65000].End(xlUp).Row).Value
      Me.ComboBox1.List = Tbl
    End Sub
     
    Private Sub ComboBox1_Change()
      Set d1 = CreateObject("Scripting.Dictionary")
      tmp = UCase(Me.ComboBox1) & "*"
      For Each c In Tbl
        If c Like tmp Then d1(c) = ""
      Next c
      If d1.Count > 0 Then
         Me.ComboBox1.List = d1.keys
         Me.ComboBox1.DropDown
      Else
         beep
         Me.ComboBox1 = Left(Me.ComboBox1, Len(Me.ComboBox1) - 1)    ' efface le caractère frappé
      End If
    End Sub
     
    Private Sub ComboBox1_Click()
      ActiveCell = Me.ComboBox1
      Unload Me
    End Sub
     
    'MatchEntry : None
    Boisgontier

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    oui pas mal sauf que si le dernier caractere n'est pas bon on revient pas a la liste complete
    j'avais deja fouiller dans tes listes intuitives et en plus il n'y a pas re selection

    je tape t tu tout les t
    tu ajoute otu a tout les to
    avec ces 2 lettres je n'ai deja pas d'autoselection
    j'ajoute u il n'y en a pas je reviens a to toujours pas d'autoselection
    cela dit ca me donne une idée
    merci boisgontierjacques pour le retour
    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

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    -En appuyant sur flèche bas, on a le premier
    -En frappant TOG, il n'en reste qu'un et on obtient TOGO (auto-sélection)

    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
     
    Option Compare Text
    Dim Tbl()
    Private Sub UserForm_Initialize()
      Set f = Sheets("BD")
      Tbl = f.Range("A2:A" & f.[A65000].End(xlUp).Row).Value
      Me.ComboBox1.List = Tbl
    End Sub
     
    Private Sub ComboBox1_Change()
      Set d1 = CreateObject("Scripting.Dictionary")
      tmp = UCase(Me.ComboBox1) & "*"
      For Each c In Tbl
        If c Like tmp Then d1(c) = ""
      Next c
      If d1.Count = 1 Then
          ActiveCell = d1.keys    ' AUTO-SELECTION
          Unload Me
      Else
        If d1.Count > 0 Then
           Me.ComboBox1.List = d1.keys
           Me.ComboBox1.DropDown
        Else
           beep
           Me.ComboBox1 = Left(Me.ComboBox1, Len(Me.ComboBox1) - 1)
        End If
      End If
    End Sub
     
    Private Sub ComboBox1_Click()
      ActiveCell = Me.ComboBox1
      Unload Me
    End Sub

    Boisgontier

  6. #6
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonsoir,

    Ce sera ma seule intervention ici.
    J'ai décrit, dans une discussion récente, les moyens de parvenir à ces fins.
    J'ai également dit, dans cette même discussion, qu'il convenait d'utiliser le bon contrôle selon le résultat attendu. Je n'ai pas souhaité développer cet aspect parce que ça ne répondait pas directement à la question.
    Savez-vous comment forcer l'utilisateur à faire, systématiquement, sans faille, sans code, sans aucun ajout, un choix dans une liste de données?
    Simplement en utilisant un contrôle ListBox.
    C'est le seul choix que déciderait un développeur.
    Après, pour rejoindre Jacques, il est encore plus simple de coupler cette ListBox avec un TextBox pour obtenir une saisie intuitive.
    Sur ce messieurs, a++
    Cordialement,
    Franck

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    J'ai décrit, dans une discussion récente, les moyens de parvenir à ces fins.
    non pijaku tu a simplement decrit une procedure visant a bloquer la saisie tout court
    avec ta version la touche esc est requise et efface donc la saisie complete ca n'est donc pas la meme chose
    ca n'enleve rien a ton travail mais ca n'est pas ce que je veux si tant est que cela soit possible
    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

  8. #8
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Patrick,
    J'avais pourtant bien dit une seule intervention, mais...

    Réagit, en VBA, comme dans la vraie vie...
    On te dit que, pour construire telle chose, tu peux utiliser tel outil, en le modifiant de telle façon...
    Tu connais ton métier, et tu sais qu' un autre outil sera adapté parfaitement à la demande de ton client.
    En tant que professionnel, quel est ton rôle?
    Informer ton client qu'il dispose d'une solution simple, efficace, ou de lui dire que tu vas tout chambouler pour trouver un truc qui lui correspond mais n'est pas top...
    Cordialement,
    Franck

  9. #9
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Cf PJ

    Quand il n'en reste qu'un dans la liste du ComboBox, il est automatiquement sélectionné.

    -FR sélectionne FRANCE
    -TOG sélectionne TOGO


    Boisgontier

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    ca me parait bon cette fois ci ,c'est pas tout a fait ce que je voulais mais on est tres proche
    je vais voir si il y a bien selection (en bleu) la je vois pas ,le userform se ferme a occurence trouvée et injecte dans cellule
    ce que je voulais
    je tape t j'ai le premier t SELECTIONNE
    je tape to jai le premier to SELECTIONNE
    si je tape tou j'en ai pas je reviens a to et le premier to SELECTIONNE
    mais je pense que ce que je veux n'est pas possible
    obligé de passer par un textbox de substitution qui est en dehors du combobox

    merci pour le retour
    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

  11. #11
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Je ne vois pas la différence fonctionnelle entre les versions TextBox/ListBox et ComboBox.

    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
    Option Compare Text
    Dim Tbl()
    Private Sub UserForm_Initialize()
      Set f = Sheets("BD")
      Tbl = f.Range("A2:A" & f.[A65000].End(xlUp).Row).Value
      Me.ListBox1.List = Tbl
    End Sub
     
    Private Sub TextBox1_Change()
      Set d1 = CreateObject("Scripting.Dictionary")
      tmp = UCase(Me.TextBox1) & "*"
      For Each c In Tbl
        If c Like tmp Then d1(c) = ""
      Next c
      If d1.Count > 0 Then
         Me.ListBox1.List = d1.keys
       Else
         beep
         Me.TextBox1 = Left(Me.TextBox1, Len(Me.TextBox1) - 1)
       End If
    End Sub
     
    Private Sub ListBox1_Click()
      ActiveCell = Me.ListBox1
      Unload Me
    End Sub
    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
    Option Compare Text
    Dim Tbl()
    Private Sub UserForm_Initialize()
      Set f = Sheets("BD")
      Tbl = f.Range("A2:A" & f.[A65000].End(xlUp).Row).Value
      Me.ComboBox1.List = Tbl
    End Sub
     
    Private Sub ComboBox1_Change()
      Set d1 = CreateObject("Scripting.Dictionary")
      tmp = UCase(Me.ComboBox1) & "*"
      For Each c In Tbl
        If c Like tmp Then d1(c) = ""
      Next c
      If d1.Count > 0 Then
         Me.ComboBox1.List = d1.keys
         Me.ComboBox1.DropDown
       Else
         beep
         Me.ComboBox1 = Left(Me.ComboBox1, Len(Me.ComboBox1) - 1)
       End If
    End Sub
     
    Private Sub ComboBox1_Click()
      ActiveCell = Me.ComboBox1
      Unload Me
    End Sub
    Boisgontier

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour boisgontierjacques

    oui j'ai essayé quelque chose de simple ce matin et je crois vraiment que c'est pas possible
    meme le retour a index -1 par le textbox ne fonctionne pas correctement (testé)
    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

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    pour etre precis voila le comportement ideal que je voudrais que la combobx ai

    de cette maniere le textbox fait exactement ce que je souhaiterais faire avec la combobox toute seule
    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
    Private Sub TextBox1_Change()
        With ComboBox1
            i = -1
            If TextBox1 = "" Then
                i = -1
            Else
                i = -1
    re:
                Do: i = i + 1: Loop Until .List(i) Like TextBox1.Text & "*" Or i = .ListCount - 1
                If i = .ListCount - 1 And Not .List(i) Like TextBox1 & "*" Then i = -1: TextBox1 = Left(TextBox1, Len(TextBox1) - 1): GoTo re
            End If
            .ListIndex = i
            .DropDown
        End With
    End Sub
    '
    '
    Private Sub UserForm_Activate()
        ComboBox1.List = Array("pomme", "cerise", "melon", "orange", "citrouile", "poire", "mangue", "fraise", "celleri", "citron", "bannane")
    End Sub
    c'est le goto re qui refait la selection apres correction pas le choix
    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

Discussions similaires

  1. [Débutant] Bloquer la saisie dans un combobox
    Par JetLibre dans le forum VB.NET
    Réponses: 2
    Dernier message: 05/02/2014, 10h12
  2. [XL-2007] Controle de saisie dans combobox
    Par Gestionnaire_rh dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 17/04/2011, 15h33
  3. Réponses: 1
    Dernier message: 08/08/2008, 17h16
  4. pre-saisie dans combobox ou textbox
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/03/2008, 18h21
  5. Bloquer la saisie dans les champs
    Par zorba49 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/02/2006, 16h07

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