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 dans une ListBox des resultats [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Responsable des études
    Inscrit en
    Août 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2015
    Messages : 9
    Par défaut Affichage dans une ListBox des resultats
    Bonjour,

    J'en appelle a vos regards d'expert, car la je ne trouve pas la solution.

    Je travaille avec Excel 2007, j'ai un formulaire qui permet de trouver via une valeur saisie dans une textbox toutes les occurences et de les afficher dans une listBox :

    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
    Private Sub B_go_Click()
        Me.ListBox2.Clear
        Worksheets("cherche").Select
        Set c = Range("a:a").Find(Me.TextBox1.Value, LookIn:=xlValues)
        If Not c Is Nothing Then
          premier = c.Address
          i = 0
          Do
            Me.ListBox2.AddItem
            Me.ListBox2.List(i, 0) = c.Value
            Me.ListBox2.List(i, 1) = c.Offset(0, 1).Value
            Me.ListBox2.List(i, 2) = c.Offset(0, 4).Value
            Me.ListBox2.List(i, 3) = c.Offset(0, 5).Value
            Me.ListBox2.List(i, 4) = c.Offset(0, 6).Value
            Me.ListBox2.List(i, 5) = c.Offset(0, 7).Value
            Me.ListBox2.List(i, 6) = c.Offset(0, 8).Value
            Me.ListBox2.List(i, 7) = c.Offset(0, 9).Value
            Me.ListBox2.List(i, 8) = c.Offset(0, 10).Value
            Me.ListBox2.List(i, 9) = c.Offset(0, 11).Value
     
            Set c = Range("a:a").FindNext(c)
            i = i + 1
          Loop While Not c Is Nothing And c.Address <> premier
        End If
    End Sub
     
    Jusque la tout va bien, la ou est ce trouve mon probleme, j'autorise les utilisateurs a faire une recherche alphabetique dans une combobox afin de recuperer plusieurs choix que je conserve dans un onglet selection.
    Suite a la selection, je voudrais maitenant afficher les resultats de toutes les occurences dans la listbox :
     
    Me.ListBox2.Clear
     
        'Ici j'ai mis en dur la valeur pour mes tests mais l'objectif et de boucler
        'toutes les valeurs trouves dans l'onglet selection
     
        Me.TextBox1.Value = Sheets("selection").Range("B1").Value
     
        Worksheets("cherche").Select
        Set c = Range("a:a").Find(Me.TextBox1.Value, LookIn:=xlValues)
        If Not c Is Nothing Then
          premier = c.Address
          i = 0
          Do
            Me.ListBox2.AddItem
            Me.ListBox2.List(i, 0) = c.Value
            Me.ListBox2.List(i, 1) = c.Offset(0, 1).Value
            Me.ListBox2.List(i, 2) = c.Offset(0, 4).Value
            Me.ListBox2.List(i, 3) = c.Offset(0, 5).Value
            Me.ListBox2.List(i, 4) = c.Offset(0, 6).Value
            Me.ListBox2.List(i, 5) = c.Offset(0, 7).Value
            Me.ListBox2.List(i, 6) = c.Offset(0, 8).Value
            Me.ListBox2.List(i, 7) = c.Offset(0, 9).Value
            Me.ListBox2.List(i, 8) = c.Offset(0, 10).Value
            Me.ListBox2.List(i, 9) = c.Offset(0, 11).Value
     
            Set c = Range("a:a").FindNext(c)
            i = i + 1
          Loop While Not c Is Nothing And c.Address <> premier
     
        End If
     
    End Sub
    Mais la ca ne fonctionne plus, la routine stop Me.ListBox2.List(i, 1) = c.Offset(0, 1).Value" n'arrivant pas a mettre la valeur.....

    Donc pour resumer, j'ai un soucis d'affichage dans ma listbox, et je ne sais pas non plus comment faire une boucle sur toutes les valeurs selectionnes dans l'onglet selection pour afficher egalement toutes les occurences.


    Merci par avance

  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
    Bonjour,

    J'ouvre ton fichier et la combobox ListeMC n'es pas alimentée. Du coup, malgré tes explications, je ne comprend absolument pas comment fonctionne l'UserForm...

  3. #3
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    bonjour


    Mais la ca ne fonctionne plus, la routine stop "Me.ListBox2.List(i, 1) = c.Offset(0, 1).Value" n'arrivant pas a mettre la valeur.....

    as tu penser à renseigner la propriété ColumnCount de ta list box ?

  4. #4
    Membre habitué
    Homme Profil pro
    Responsable des études
    Inscrit en
    Août 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2015
    Messages : 9
    Par défaut
    Merci pour vos premieres reponses, donc pour Tautheme, dans l'userform il y a 2 types de selection pour alimenter la listbox2 :
    1 - ecrire dans la textbox1 un chiffre qui correspond a un item code de l'onglet cherche, par exemple 2937671 et clic sur le bouton GO, les resultats apparaissent dans la listbox2
    2 - dans la LISTMC, c'est une recherche alphabetique, donc on cherche le nom d'un item provenant de l'onglet liste et on a une liste de choix qui apparait dans listbox1 qui permet ici de faire une selection de plusieurs enregistrement en cliquant sur les elements dans la listbox1. On clic sur le bouton validation qui permet de garder la selection des elements dans l'onglet "selection"

    Quand je prends l'option 1, pas de soucis, j'ai bien le resultat qui s'affiche dans listbox2

    Pour l'option 2, je bloque a l'affichage apres la mise a jour de la premiere colonne de la listbox2.
    De plus, comme je suis sur une possible multi selection, je ne sais pas comment faire une boucle sur tous les elements selectionnes.

    Pour bbil, je ne pense pas que ce soit un soucis de declaration du nombre de colonne de ma listbox, puisque le code fonctionne avec l'option 1.
    Mais je vais quand meme faire le test......

    Je suis ouvert a toute suggestion pour resoudre cette egnime

    Merci

  5. #5
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Pour l'option 2, je bloque a l'affichage
    ?? mais encore ?? que se passe-t'il ?

  6. #6
    Membre habitué
    Homme Profil pro
    Responsable des études
    Inscrit en
    Août 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2015
    Messages : 9
    Par défaut
    et bien apres avoir appuyer sur le bouton validation des criteres de ma multiselection, j'ai le message :

    Run-time error '380'
    Could not set the list property.invalid property value

    alors qu'avec l'option 1 aucun soucis

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

    Je comprends pourquoi je ne comprenais pas (je me comprends...) ! Pour moi tu as inversé les contrôles. La TextBox1 devrait être une combobox et la combobox ListeMC devrait être une textbox. En effet, dans la TextBox1 tu cherches une référence qui, à part unknow, est unique. Donc une combobox conviendrait mieux. Ensuite, on doit taper du texte dans la combobox ListeMC (qui n'est pas alimentée) pour alimenter la ListBox1. C'est donc une textbox qu'il faudrait ici...
    Pour le reste je t'avoue ne pas bien comprendre où tu veux en venir, j'ai l'impression que tu as pas mal compliqué les choses pour rien.
    Voilà comment je verrais ça mais sans savoir du tout que cela pourrait convenir...

    J'ai refait l'UserForm avec la TextBox1, ta listbox que j'ai renommée ListBox1, un CommandButton1 (Valider) et un Commandbutton2 (Annuler). Tout le reste je l'ai supprimer.
    Le code ci-dessous :
    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
    Private C As Worksheet 'déclare la variable C(onglet cherche)
    Private S As Worksheet 'déclare la variable S(onglet Selection)
    Private L As Worksheet 'déclare la variable L (onglet Liste)
    Private DL As Integer 'déclare la variable DL (Dernière Ligne)
    Private TC As Variant 'déclare la variable TC (Tableau de Cellules)
    Private NL As Integer 'déclare la variable NL (Nombre de Lignes)
    Private NC As Byte 'déclare la variable NC (Nombre de Colonnes)
    Private TL() As Variant 'déclare la variable TL (Tableau de Lignes)
     
    Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
    Set C = Sheets("cherche") 'définit l'onglet C
    Set S = Sheets("selection") 'définit l'onglet S
    Set L = Sheets("Liste") 'définit l'onglet L
    DL = IIf(C.Range("A10") = "", 10, C.Range("A9").End(xlDown).Row) 'définit la dernière ligne éditée de la colonne A de l'onglet C
    TC = C.Range("A10:L" & DL) 'définit le tableau de cellules TC
    NL = UBound(TC, 1) 'définit le nombre de lignes NL du tabelau de cellules TC
    NC = UBound(TC, 2) 'définit le nombre de colonnes NC du tabelau de cellules TC
    Me.ListBox1.ColumnCount = NC + 1 'définit le nombre de colonnes de la ListBox1
    End Sub
     
    Private Sub TextBox1_Change() 'au changement dans la TextBix1
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim J As Integer 'déclare la variable J (incrément)
    Dim K As Byte 'déclare la variable K (incrément)
    Dim L As Byte 'déclare la variable L (incrément)
     
    Me.ListBox1.Clear 'vide la ListBox1
    K = 1 'initialise la variable K
    For I = 1 To NL 'boucle 1 : sur toutes les lignes I du tableau de cellules TC
        For J = 1 To NC 'boucle 2 : sur toutes les colonnes J 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 InStr(1, CStr(TC(I, J)), Me.TextBox1.Value, vbTextCompare) <> 0 Then
                ReDim Preserve TL(NC + 1, 1 To K) 'redimensionne le tableau TL (autant de lignes que TC a de colonnes plus une, k colonnes)
                TL(0, K) = I + 9 'récupère le numéro de ligne dans la ligne 0 de TL (qui sera masquée après la transposition)
                For L = 1 To NC 'boucle 3 : des colonnes 1 à NC
                    TL(L, K) = TC(I, L) 'récupère dans la ligne L de TL la valeur de la colonne L de TC (=transposition)
                Next L 'prochaine colonne de la boucle 3
                K = K + 1 'incrément K
                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
    If K > 1 Then 'si K est supérieur à 1
        If K = 2 Then ReDim Preserve TL(UBound(TL, 1), 1 To 2) 'si K=2 redimensionne TL pour permettre la transposition avec une seule ligne
        Me.ListBox1.List = Application.Transpose(TL) 'alimente la ListBox1 avec le tableau TL transposé
    End If 'fin de la condition
    'le numéro de ligne est stocké dans la colonne 0 de la ListBox1 qui est masquée
    End Sub
     
    Private Sub CommandButton1_Click() 'bouton "Valider"
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim LIS As Range 'déclare la variable LIS (LIgneS)
     
    Set LIS = C.Range("A1") 'initialise la variable LIS
    With Me.ListBox1 'prend en compte la ListBox1
        For I = 0 To .ListCount - 1 'boucle sur tous les éléments
            'si l'élément est sélectionné redéfinit la varialbe LIS
            If .Selected(I) = True Then Set LIS = IIf(LIS.Address = "$A$1", C.Rows(CInt(.List(I, 0))), Application.Union(LIS, C.Rows(CInt(.List(I, 0)))))
        Next I 'prochain élément de la boucle
    End With 'fin de la prise en compte de la ListBox1
    C.Activate 'active l'onglet C
    LIS.Select 'sélectionne la plage LIS
    Unload Me 'vide et ferme l'UserForm
    End Sub
     
    Private Sub CommandButton2_Click() 'bouton "Annuler"
    Unload Me 'vide et ferme l'UserForm
    End Sub


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

Discussions similaires

  1. [Windev11]Affichage dans la barre des tâche
    Par albator8619 dans le forum WinDev
    Réponses: 7
    Dernier message: 08/06/2007, 18h22
  2. Réponses: 3
    Dernier message: 14/05/2006, 13h50
  3. Problème d'affichage dans les textbox
    Par popinenhbourg dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 28/02/2006, 12h09
  4. Problème d'affichage dans les textbox
    Par popinenhbourg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 28/02/2006, 11h36
  5. Affichage dans une textbox
    Par philo71 dans le forum MFC
    Réponses: 25
    Dernier message: 30/01/2006, 09h34

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