Numéroter un listbox

Résolu/Fermé
Saddoud_walid Messages postés 41 Date d'inscription samedi 17 janvier 2015 Statut Membre Dernière intervention 6 novembre 2020 - Modifié le 2 sept. 2018 à 18:12
Saddoud_walid Messages postés 41 Date d'inscription samedi 17 janvier 2015 Statut Membre Dernière intervention 6 novembre 2020 - 4 sept. 2018 à 23:27
Bonjour,

J’ai un petit problème avec mon programme et je cherche de l’aide….
J’ai une listbox avec 6 colonnes et j’aime que la première colonne indique le numéro de la ligne du listbox après le filtrage
Et si c’est possible trier d’une manière décroissante la colonne 2
Merci d’avance pour votre aide

mon code:

Private Sub TextBox5_Change()

 Set f = ActiveSheet
   Me.ListBox1.Clear
 
 With ListBox1
.ColumnCount = 6
.ColumnWidths = "50;100;100;100;100;100"
.RowSource = ""
End With

   Set plage = f.[b1].CurrentRegion

   Set plage = ActiveSheet.Range("a4:a3000")
   Set c = plage.Find(Me.TextBox5, , , xlPart)
   If Not c Is Nothing Then
     i = 0
     premier = c.Address
     Do
     
       Me.ListBox1.AddItem
       Me.ListBox1.List(i, 0) = c.Offset(0, 1)
       Me.ListBox1.List(i, 1) = c.Offset(0, 2)
       Me.ListBox1.List(i, 2) = c.Offset(0, 3)
       Me.ListBox1.List(i, 3) = c.Offset(0, 4)
       Me.ListBox1.List(i, 4) = c.Offset(0, 5)
       Me.ListBox1.List(i, 4) = c.Offset(0, 6)
       i = i + 1
       Set c = plage.FindNext(c)
     Loop While Not c Is Nothing And c.Address <> premier

End If
End Sub


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

4 réponses

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
3 sept. 2018 à 13:48
Est-ce que ceci convient :
Private Sub TextBox5_Change()

[e2] = TextBox5.Value
On Error GoTo errormessage:

Dim F As Worksheet
Dim TV As Variant
Dim I As Integer
Dim J As Integer
Dim V(0 To 5) As Variant

Set F = ActiveSheet
Me.ListBox1.Clear

With Me.ListBox1
    .ColumnCount = 6
    .ColumnWidths = "50;100;100;100;100;100"
    .RowSource = ""
End With
TV = F.Range("A3").CurrentRegion 'cela correspond à la plage A2:F28
I = 0
For J = 3 To UBound(TV, 1)
    If TV(J, 1) = Me.TextBox5.Value Then
        Me.ListBox1.AddItem
        Me.ListBox1.List(I, 0) = J + 1 'numéro de ligne
        Me.ListBox1.List(I, 1) = TV(J, 2) '=> colonne B
        Me.ListBox1.List(I, 2) = TV(J, 3) '=> colonne C
        Me.ListBox1.List(I, 3) = TV(J, 4) '=> colonne D
        Me.ListBox1.List(I, 4) = TV(J, 5) '=> colonne E
        Me.ListBox1.List(I, 5) = TV(J, 6) '=> colonne F
        I = I + 1
    End If
Next J
'tri décroissant par rapport à la colonne 2 de la ListBox1 (la note)
With Me.ListBox1
    For I = 0 To .ListCount - 1
        For J = 0 To .ListCount - 1
            If CDbl(.Column(1, I)) > CDbl(.Column(1, J)) And I <> J Then
                V(0) = .List(I, 0): .Column(0, I) = .Column(0, J): .Column(0, J) = V(0)
                V(1) = .Column(1, I): .Column(1, I) = .Column(1, J): .Column(1, J) = V(1)
                V(2) = .Column(2, I): .Column(2, I) = .Column(2, J): .Column(2, J) = V(2)
                V(3) = .Column(3, I): .Column(3, I) = .Column(3, J): .Column(3, J) = V(3)
                V(4) = .Column(4, I): .Column(4, I) = .Column(4, J): .Column(4, J) = V(4)
                V(5) = .Column(5, I): .Column(5, I) = .Column(5, J): .Column(5, J) = V(5)
            End If
        Next J
    Next I
End With

errormessage:
If Err.Number = 9 Then
MsgBox "PAS D'ELEVES DANS CETTE CATEGORIE" & vbCrLf & "vérifier votre travail"
End If
End Sub

