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 :

Filtre pour listbox [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Chargé d'affaires
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaires
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Par défaut Filtre pour listbox
    Bonsoir

    A l'aide d'un textbox, je filtre une plage de données pour alimenter une listbox.

    Si la valeur recherchée est sur la première colonne. L'affichage se fait fait correctement dans la listbox.

    Par contre, si cette valeur est issue d'une autre colonne. L'affichage dans la listbox est décalée.

    Avec la fonction C.Offset, je n'arrive pas à me caler toujours dans la même colonne en fonction la ligne trouvé.

    Merci de votre aide

    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 TextBox4_Change()
     
    Dim Plage As Range, Cell As Range
    Dim Recherche As String, Adresse As String
    Dim Ligne As Integer, N As Integer
    Dim C As Range
     
    ListBox1.Clear
    N = 0
     
    Recherche = TextBox4.Value
    Range("D4").Select
     
    Ligne = Feuil1.Range("D" & "65536").End(xlUp).Row
    Set Plage = Feuil1.Range("D" & "3:" & "I" & Ligne)
     
    With Plage
    Set C = .Find(Recherche)
    If Not C Is Nothing Then
    Adresse = C.Address
    Do
        If UCase(Recherche) = UCase(Left(C, Len(Recherche))) Then
     
            'alimentation listBox
            ListBox1.AddItem C.Offset(0, 0), N
          '  ListBox1.List(N, 1) = C
            ListBox1.List(N, 1) = C.Offset(0, 1)
            ListBox1.List(N, 2) = C.Offset(0, 2)
            ListBox1.List(N, 3) = C.Offset(0, 3)
            ListBox1.List(N, 4) = C.Offset(0, 4)
            ListBox1.List(N, 5) = C.Offset(0, 5)
            N = N + 1
        End If
     
        Set C = .FindNext(C)
        Loop While Not C Is Nothing And C.Address <> Adresse
        End If
    End With
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Un peu au hasard :

    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 TextBox4_Change()
     
    Dim Plage As Range, Cell As Range
    Dim Recherche As String, Adresse As String
    Dim Ligne As Integer, N As Integer
    Dim C As Range
     
    ListBox1.Clear
    N = 0
     
    Recherche = TextBox4.Value
    Range("D4").Select
     
    Ligne = Feuil1.Range("D" & "65536").End(xlUp).Row
    Set Plage = Feuil1.Range("D" & "3:" & "I" & Ligne)
     
    With Plage
    Set C = .Find(Recherche)
    If Not C Is Nothing Then
    Adresse = C.Address
    Do
        If UCase(Recherche) = UCase(Left(C, Len(Recherche))) Then
     
            'alimentation listBox
            ListBox1.AddItem .Cells(C.Row, 1), N
          '  ListBox1.List(N, 1) = C
            ListBox1.List(N, 1) = .Cells(C.Row, 2)
            ListBox1.List(N, 2) = .Cells(C.Row, 3)
            ListBox1.List(N, 3) = .Cells(C.Row, 4)
            ListBox1.List(N, 4) = .Cells(C.Row, 5)
            ListBox1.List(N, 5) = .Cells(C.Row, 6)
            N = N + 1
        End If
     
        Set C = .FindNext(C)
        Loop While Not C Is Nothing And C.Address <> Adresse
        End If
    End With
    End Sub

  3. #3
    Membre averti
    Profil pro
    Chargé d'affaires
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaires
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Par défaut
    Bonjour

    Merci de l'aide, l'affichage est pratiquement correct.

    A l'aide d'un textbox, je filtre une plage de données pour alimenter des listbox.

    Maintenant, si la valeur recherchée est aussi sur la ligne des entêtes. Son affichage est prise en compte dans la listbox.

    Je n'arrive pas à extraire de la recherche cette ligne des entêtes de colonne.

    Merci de votre aide

    Cordialement
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Peux-tu mettre un classeur en pièce jointe ?

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ton problème vient du fait que tu définis Plage à partir de D1
    Donc il faudrait le définir à partir de D5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = Feuil1.Range("D" & "5:" & "I" & Ligne)
    Mais alors un autre problème survient parce-que la Variable Objet C à comme adresse la valeur absolue de la feuille alors qu'il faudrait travailler avec une valeur relative par rapport à la plage.
    Par exemple en rectifiant par la différence entre ligne de Plage et ligne de C
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre éclairé Avatar de grisan29
    Homme Profil pro
    ouvrier poseur
    Inscrit en
    Octobre 2006
    Messages
    866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ouvrier poseur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2006
    Messages : 866
    Par défaut
    bonjour Regorn daniel_C, philppe Tulliez et les forumeurs

    tu n'a que changer sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each C In Sheets("Feuil1").Range("D5:D" & der)
    le 5 en 4

    bon réveillon a tous et bonne année 2013

    cordialement

    Pascal

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu déclares une variable Row de type Long
    La partie rouge est ce qu'il faut ajouter ou modifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Do
        If UCase(Recherche) = UCase(Left(C, Len(Recherche))) Then
              
            row = C.row - Plage.row + 1
            
            'alimentation listBox
            ListBox1.AddItem .Cells(row, 1), N
          '  ListBox1.List(N, 1) = C
            ListBox1.List(N, 1) = .Cells(row, 2)
            ListBox1.List(N, 2) = .Cells(row, 3)
            ListBox1.List(N, 3) = .Cells(row, 4)
            ListBox1.List(N, 4) = .Cells(row, 5)
            ListBox1.List(N, 5) = .Cells(row, 6)
            N = N + 1
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre averti
    Profil pro
    Chargé d'affaires
    Inscrit en
    Mars 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaires
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2011
    Messages : 29
    Par défaut Filtre pour listbox
    Bonjour

    Je viens de modifier mon fichier avec les éléments ci-dessous et j'ai le même problème.

    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
    Dim Plage As Range, Cell As Range
    Dim Recherche As String, Adresse As String
    Dim Ligne As Integer, N As Integer
    Dim C As Range
    Dim Row As Long
     
    ListBox1.Clear
    N = 0
     
    Recherche = TextBox5.Value
    Range("D4").Select
     
    Ligne = Feuil1.Range("D" & "65536").End(xlUp).Row
    Set Plage = Feuil1.Range("D" & "1:" & "I" & Ligne)
    'Set Plage = Feuil1.Range("D5:I25")
     
     
     
     
    With Plage
    Set C = .Find(Recherche)
    If Not C Is Nothing Then
    Adresse = C.Address
    Do
     
     
     
        If UCase(Recherche) = UCase(Left(C, Len(Recherche))) Then
     
            Row = C.Row - Plage.Row + 1
     
            'alimentation listBox
            ListBox1.AddItem .Cells(Row, 1), N
          '  ListBox1.List(N, 1) = C
            ListBox1.List(N, 1) = .Cells(Row, 2)
            ListBox1.List(N, 2) = .Cells(Row, 3)
            ListBox1.List(N, 3) = .Cells(Row, 4)
            ListBox1.List(N, 4) = .Cells(Row, 5)
            ListBox1.List(N, 5) = .Cells(Row, 6)
            N = N + 1
     
     
     
     
     
     
            'alimentation listBox
          '  ListBox1.AddItem C.Offset(0, 0), N
          '  ListBox1.List(N, 1) = C
          '  ListBox1.List(N, 1) = C.Offset(0, 1)
          '  ListBox1.List(N, 2) = C.Offset(0, 2)
          '  ListBox1.List(N, 3) = C.Offset(0, 3)
          '  ListBox1.List(N, 4) = C.Offset(0, 4)
          '  ListBox1.List(N, 5) = C.Offset(0, 5)
          '  N = N + 1
        End If
     
        Set C = .FindNext(C)
        Loop While Not C Is Nothing And C.Address <> Adresse
        End If
    End With

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

Discussions similaires

  1. [C#] Plusieurs filtres pour le FileSystemWatcher
    Par djoao dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/12/2006, 23h49
  2. [FileDialog]Filtre pour les extensions
    Par louby dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 21/08/2006, 16h52
  3. Filtre pour les dates
    Par aliwassem dans le forum Bases de données
    Réponses: 11
    Dernier message: 21/02/2006, 11h48
  4. [VB.NET] ScrollBar automatique pour Listbox
    Par Aspic dans le forum VB.NET
    Réponses: 6
    Dernier message: 19/12/2005, 13h58
  5. Filtres pour GraphEdit
    Par jackjack dans le forum DirectX
    Réponses: 2
    Dernier message: 23/05/2003, 14h45

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