Numéroter un listbox

Résolu
Saddoud_walid Messages postés 43 Statut Membre -  
Saddoud_walid Messages postés 43 Statut Membre -
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

  1. ThauTheme Messages postés 1564 Statut Membre 160
     
    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
    1. Saddoud_walid Messages postés 43 Statut Membre
       
      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
    2. Saddoud_walid Messages postés 43 Statut Membre
       
      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
  2. ThauTheme Messages postés 1564 Statut Membre 160
     
    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
    1. Saddoud_walid Messages postés 43 Statut Membre
       
      bravo, c'est très bien....
      merci encore
      0
  3. ThauTheme Messages postés 1564 Statut Membre 160
     
    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
    1. Saddoud_walid Messages postés 43 Statut Membre
       
      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
  4. ThauTheme Messages postés 1564 Statut Membre 160
     
    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
    1. Saddoud_walid
       
      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