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 :

Bascule entre Find exact et Find approximatif


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de Scoubi7
    Profil pro
    Inscrit en
    Août 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 172
    Par défaut Bascule entre Find exact et Find approximatif
    Bonjour,

    J'ai une combobox :

    quand je clique sur une proposition de la liste de cette combobox, je souhaiterais qu'une recherche "xlwhole" se fasse ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set F = .Find(ComboBoxSté, LookIn:=xlValues, Lookat:=xlWhole)
    et quand je tape du texte dans cette combobox, je souhaiterais qu'une recherche non "xlwhole" se fasse ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set F = .Find(ComboBoxSté, LookIn:=xlValues)
    Comment puis-je faire cela via un appel de procédure ?


    Du 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
    Sub ComboBoxSté_Click()
        ChoixSur=True
        Call Localisation("xlWhole")
    End Sub
     
    Sub ComboBoxSté_LostFocus()
        If ChoixSur <> True Then Call Localisation
    End Sub
     
    Sub Localisation(Choix As String)
        Application.ScreenUpdating = True
        If Len(ComboBoxSté) > 2 Then
            With Worksheets("Sociétés").Range("B3:B300")
                Set F = .Find(ComboBoxSté, LookIn:=xlValues, Lookat:=)
                If Not F Is Nothing Then
                ...

  2. #2
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour,

    Il va nous manquer quelques informations pour répondre correctement à votre besoin : en effet, l'événement 'Change' de cotre combobox va être déclenché à chaque frappe de touche.
    Souhaitez-vous que la recherche s'effectue à chaque changement ou uniquement lorsque l'utilisateur valide sa saisie ?

    Autre question : quel comportement est attendu lorsque l'utilisateur vide la combobox ?

    Cdt

    EDIT : ce ne sera pas forcément l'événement 'Change' qui sera utilisé, mais il vaudra quand même connaître le comportement attendu pour vous aiguiller.
    Si vous souhaitez juste savoir quand le choix de l'utilisateur est dans la liste initiale ou non, utilisez la propriété 'ListIndex' de la combobox.
    Cette propriété vaudra -1 si la valeur est définie par l'utilisateur, et elle vaudra 0 ou plus si la valeur de la combobox appartient à la liste initiale.

  3. #3
    Membre confirmé Avatar de Scoubi7
    Profil pro
    Inscrit en
    Août 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 172
    Par défaut
    Les deux c'est pour ça que je veux les deux type de recherche :
    La xlWhole quand je clique dans la liste
    Et l'autre quand la recherche se fait en cours de frappe

    Et c'est pour ça que la recherche avec xlWhole se lance avec la fonction click et l'autre avec la fonction LostFocus (et rien avec Change comme montré dans le sujet)

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Avant ton Find, vérifie si ta valeur se trouve dans la liste source de ta combobox.
    Tu mets une variable booléenne à False et avec une boucle For To et un test If, tu vérifies si ta valeur est dans la liste source de ta combobox.
    Si tu trouves une correspondance, tu passes ta variable booléenne à True.

    Ensuite, il te suffit d'un simple IIf avec cette variable en premier paramètre pour renvoyer xlWhole ou xlPart.
    https://docs.microsoft.com/fr-fr/off...p/iif-function

    Un petit détail à ce sujet : un Find "non xlwhole", ça n'existe pas. Si tu ne précises pas xlWhole ou xlPart, ton Find va utiliser le dernier choix que tu as fait dans la commande Rechercher. Donc, si tu ne mets pas xlPart, tu joues à pile-ou-face.

  5. #5
    Membre confirmé Avatar de Scoubi7
    Profil pro
    Inscrit en
    Août 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 172
    Par défaut
    Ok je teste ça demain

    Si xlPart est la valeur par défaut de la fonction Find, c'est bien celle-la que j'appelais non xlWhole

  6. #6
    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 re
    re
    tu a plusieurs evenement dispo pour ta combo ma fois sert toi en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub ComboBox1_Click()
    'MsgBox ComboBox1.Value
    set plage=sheets(x).range(....)' a adapter
    Call recherche(plage, .Value, xlWhole)
    End Sub
    '
    '
    Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    'If KeyCode = 13 Then MsgBox "coucou"
    If KeyCode = 13 and combobox1.value<>"" Then 
    set plage=sheets(x).range(....)' a adapter 
    Call recherche(plage, .Value, xlPart)
    end if
    End Sub

    dans un module ou meme le UserForm

    ta sub de recherche du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub recherche(plage, valeur, comment)
    Set c = plage.Find(valeur, lookat:=comment)
    If Not c Is Nothing Then
    'voir l'aide pour find next (exemple fourni)
    'ou ton code en fonction de:
    End If
    End Sub
    conclusion

    1. le click fonctionne uniquement sur les items tu n'a donc aucun soucis a cliquer dans le value du ComboBox pour y taper ce que tu veux
    2. dans le keydown la recherche est lancée uniquement lorsque tu tape enter


    voila
    peut etre remettre le .value a vide juste après le call
    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

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Scoubi7 Voir le message
    Si xlPart est la valeur par défaut de la fonction Find, c'est bien celle-la que j'appelais non xlWhole
    Non, xlPart n'est pas la valeur par défaut du paramètre LookAt de Find.
    Regard le paramètre LooAt de Find dans l'aide VBA Excel et tu verras qu'il n'a pas de valeur par défaut.
    https://msdn.microsoft.com/fr-fr/lib...6(v=office.15)

    La valeur par défaut, c'est la dernière valeur saisie dans la commande Rechercher.
    Et ça vaut aussi pour beaucoup d'autres paramètres de cette méthode, ce qui oblige à renseigner ces paramètres même si on à l'impression que ce n'est pas utile.

    Fais le test et tu verras.

  8. #8
    Membre confirmé Avatar de Scoubi7
    Profil pro
    Inscrit en
    Août 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 172
    Par défaut
    @menhir, quand j'écris Set F = .Find(ComboBoxSté, LookIn:=xlValues) sans rajouter de LookAt, il recherche la chaine recherchée n'importe où dans les chaines de caractères
    Mais quand je fais Set F = .Find(ComboBoxSté, LookIn:=xlValues, LookAt:=xlWhole), il faut que la chaine recherchée et la chaine qu'il analyse soient identique

    Donc c'est ce que je te demandais si : Set F = .Find(ComboBoxSté, LookIn:=xlValues) c'est la même chose que Set F = .Find(ComboBoxSté, LookIn:=xlValues, LookAt:=xlPart) ?
    Mais bon, c'est pas important


    Peux-tu m'écrire la ligne avec Find car je ne vois pas comment la rédiger pour que LookAt soit en fonction de la variable xlWhole ou xlPart...

    J'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Choix = IIf(ChoixSur = True, "lookat:=xlWhole", "lookat:=xlPart")
            With Worksheets("Sociétés").Range("B3:B300")
                Set F = .Find(ComboBoxSté, LookIn:=xlValues, Choix)
    mais ce n'est pas reconnu

  9. #9
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour Menhir,

    J'ai vu que vous conseilliez d'utiliser une boucle pour vérifier si la valeur est dans la liste source de la combobox.
    Sauriez-vous s'il existe des cas dans lesquels ListIndex reste à -1 alors que la valeur est bien dans la liste source de la combobox ? (certains de mes codes reposent sur un test de ListIndex et je me demande si je ne devrais pas corriger ça )

    Cdt

  10. #10
    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
    Citation Envoyé par Scoubi7 Voir le message
    re
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Choix = IIf(ChoixSur = True, xlWhole, xlPart)
            With Worksheets("Sociétés").Range("B3:B300")
                Set F = .Find(ComboBoxSté, LookIn:=xlValues, lookat:=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

  11. #11
    Membre confirmé Avatar de Scoubi7
    Profil pro
    Inscrit en
    Août 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 172
    Par défaut
    Merci j'avais fini par faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                If ChoixSur = True Then
                    Set F = .Find(ComboBoxSté, LookIn:=xlValues, lookat:=xlWhole)
                Else: Set F = .Find(ComboBoxSté, LookIn:=xlValues, lookat:=xlPart)
                End If

  12. #12
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    D'abord, "= True" est inutile. C'est une variable booléenne donc elle est déjà à True ou False par nature.
    C'est un peu comme demander quelle est la couleur du cheval blanc d'Henri IV.

    Il aurait été plus simple de mettre un IIf directement dans le paramètre LookAt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set F = .Find(ComboBoxSté, LookIn:=xlValues, LookAt:=IIf(ChoixSur, xlWhole, xlPart))

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

Discussions similaires

  1. Basculer entre 2 boutons radios
    Par L'aigle de Carthage dans le forum Langage
    Réponses: 1
    Dernier message: 28/04/2008, 08h54
  2. basculer entre deux form?
    Par UnSofteuxAmateur dans le forum Windows Forms
    Réponses: 9
    Dernier message: 04/07/2007, 12h35
  3. Réponses: 4
    Dernier message: 13/06/2006, 13h45
  4. [vb.net][Thread] Basculer entre Thread
    Par arnolem dans le forum Windows Forms
    Réponses: 5
    Dernier message: 06/01/2006, 18h59
  5. basculer entre 2 blocks visible et invisible
    Par popressay dans le forum Oracle
    Réponses: 7
    Dernier message: 27/08/2004, 16h40

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