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 :

Renvoi erroné de ligne d'une 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 confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Août 2013
    Messages : 55
    Par défaut Renvoi erroné de ligne d'une listbox
    bonsoir à tout le forum
    j'ai un userform contenant:
    -1 textbox dans lequel je rentre les 1ères lettres du nom cherché
    -1 listbox qui se remplit en fonction de la saisie du textbox. la listbox a 8 colonnes dont 5 cachées
    lorsque je sélectionne une ligne de la listbox, mais en vérifiant par msgbox le numéro de ligne dans la feuille ne correspond pas à ma sélection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    With f.Range("C2:K" & NbLC)
        r = .Find(ListBox1, lookat:=xlWhole).row
    f=feuille1, nblc= nbre lignes de la feuille

    1er contrôle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Cells(r, 3) & " " & Cells(r, 4) & " " & Cells(r, 11)
    la valeur renvoie la 1ère ligne visible de la listbox, donc exceptionnellement celle que je veux
    2ème contrôle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox ListBox1 & " " & ListBox1.Column(1) & " " & ListBox1.Column(8)
    en utilisant listbox.column, j'obtiens bien les bonnes informations, mais je bute à transformer en n° de ligne correct
    le traitement suivant récupérant ces infos entre autres

    un petit coup de main pour me permettre de résorber cette montage sur ma route (hi)

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    1 listbox qui se remplit en fonction de la saisie du textbox. la listbox a 8 colonnes dont 5 cachées
    Montre donc s'il te plait le code d'abondement de la listbox.

  3. #3
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Août 2013
    Messages : 55
    Par défaut code textbox
    bonjour
    merci d'avoir jeté un coup d'oeil à mon "save our souls"
    voici le code que j'ai récupéré "intégralement" sur une page de jacques boisgontier, vu mon niveau vba et que j'en profite pour remercier
    code qui fonctionne admirablement bien (sans flagorneries)
    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
    Private Sub TextBox20_Change()
         clé = UCase(Me.TextBox20) & "*"
         Dim Tbl()
         n = 0: ncol = UBound(bd, 2)
         For i = LBound(bd) To UBound(bd)
           If UCase(bd(i, 1)) Like clé Then
             n = n + 1: ReDim Preserve Tbl(1 To ncol, 1 To n)
             For k = 1 To ncol: Tbl(k, n) = bd(i, k): Next
           End If
          Next i
          If n > 0 Then
            ReDim Preserve Tbl(1 To ncol, 1 To n + 1)
            ListBox1.List = Application.Transpose(Tbl)
            ListBox1.RemoveItem n
          End If
    End Sub
    à lire & comprendre mon pt d'achoppement

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Nous voilà bien avancés ...
    On y voit bien que les données proviennent d'une matrice ici nommée bd, mais on ignore tout de l'origine des données de cette matrice !
    Nous voilà donc au point de départ avec cette question : comment a été alimentée la matrice bd ? (par quel code ?)

    Je ne peux à ce stade que tenter de deviner les tenants et aboutissants :
    Il semble que :
    - tu aies défini une matrice bd sur la base d'une plage de cellules
    - tu parcoures cette matrice bd pour alimenter une autre matrice (Tbl) en articles de bd répondant à certaines conditions
    - que tu alimentes ensuite ta listbox à partir des éléments de la matrice Tbl

    - et que tu cherches maintenant à déterminer à quelle ligne d'une feuille de calcul Excel correspond un article sélectionné dans ta listbox.
    Si c'est bien cela : aucun lien possible entre les deux, puisque n'ont été retenus que certains éléments de la matrice bd (et donc de la plage de cellules concernée) !
    Un tel "lien" ne serait possible que si ta matrice Tbl comportait une colonne supplémentaire qui contiendrait l'index de l'article retenu dans la matrice bd. La ligne concernée de la plage de cellules sera de cette manière : cet index + la propriété Row de la plage de cellules ayant alimenté la matrice bd.
    J'espère que tout cela n'est pas pour toi du chinois. Le contraire voudrait dire que tu es loin de comprendre ce que tu as copié/collé.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Je verrai plutôt une recherche dans un tableau car plus rapide que dans une feuille. Une piste :
    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
     
    Dim Tbl() As String
     
    Private Sub UserForm_Initialize()
     
        Dim Plage As Range
        Dim Cel As Range
        Dim I As Long
     
        With ActiveSheet: Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
     
        For Each Cel In Plage
     
            I = I + 1
            ReDim Preserve Tbl(1 To 8, 1 To I)
     
            Tbl(1, I) = Cel.Value
            Tbl(2, I) = Cel.Offset(, 1).Value
            Tbl(3, I) = Cel.Offset(, 2).Value
            Tbl(4, I) = Cel.Offset(, 3).Value
            Tbl(5, I) = Cel.Offset(, 4).Value
            Tbl(6, I) = Cel.Offset(, 5).Value
            Tbl(7, I) = Cel.Offset(, 6).Value
            Tbl(8, I) = Cel.Offset(, 7).Value
     
        Next Cel
     
    End Sub
     
    Private Sub TextBox1_Change()
     
        Dim I As Long
        Dim J As Long
     
        ListBox1.Clear
     
        With ListBox1
     
            For I = 1 To UBound(Tbl, 2)
     
                If Left(Tbl(1, I), Len(TextBox1.Text)) = TextBox1.Text Then
     
     
                    .AddItem Tbl(1, I)
                    .Column(1, J) = Tbl(2, I)
                    .Column(2, J) = Tbl(3, I)
                    .Column(3, J) = Tbl(4, I)
                    .Column(4, J) = Tbl(5, I)
                    .Column(5, J) = Tbl(6, I)
                    .Column(6, J) = Tbl(7, I)
                    .Column(7, J) = Tbl(8, I)
                    J = J + 1
     
                End If
     
            Next I
     
        End With
     
    End Sub

  6. #6
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Août 2013
    Messages : 55
    Par défaut
    Citation Envoyé par Theze Voir le message
    Bonjour,

    Je verrai plutôt une recherche dans un tableau car plus rapide que dans une feuille. Une piste :
    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
     
    Dim Tbl() As String
     
    Private Sub UserForm_Initialize()
     
        Dim Plage As Range
        Dim Cel As Range
        Dim I As Long
     
        With ActiveSheet: Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
     
        For Each Cel In Plage
     
            I = I + 1
            ReDim Preserve Tbl(1 To 8, 1 To I)
     
            Tbl(1, I) = Cel.Value
            Tbl(2, I) = Cel.Offset(, 1).Value
            Tbl(3, I) = Cel.Offset(, 2).Value
            Tbl(4, I) = Cel.Offset(, 3).Value
            Tbl(5, I) = Cel.Offset(, 4).Value
            Tbl(6, I) = Cel.Offset(, 5).Value
            Tbl(7, I) = Cel.Offset(, 6).Value
            Tbl(8, I) = Cel.Offset(, 7).Value
     
        Next Cel
     
    End Sub
     
    Private Sub TextBox1_Change()
     
        Dim I As Long
        Dim J As Long
     
        ListBox1.Clear
     
        With ListBox1
     
            For I = 1 To UBound(Tbl, 2)
     
                If Left(Tbl(1, I), Len(TextBox1.Text)) = TextBox1.Text Then
     
     
                    .AddItem Tbl(1, I)
                    .Column(1, J) = Tbl(2, I)
                    .Column(2, J) = Tbl(3, I)
                    .Column(3, J) = Tbl(4, I)
                    .Column(4, J) = Tbl(5, I)
                    .Column(5, J) = Tbl(6, I)
                    .Column(6, J) = Tbl(7, I)
                    .Column(7, J) = Tbl(8, I)
                    J = J + 1
     
                End If
     
            Next I
     
        End With
     
    End Sub
    merci pour ta proposition, je vais tenter de comprendre et d'appliquer

  7. #7
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Août 2013
    Messages : 55
    Par défaut
    ton raisonnement est exactement ce que je n'ai pas su exprimer
    cette demande d'assistance me démontre bien la régression que j'ai subi ces 3 dernières années me faisant progresser de débutant à novice !
    quoiqu'il en soit, je te remercie pour tes réponses et m'atteler à trouver un autre chemin ou modifier le code existant pour arriver à mes fins ... d'ici 1 ou 2 mois hi
    je passe en résolu

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

Discussions similaires

  1. Changer la couleur d'une ligne dans une listbox
    Par BoyzInDaProject dans le forum MFC
    Réponses: 2
    Dernier message: 01/06/2007, 10h23
  2. Tracer une ligne dans une Listbox
    Par craryb dans le forum MFC
    Réponses: 2
    Dernier message: 09/03/2007, 14h06
  3. Réponses: 4
    Dernier message: 22/12/2006, 22h08
  4. Changer la couleur d'une ligne dans une ListBox
    Par Leray dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 16/07/2006, 14h44
  5. Réponses: 3
    Dernier message: 08/06/2006, 11h53

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