1
Saddoud_walid Messages postés 41 Date d'inscription samedi 17 janvier 2015 Statut Membre Dernière intervention 6 novembre 2020
4 sept. 2018 à 18:12
bonjour,
le problème du premier colonne et toujours la même .... donc j'ai pensé que si je ne fait pas la numérotation dans la listbox mais quand je récupère les valeurs pour l'impression
je m'explique .... quand je récupère les linges de la listbox dans ma feuille (10 linges par exemple) j'aime avoir dans la cellule A9 la valeur 1 ; A10 la valeur 2; A11 la valeur 3 etc ......
voila mon code pour imprimer :

Private Sub CommandButton1_Click()
Worksheets("1").Visible = True
Worksheets("1").Select

Dim Cpt As Byte

For Cpt = 1 To 1
With ActiveWorkbook.ActiveSheet
.Copy After:=Worksheets(Worksheets.Count)
End With


Next Cpt
On Error GoTo errormessage1:

ActiveSheet.Name = "b"

errormessage1:
If Err.Number = 1004 Then
MsgBox "suprimer a" & vbCrLf & "vérifier votre travail"
End If

With ListBox1
If .ListCount - 1 >= 2 Then
Rows("10:" & 9 + .ListCount - 2).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
End If

For x = 0 To TextBox1.Value - 1
For y = 0 To 5
If y > 1 Then
ActiveSheet.Range("a9").Offset(x, y) = .List(x, y)

Else
ActiveSheet.Range("a9").Offset(x, y) = .List(x, y)

End If
Next y, x


[c6] = TextBox5

Sheets("b").PrintOut

With Application
.ScreenUpdating = False
.DisplayAlerts = False
End With

Sheets("b").Delete
Application.DisplayAlerts = True

End With

Worksheets("1").Visible = False
Unload UserForm2



End Sub




merci beaucoup pour votre aide
0
Saddoud_walid Messages postés 41 Date d'inscription samedi 17 janvier 2015 Statut Membre Dernière intervention 6 novembre 2020
4 sept. 2018 à 20:37
merci beaucoup ThauTheme ..... j'ai résolue le problème ..... j'ai ajouter ça (avant next y,x):

Rows("9:9").Copy
Range("A9").PasteSpecial xlPasteFormats
Range("A9") = 1
Range("A9:A" & Range("A" & Rows.Count).End(xlUp).Row).DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
Step:=1, Trend:=False



merci encore pour votre soutien
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
4 sept. 2018 à 22:59
Re,

Est-ce ce code correspond à vos attentes :

Private Sub TextBox5_Change()

[e2] = TextBox5.Value
On Error GoTo errormessage:

Dim F As Worksheet
Dim TV As Variant
Dim I As Integer
Dim J As Integer
Dim V(0 To 5) As Variant

Set F = ActiveSheet
Me.ListBox1.Clear

With Me.ListBox1
    .ColumnCount = 6
    .ColumnWidths = "50;100;100;100;100;100"
    .RowSource = ""
End With
TV = F.Range("A3").CurrentRegion 'cela correspond à la plage A2:F28
I = 0
For J = 3 To UBound(TV, 1)
    If TV(J, 1) = Me.TextBox5.Value Then
        Me.ListBox1.AddItem
        Me.ListBox1.List(I, 1) = TV(J, 2) '=> colonne B
        Me.ListBox1.List(I, 2) = TV(J, 3) '=> colonne C
        Me.ListBox1.List(I, 3) = TV(J, 4) '=> colonne D
        Me.ListBox1.List(I, 4) = TV(J, 5) '=> colonne E
        Me.ListBox1.List(I, 5) = TV(J, 6) '=> colonne F
        I = I + 1
    End If
Next J
'tri décroissant par rapport à la colonne 2 de la ListBox1 (la note)
With Me.ListBox1
    For I = 0 To .ListCount - 1
        For J = 0 To .ListCount - 1
            If CDbl(.Column(1, I)) > CDbl(.Column(1, J)) And I <> J Then
                V(1) = .Column(1, I): .Column(1, I) = .Column(1, J): .Column(1, J) = V(1)
                V(2) = .Column(2, I): .Column(2, I) = .Column(2, J): .Column(2, J) = V(2)
                V(3) = .Column(3, I): .Column(3, I) = .Column(3, J): .Column(3, J) = V(3)
                V(4) = .Column(4, I): .Column(4, I) = .Column(4, J): .Column(4, J) = V(4)
                V(5) = .Column(5, I): .Column(5, I) = .Column(5, J): .Column(5, J) = V(5)
            End If
        Next J
    Next I
    For I = 0 To .ListCount - 1
        .Column(0, I) = I + 1
    Next I
