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 :

Suggestion de résultat à partir des premières lettres [XL-2000]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 100
    Par défaut Suggestion de résultat à partir des premières lettres
    Bonjour,

    J'ai des listes (environ 15 entrées par liste) dans une feuille, sous la forme :

    Liste 1 :
    1 - entrée 1.1
    2 - entrée 1.2
    3 - entrée 1.3
    Liste 2 :
    1 - entrée 2.1
    2 - entrée 2.2
    etc.

    Dans une autre feuille (de saisie), je souhaite que lorsque l'utilisateur saisit le chiffre "1" par exemple (dans un champ correspondant à la liste 1), une macro lui suggère automatiquement le résultat "1 - entrée 1.1", pour qu'il n'ait plus qu'à faire "Entrée" pour valider la saisie.

    En somme, je cherche à coder une saisie semi-automatique personnalisée...

    Pour la détection des cellules modifiées, pas de pb, j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Application.Intersect(Plage_Modifiee, Range(Target.Address)) Is Nothing Then
    Je n'arrive par contre pas à trouver la fonction de suggestion automatique de résultats...

    Merci pour vos suggestions!

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Billets dans le blog
    8
    Par défaut heuh!!
    bonjour

    une idée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
     
     
    Dim lemot As String
    Dim plage As Range
     
    ' lemot=valeursaisie 'reste a toi determiner la variable soit par le intersect ou autre
     
    Set plage = Range("A1:A65000").Find(lemot, Range("A1"))

    au plaisir
    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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 100
    Par défaut heuuuuuuuuuuuuuu
    Merci pour votre réponse, mais je ne suis pas sûr que cela soit ce que je cherche...

    Voici ce que je fais pour l'instant :
    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
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    ' Déclaration des variables (plages de cellules).
    Dim Plage_Mois As Range
    ' La variable ci-dessous désigne la colonne "Mois" dans la feuille de saisie.
    Set Plage_Mois = Range("A13:A30000")
    ' Si la plage "Plage_Mois" est modifiée, le code ci-dessous s'exécute.
    If Not Application.Intersect(Plage_Mois, Range(Target.Address)) Is Nothing And Target.Count = 1 Then
        Select Case Target.Value
            Case 1
                Target.Value = Worksheets(1).Range("B13").Value
            Case 2
                Target.Value = Worksheets(1).Range("B14").Value
            Case 3
                Target.Value = Worksheets(1).Range("B15").Value
            Case 4
                Target.Value = Worksheets(1).Range("B16").Value
            Case 5
                Target.Value = Worksheets(1).Range("B17").Value
            Case 6
                Target.Value = Worksheets(1).Range("B18").Value
            Case 7
                Target.Value = Worksheets(1).Range("B19").Value
            Case 8
                Target.Value = Worksheets(1).Range("B20").Value
            Case 9
                Target.Value = Worksheets(1).Range("B21").Value
            Case 10
                Target.Value = Worksheets(1).Range("B22").Value
            Case 11
                Target.Value = Worksheets(1).Range("B23").Value
            Case 12
                Target.Value = Worksheets(1).Range("B24").Value
            Case Else
        End Select
    End If
     
    End Sub
    ... les cellules B13 à B24 comportant le nom des différents mois de l'année.

    Pour l'instant, si l'utilisateur saisit "1" puis valide, la valeur de la cellule se change en "janvier". Ce que j'aimerais, c'est que lorsqu'il saisisse "jan" par exemple, la macro lui propose "janvier", comme dans une saisie semi-automatique. Il n'aurait alors plus qu'à valider la saisie.

    Si mes différentes listes n'étaient pas statiques, j'emploirais effectivement la méthode Find pour trouver la valeur à renvoyer en fonction de ce qui est saisi par l'utilisateur...
    Mon problème réside plutôt dans la réalisation de la suggestion de résultat par saisie semi-automatique, à savoir que s'il tape "j", ça lui ramènerait "janvier", s'il tape "ju", ça lui ramènerait "juin", et "juil" lui ramènerait "juillet".

    Si qqun a la solution... D'avance merci!

  4. #4
    Membre Expert
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Par défaut
    Bonjour,
    la commande Intersect renvoie la zône commune à 2 zônes donc ne convient pas ici. Peut-être un Find conviendrait mieux

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 100
    Par défaut Méthode AutoComplete
    Bonjour,

    Pourquoi la méthode intersect ne conviendrait-elle pas ici? Je m'en sert justement pour détecter toute modification intervenue sur mes cellules, ce qui me permet de lancer automatiquement la macro à chaque modification.

    Après, je suis d'accord qu'INTERSECT ne convient pas dans le sens où la macro se lance APRES validation de la case (cad une fois que la cellule est effectivement modifiée), alors qu'il faudrait que la macro se lance AU MOMENT de la modification de la cellule, pour me permettre de lancer l'autocomplétion.

    Par contre, je ne vois pas du tout comment faire avec Find... Pouvez-vous m'éclairer davantage là-dessus?

    Merci.

  6. #6
    Membre Expert
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Par défaut
    Je propose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     Set c = Worksheets("Feuil1").Range("B13:B24").Find(Range("C13"), LookIn:=xlValues)
     If Not c Is Nothing Then If Range("C13") <> c Then Range("C13") = c
    End Sub
    Range("C13") est la cellule de saisie

  7. #7
    Membre Expert
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Par défaut
    S'il s'agit de sélectionner un mois, une liste déroulante pourrait faire l'affaire

  8. #8
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour

    Citation Envoyé par Monfy29 Voir le message
    Pour l'instant, si l'utilisateur saisit "1" puis valide, la valeur de la cellule se change en "janvier". Ce que j'aimerais, c'est que lorsqu'il saisisse "jan" par exemple, la macro lui propose "janvier", comme dans une saisie semi-automatique.
    Tu pourrais dans ton code remplacer la partie SELECT CASE par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 13 To 23
        If Worksheets(1).Range("B" & i).Value Like "*" & target.Value & "*" Then
            target.Value = Worksheets(1).Range("B" & i).Value
        End If
    Next i
    Cordialement,

    PGZ

  9. #9
    Expert éminent 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
    Par défaut
    Bonjour
    Ton code pourrait être simplifié comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    If Not Application.Intersect(Range("A13:A30000"), Target) Is Nothing And Target.Count = 1 Then
        If Target.Value >= 1 And Target.Value <= 12 Then
            Application.EnableEvents = False
            Target.Value = MonthName(Int(Target.Value))
            Application.EnableEvents = True
        End If
    End If
    End Sub
    Par contre, la saisie semi automatique dans une cellule n'est prise en charge dans l'évènement Change de la feuille, qui n'est déclenché que lorsque la valeur saisie dans la cellule est validée.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 100
    Par défaut
    @ helas : oui, mais j'ai déjà mis en place des listes déroulantes! Mon problème est que l'utilisateur se plaint du fait de devoir systématiquement passer par la liste déroulante pour saisir une donnée : il faudrait donc que la liste déroulante ET la saisie-automatique cohabitent... Je précise que mon exemple avec les mois n'est peut-être pas le mieux choisi, j'ai d'autres listes déroulantes en place avec des données plus complexes à sélectionner...

    @pgz : oui effectivement, je peux (et je vais certainement) remplacer mes "CASE" par ce que tu proposes. Cela dit, mon pb subsiste!

    @mercatog : idem, c'est une bonne idée, mais qu'en est-il de la saisie automatique?

    D'après ce que j'ai trouvé, la seule manière d'autoriser la saisie semi-auto dans une cellule avec liste déroulante, c'est de recopier l'ensemble de la liste en question au-dessus de CHAQUE cellule contenant une liste déroulante (testé, c'est vérifié).
    Je ne peux bien sûr pas me permettre de rajouter 12 lignes au-dessus de chaque ligne de saisie, même masquées : j'ai prévu 30000 lignes de saisie, x12 = 360000 lignes! Donc cette solution n'est pas envisageable.

    Peut-être arriverai-je à faire qqchose à partir de la méthode AutoComplete, mais dans ce cas, je dois également trouver comment déclencher une macro lors de la saisie dans une cellule, et non après la saisie, comme le permet "INTERSECT".

    Merci pour vos réponses.
    (Je continue de chercher)

  11. #11
    Expert éminent 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
    Par défaut
    Une usine à gaz alternative:
    tu crée un ComboBox (contrôle activeX) sur ta feuille
    Dans sa propriété ListFillRange tu affecte la plage source de donnée de ta combobox
    et avec cette gymnastique approximative
    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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, Range("A13:A3000")) Is Nothing And Target.Count = 1 Then
        With ComboBox1
            Application.ScreenUpdating = False
            .Visible = False
            If Target.Value <> "" Then
                .Value = Target.Value
                .SelStart = 0
            Else
                .ListIndex = -1
            End If
            .Left = Target.Left
            .Top = Target.Top
            .Height = Target.Height
            .Width = Target.Width
            .Visible = True
            .Activate
        End With
    Else
        ComboBox1.Visible = False
    End If
    End Sub
     
    Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
     
    If KeyCode = 9 Then 'Tabulation pour passer à la cellule en dessous
        If ComboBox1.ListIndex > -1 Then ActiveCell.Value = ComboBox1.Value
        ActiveCell.Offset(1, 0).Select
    End If
    End Sub
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    If Not Intersect(Target, Range("A13:A3000")) Is Nothing And Target.Count = 1 Then ComboBox1.Visible = False
    End Sub
    approximative

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 100
    Par défaut
    Merci d'y avoir réfléchi, Mercatog.

    Cela dit, les 3/4 du code que tu proposes sont hors de ma portée
    J'essayerai de mettre en oeuvre ta solution, et si je n'y arrive pas, j'opterai pour la suppression des listes déroulantes pour permettre une saisie semi-auto "traditionnelle" (pour palier au risque d'une saisie approximative, je mettrai des contrôles sur l'ensemble de mes cellules).

    Merci pour vos efforts et votre attention, et à bientôt!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/10/2013, 15h44
  2. trouver un nom à partir des 3 premières lettres du prénom
    Par peofofo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/08/2008, 14h17
  3. Réponses: 1
    Dernier message: 28/02/2007, 09h16
  4. Calcul à partir des résultats d'une requète
    Par Sendo dans le forum Access
    Réponses: 1
    Dernier message: 29/09/2005, 17h46
  5. Mettre la première lettre des mots en majuscule
    Par seb.49 dans le forum Langage
    Réponses: 8
    Dernier message: 23/05/2003, 14h26

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