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 :

Affichage d'information dans une listebox


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 257
    Par défaut Affichage d'information dans une listebox
    "Bonjour"
    J'ai mis en place une macro de recherche et j'aimerai pour l'améliorer encore plus, afficher toute la ligne correspondante à la cellule recherchée par mon textbox.

    Ma macro ne me ramène que la valeur des cellules et non des lignes entière.
    est ce possible ? si oui, j'aimerais avoir un coup de main.

    "Merci"
    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
    Private Sub TextBox1_Change()
    Dim DerLig As Long
    Dim C As Range
    Dim FirstAddress As String
    Dim Cptr As Integer
     
        Application.ScreenUpdating = False
        DerLig = Range("B" & Rows.Count).End(xlUp).Row        'Permet de trouver la dernière ligne vide à partir du bas du tableau
        Range("B2:D" & DerLig).Interior.ColorIndex = 2
        ListBox1.Clear
        If TextBox1 <> "" Then
            Set C = Range("B2:D" & DerLig).Find(TextBox1.Value, , xlValues, xlPart)
            If Not C Is Nothing Then
                FirstAddress = C.Address
                Do
                    C.Interior.ColorIndex = 43
                    Cptr = Cptr + 1
                    ListBox1.AddItem C
                    Set C = Range("B2:D" & DerLig).FindNext(C)
                Loop While Not C Is Nothing And C.Address <> FirstAddress
                Set C = Range("B2:D" & DerLig).Find(TextBox1.Value, , xlValues, xlPart)
                If Cptr = 1 Then
                    ActiveWindow.ScrollColumn = Application.Max(1, C.Column - ActiveWindow.VisibleRange.Columns.Count / 2)
                    ActiveWindow.ScrollRow = Application.Max(1, C.Row - ActiveWindow.VisibleRange.Rows.Count / 2)
                    C.Select
                End If
            Else
                MsgBox "La personne recherchée n'est pas dans la liste", vbExclamation
                TextBox1.Value = Left(TextBox1.Value, Len(TextBox1.Value) - 1)
            End If
        End If
        Set C = Nothing
        Application.ScreenUpdating = True
    End Sub

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonsoir Saninx, bonsoir le forum,

    Où commence ton tableau (étiquettes ou en-têtes compris) ? En A1 ? En B1 ? En B2 ?
    Le code ci-dessous considère qu'il commence en A1. Si ce n'est pas le cas il faudra l'adapter...

    En utilisant une variable (TC) contenant les cellules à la place de la plage de cellules elle-même, le code est beaucoup plus rapide. Pour conserver cette rapidité, j'ai supprimé les couleurs qui obligeaient à revenir aux cellules. Tu tapes une lettre, un mot ou un groupe de mot et la ListBox1 affiche toutes les lignes contenant ce qui a été édité dans la TextBox1.


    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 TextBox1_Change()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
    Dim NL As Long 'déclare la variable NL (Nombre de Lignes)
    Dim NC As Integer 'déclare la variable NC (Nombre de Colonnes)
    Dim K As Long 'déclare la variable K (incrément de colonne)
    Dim I As Integer 'déclare la variable I (Incrément de ligne)
    Dim J As Integer 'déclare la variable J (incrément de colonne)
    Dim TL() As Variant 'déclare la variable TL(Tableau de Lignes)
    Dim L As Integer 'déclare la variable L (incrément de colonne)
     
    If Me.TextBox1.Value = "" Then ListBox1.Clear: Exit Sub 'si la Textbox1 est effacée, vide la ListBox1, sort de la procédure
    Set O = Sheets("Feuil1") 'définit l'onglet O (à adapter à ton cas)
    ListBox1.Clear 'vide la ListBox1
    TC = O.Range("A1").CurrentRegion 'définit le tableau de cellules TC
    NL = UBound(TC, 1) 'définit le nombre de lignes NL dans le tableau de cellules TC
    NC = UBound(TC, 2) 'définit le nombre de colonnes NC dans le tableau de cellules TC
    Me.ListBox1.ColumnCount = NC 'définit le nombre de colonnes de la ListBox1
    K = 1 'initialise la variable K
    For I = 2 To NL 'boucle 1 : sur toutes les lignes I du tableau de cellules TC (en partant de la seconde)
        For J = 2 To 4 'boucle 2 sur les colonnes 2 à 4 (=> colonnes B à D) du tableau de cellules TC
            'condition : si le texte de la TextBox1 est contenu dans la valeur ligne I colonne J de TC (sans tenir compte de la casse)
            If UCase(TC(I, J)) Like "*" & UCase(Me.TextBox1.Value) & "*" Then
                ReDim Preserve TL(1 To NC, 1 To K) 'redimensionne le tableau TL (autant de lignes que TC a de colonnes, K colonnes)
                For L = 1 To NC 'boucle 3 : sur toutes les colonnes de TC
                    TL(L, K) = TC(I, L) 'récupère dans la ligne de TL la valeur de la colonne de TC (=Transposition)
                Next L 'prochaine colonne de la boucle 3
                K = K + 1 'incrémnte K (nouvelle colonne au tabelau TL)
                Exit For 'sort de la boucle 2
            End If 'fin de la condition
        Next J 'prochaine colonne de la boucle 2
    Next I 'prochaine ligne de la boucle 1
    'si K=1 (=> aucune occurrence trouvée), message, sort de la procédure
    If K = 1 Then MsgBox "La personne recherchée n'est pas dans la liste", vbExclamation: Exit Sub
    'si K=2 (=> une seule occurence trouvée) redimentionne TL à deux colonnes sinon tranposition impossible
    If K = 2 Then ReDim Preserve TL(1 To UBound(TL, 1), 1 To 2)
    'alimente la ListBox1 par le tableau TL transposé
    Me.ListBox1.List = Application.Transpose(TL)
    End Sub

Discussions similaires

  1. Affichage d'informations dans une StatusBar
    Par forum dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 08/03/2011, 19h10
  2. Réponses: 2
    Dernier message: 14/09/2005, 13h39
  3. Probleme d'affichage d'image dans une fenetre
    Par cgregueusse dans le forum MFC
    Réponses: 1
    Dernier message: 03/08/2005, 11h08
  4. [Exception]Affichage de message dans une Execption
    Par harris_macken dans le forum Général Java
    Réponses: 8
    Dernier message: 29/05/2005, 17h34
  5. Affichage d'images dans une fenêtre
    Par tonycalv dans le forum MFC
    Réponses: 6
    Dernier message: 20/04/2005, 20h02

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