End With
errormessage:
If Err.Number = 9 Then
MsgBox "PAS D'ELEVES DANS CETTE CATEGORIE" & vbCrLf & "vérifier votre travail"
End If
End Sub

1
Saddoud_walid Messages postés 41 Date d'inscription samedi 17 janvier 2015 Statut Membre Dernière intervention 6 novembre 2020
4 sept. 2018 à 23:27
bravo, c'est très bien....
merci encore
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
3 sept. 2018 à 09:49
Bonjour Saddoud_Walid, bonjour le forum

Je n'ai pas compris où commençait la plage des valeurs ?À adapter... J'ai utilisé une variable tableau à la place de la méthode Find, ça devrait être aussi rapide. Pour le tri décroissant j'ai converti les données en entier avec CInt. Il faudra, là aussi, peut-être adapter..

Essaie comme ça :

Private Sub TextBox5_Change()
Dim F As Worksheet
Dim TV As Variant
Dim I As Integer
Dim J As Integer
Dim V(0 To 5) As Variant

Set F = ActiveSheet
Me.ListBox1.Clear

With Me.ListBox1
    .ColumnCount = 6
    .ColumnWidths = "50;100;100;100;100;100"
    .RowSource = ""
End With
TV = F.Range("B1").CurrentRegion 'a adapter à ton cas
I = 0
For J = 4 To UBound(TV, 1)
    If InStr(1, CStr(TV(J, 1)), Me.TextBox5.Value, vbTextCompare) <> 0 Then
        Me.ListBox1.AddItem
        Me.ListBox1.List(I, 0) = J 'numéro de ligne
        Me.ListBox1.List(I, 1) = TV(J, 2) '=> colonne B
        Me.ListBox1.List(I, 2) = TV(J, 3) '=> colonne C
        Me.ListBox1.List(I, 3) = TV(J, 4) '=> colonne D
        Me.ListBox1.List(I, 4) = TV(J, 5) '=> colonne E
        Me.ListBox1.List(I, 5) = TV(J, 6) '=> colonne F
        I = I + 1
    End If
Next J
'tri décroissant par rapport à la colonne 2 de la ListBox1 (=> colonne B du tableau)
With Me.ListBox1
    For I = 0 To .ListCount - 1
        For J = 0 To .ListCount - 1
            If CInt(.Column(1, I)) > CInt(.Column(1, J)) And I <> J Then
                V(0) = .List(I, 0): .Column(0, I) = .Column(0, J): .Column(0, J) = V(0)
                V(1) = .Column(1, I): .Column(1, I) = .Column(1, J): .Column(1, J) = V(1)
                V(2) = .Column(2, I): .Column(2, I) = .Column(2, J): .Column(2, J) = V(2)
                V(3) = .Column(3, I): .Column(3, I) = .Column(3, J): .Column(3, J) = V(3)
                V(4) = .Column(4, I): .Column(4, I) = .Column(4, J): .Column(4, J) = V(4)
                V(5) = .Column(5, I): .Column(5, I) = .Column(5, J): .Column(5, J) = V(5)
            End If
        Next J
    Next I
End With
End Sub

0
Saddoud_walid Messages postés 41 Date d'inscription samedi 17 janvier 2015 Statut Membre Dernière intervention 6 novembre 2020
3 sept. 2018 à 11:08
bonjour ThauTheme
merci pour votre aide, mais j'ai une problème avec le numérotation des lignes dans la première colonne (les chiffres change d'emplacement a cause du tri).

je vous envoie mon programme:

https://www.cjoint.com/c/HIdjhonp3je

merci bien
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
3 sept. 2018 à 12:18
Re,

Je ne comprends pas ce que vous voulez. Si on fait un tri décroissant par rapport au notes, il est normal que les numéros de lignes ne soient plus dans l'ordre... Essayer me m'expliquer plus en détails le résultat que vous souhaiteriez obtenir.
0
Saddoud_walid
3 sept. 2018 à 13:05
Je vais essayer d'être clair..... La première colonne j'aime qu'il soit le numéros des lignes du listbox (1, 2, 3...) et la deuxième la note mais elle doit être trier d'une manière décroissante
Merci pour votre patience
0