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 :

Recherche intuitive textBox et affichage dans listbox avec condition


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Employé
    Inscrit en
    Août 2017
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Août 2017
    Messages : 32
    Points : 27
    Points
    27
    Par défaut Recherche intuitive textBox et affichage dans listbox avec condition
    Bonjour à toutes et à tous,

    J'ai réalisé un formulaire qui permet d'effectuer une recherche intuitive depuis un textBox et d'afficher le résultat dans la listbox.

    La listbox ne peut afficher que les lignes dont la valeur en colonne V est égale à "9999".

    Si je tape 2 avec recherche par code suite, la listbox m'affiche bien 3 lignes.

    Par contre, si je n'encode rien ,la listbox m'affiche 1.916 lignes, ce qui n'est pas correct. Elle devrait m'en afficher 4 !

    Pouvez-vous d'une part, m'éclairer à ce sujet et d'autre part, m'indiquer si les procédures utilisées sont cohérentes et optimales ?

    Dans le fichier joint, j'ai du restreindre le nombre de lignes de la base de données originale (50.000 lignes sur 25 colonnes).

    Merci à vous pour votre précieuse aide et conseils.
    Fichiers attachés Fichiers attachés

  2. #2
    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
    Bonjour,


    Fait en 3 mn avec un pgm générique


    Boisgontier
    Fichiers attachés Fichiers attachés

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Employé
    Inscrit en
    Août 2017
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Août 2017
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Désolé pour la réponse tardive....Merci Jacques

    Cependant, avec une BD originale de plus de 50.000 lignes, je souhaiterais pouvoir, depuis un textbox, effectuer une recherche du type "*" & Me.ComboBox2 & "*" et ce, quelle que soit la colonne de recherche (code, dénomination...).

    Pourriez-vous m'éclairer ?

    Merci d'avance

  4. #4
    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,


    Exemple de recherche multi-mots multi-colonnes:

    Fait avec un pgm générique(Il faut adapter ces lignes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       Set f = Sheets("THESES")
       ColVisu = Array(1, 2, 3, 4, 5, 6)       ' colonnes à visualiser
       colInterro = Array(1, 2, 3, 4, 5)       ' colonnes à interroger
       Set Rng = f.Range("A2:F" & f.[a65000].End(xlUp).Row)
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    Dim f, choix(), Rng, BD(), Ncol, ColVisu()
    Private Sub UserForm_Initialize()
       Set f = Sheets("THESES")
       ColVisu = Array(1, 2, 3, 4, 5, 6)       ' colonnes à visualiser
       colInterro = Array(1, 2, 3, 4, 5)       ' colonnes à interroger
       Set Rng = f.Range("A2:F" & f.[a65000].End(xlUp).Row)
       BD = Rng.Value
       Ncol = UBound(ColVisu) + 1
       '-- en têtes de colonne ListBox
       x = Me.ListBox1.Left + 8
       Y = Me.ListBox1.Top - 12
       For Each k In ColVisu
         Set Lab = Me.Controls.Add("Forms.Label.1")
         Lab.Caption = f.Cells(1, k)
         Lab.Top = Y
         Lab.Left = x
         x = x + f.Columns(k).Width * 0.9
         temp = temp & f.Columns(k).Width * 0.9 & ";"
       Next
       temp = Left(temp, Len(temp) - 1)
       Me.ListBox1.ColumnCount = UBound(ColVisu) + 1
       Me.ListBox1.ColumnWidths = temp
       '---
       ReDim choix(1 To UBound(BD))
       For i = LBound(BD) To UBound(BD)
         For Each k In colInterro
           choix(i) = choix(i) & BD(i, k) & "|"
         Next k
       Next i
       '--- valeurs initiales dans ListBox
       Dim Tbl(): ReDim Tbl(1 To UBound(BD), 1 To Ncol)
       For i = 1 To UBound(BD)
          C = 0
          For Each k In ColVisu
            C = C + 1: Tbl(i, C) = BD(i, k)
          Next k
       Next i
       'TriMultiCol Tbl, LBound(Tbl), UBound(Tbl), 1
       Me.ListBox1.List = Tbl
       Me.Label1.Caption = Me.ListBox1.ListCount & " Ligne(s)"
    End Sub
     
    Private Sub TextBox1_Change()
      If Me.TextBox1 <> "" Then
         mots = Split(Trim(Me.TextBox1), " ")
         Tbl = choix
         For i = LBound(mots) To UBound(mots)
            Tbl = Filter(Tbl, mots(i), True, vbTextCompare)
         Next i
         If UBound(Tbl) > -1 Then
            Dim b(): ReDim b(1 To UBound(Tbl) + 1, 1 To Ncol)
            For i = LBound(Tbl) To UBound(Tbl)
              a = Split(Tbl(i), "|")
              For k = 1 To Ncol: b(i + 1, k) = a(k - 1): Next k
            Next i
            Me.ListBox1.List = b
            Me.Label1.Caption = UBound(Tbl) + 1 & " Ligne(s)"
         Else
            Me.ListBox1.Clear
         End If
      Else
         UserForm_Initialize
      End If
    End Sub
    Nom : Sans titre.png
Affichages : 995
Taille : 29,9 Ko

    Boisgontier
    Fichiers attachés Fichiers attachés

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Employé
    Inscrit en
    Août 2017
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Août 2017
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Merci pour votre retour rapide Jacques.

    Après adaptation, le code fonctionne mais il manque encore un filtre important (voir mon premier post).

    La Listbox ne peut afficher que les lignes dont la valeur en colonne V est égale à "9999" ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.WorksheetFunction.CountIf(FL2.Range("S2:S" & FL2.Range("F" & Rows.count).End(xlUp).Row), "=9999")
    Je n'arrive pas à insérer cette condition dans le code fourni.

    Vincent

  6. #6
    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
    >La Listbox ne peut afficher que les lignes dont la valeur en colonne V est égale à "9999"

    -C'est curieux, sur votre fichier, je ne vois pas de 9999 en colonne V.
    -Il suffit de filtrer la table BD()

    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
    Option Compare Text
    Private Sub UserForm_Initialize()
      Set f = Sheets("bd")
      BD = f.Range("A2:D" & f.[A65000].End(xlUp).Row).Value
      ville = "Paris"
      Set Rng = f.Range("C2:C" & f.[C65000].End(xlUp).Row)
      n = Application.CountIf(Rng, ville)
      Dim TblDest(): ReDim TblDest(1 To n, 1 To UBound(BD, 2))
      j = 0
      For i = 1 To UBound(BD)
        If BD(i, 3) = ville Then
          j = j + 1
          For k = 1 To UBound(BD, 2): TblDest(j, k) = BD(i, k): Next k
        End If
      Next i
      Me.ListBox1.ColumnCount = 4
      Me.ListBox1.ColumnWidths = "50;30;30;50"
      Me.ListBox1.List = TblDest
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Employé
    Inscrit en
    Août 2017
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Août 2017
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Merci Jacques

    Effectivement, dans le fichier original il s'agit de la colonne V alors que dans le fichier joint dans mon post, il s'agit de la colonne S

    Votre code fonctionne bien mais je n'arrive pas à l'intégrer dans votre précédent code (recherche multi-mots multi-colonnes).

    Merci pour votre aide en tous cas

    Vincent

  8. #8
    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
    J'ai pris tous les codes de la colonne s<>9999
    Pour prendre les codes égaux à 9999 If bd2(i, 19) =code Then


    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Dim f, choix(), Rng, BD(), Ncol, ColVisu()
    Private Sub UserForm_Initialize()
       Set f = Sheets("BD")
       ColVisu = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22) ' colonnes à visualiser
       colInterro = Array(1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22) ' colonnes à interroger
       '-----
       Set Rng = f.Range("A2:Y" & f.[A65000].End(xlUp).Row)   'adapter
       code = 9999                                            ' adapter
       bd2 = Rng.Value
       Set Rng2 = f.Range("S2:S" & f.[S65000].End(xlUp).Row)   ' adapter
       n = UBound(bd2) - Application.CountIf(Rng2, code)
       Dim BD(): ReDim BD(1 To n, 1 To UBound(bd2, 2))
       j = 0
       For i = 1 To UBound(bd2)
        If bd2(i, 19) <> code Then                             ' adapter
          j = j + 1
          For k = 1 To UBound(bd2, 2): BD(j, k) = bd2(i, k): Next k
        End If
      Next i
      '---
       Ncol = UBound(ColVisu) + 1
       '-- en têtes de colonne ListBox
       x = Me.ListBox1.Left + 8
       Y = Me.ListBox1.Top - 12
       For Each k In ColVisu
         Set Lab = Me.Controls.Add("Forms.Label.1")
         Lab.Caption = f.Cells(1, k)
         Lab.Top = Y
         Lab.Left = x
         x = x + f.Columns(k).Width * 0.9
         temp = temp & f.Columns(k).Width * 0.9 & ";"
       Next
       temp = Left(temp, Len(temp) - 1)
       Me.ListBox1.ColumnCount = UBound(ColVisu) + 1
       Me.ListBox1.ColumnWidths = temp
       '---
       ReDim choix(1 To UBound(BD))
       For i = LBound(BD) To UBound(BD)
         For Each k In colInterro
           choix(i) = choix(i) & BD(i, k) & "|"
         Next k
       Next i
       '--- valeurs initiales dans ListBox
       Dim Tbl(): ReDim Tbl(1 To UBound(BD), 1 To Ncol)
       For i = 1 To UBound(BD)
          C = 0
          For Each k In ColVisu
            C = C + 1: Tbl(i, C) = BD(i, k)
          Next k
       Next i
       'TriMultiCol Tbl, LBound(Tbl), UBound(Tbl), 1
       Me.ListBox1.List = Tbl
       Me.Label1.Caption = Me.ListBox1.ListCount & " Ligne(s)"
    End Sub
     
    Private Sub TextBox1_Change()
      If Me.TextBox1 <> "" Then
         mots = Split(Trim(Me.TextBox1), " ")
         Tbl = choix
         For i = LBound(mots) To UBound(mots)
            Tbl = Filter(Tbl, mots(i), True, vbTextCompare)
         Next i
         If UBound(Tbl) > -1 Then
            Dim b(): ReDim b(1 To UBound(Tbl) + 1, 1 To Ncol)
            For i = LBound(Tbl) To UBound(Tbl)
              a = Split(Tbl(i), "|")
              For k = 1 To Ncol: b(i + 1, k) = a(k - 1): Next k
            Next i
            Me.ListBox1.List = b
            Me.Label1.Caption = UBound(Tbl) + 1 & " Ligne(s)"
         Else
            Me.ListBox1.Clear
         End If
      Else
         UserForm_Initialize
      End If
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Employé
    Inscrit en
    Août 2017
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Août 2017
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Merci Jacques

    Après avoir adapté n = UBound(bd2) - Application.CountIf(Rng2, code) en n = Application.CountIf(Rng2, code), le code fonctionne parfaitement.

    Est-il possible de faire la recherche uniquement dans les 4 premières colonnes (colInterro = Array(1, 2, 3, 4)) au lieu de faire le recherche dans toutes les colonnes visualisées (1 à 22) ?

    Merci à vous

  10. #10
    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
    Bonjour,

    cf PJ

    Boisgontier
    Fichiers attachés Fichiers attachés

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Employé
    Inscrit en
    Août 2017
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Août 2017
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Fonctionne à merveille !

    Merci Jacques pour votre aide et votre rapidité de réponse

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

Discussions similaires

  1. [Débutant] Affichage tri dans Listbox avec VB2010
    Par merymad69 dans le forum VB.NET
    Réponses: 4
    Dernier message: 01/02/2016, 11h29
  2. Recherche dans ListBox avec saisie dans textbox
    Par ilyes.sferi dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/10/2015, 15h46
  3. problème d'affichage dans ruby avec ajax
    Par Lunardirc dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 23/06/2008, 15h59
  4. Mauvais affichage dans listBox
    Par moilou2 dans le forum IHM
    Réponses: 30
    Dernier message: 16/03/2008, 20h19
  5. Aucun affichage dans formulaire avec onglet
    Par Daniel MOREAU dans le forum Access
    Réponses: 4
    Dernier message: 04/12/2006, 18h59

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