Condition dans listbox

Bonjour,

J’ai un problème de condition dans ma listbox …car j’ai fait une première condition puis j’ai voulu ajouter une autre mais je trouve une difficulté …. Je veux fusionner deux valeur en double (Me.ListBox1.List(I, 3)) et avoir la somme de la valeur (Me.ListBox1.List(I, 4)) en gardent la condition sur la (Me.ListBox1.List(I, 4))
Merci d’avance pour tout aide

le code :

Set F = ActiveSheet
Me.ListBox1.Clear

With ListBox1
.ColumnCount = 8
.ColumnWidths = "0;30;70;100;70;70;70;0"
.RowSource = ""
End With

Set plage = F.[b4].CurrentRegion
Set plage = ActiveSheet.Range("a5:a30000")
Set c = plage.Find("code", , , xlPart)
If Not c Is Nothing Then
I = 0
premier = c.Address

Do
Me.ListBox1.AddItem
Me.ListBox1.List(I, 0) = c.Offset(0, 0)
Me.ListBox1.List(I, 1) = c.Offset(0, 0)
Me.ListBox1.List(I, 2) = c.Offset(0, 1)
Me.ListBox1.List(I, 3) = c.Offset(0, 2)
Me.ListBox1.List(I, 4) = c.Offset(0, 15)

If c.Offset(0, 15) < Val(TextBox2.Value) Then Me.ListBox1.List(I, 5) = c.Offset(0, 15) / 2
If c.Offset(0, 15) >= Val(TextBox2.Value) Then Me.ListBox1.List(I, 5) = c.Offset(0, 15) - TextBox1.Value

If c.Offset(0, 15) >= Val(TextBox2.Value) Then Me.ListBox1.List(I, 6) = TextBox1.Value
If c.Offset(0, 15) < Val(TextBox2.Value) Then Me.ListBox1.List(I, 6) = c.Offset(0, 15) / 2

Me.ListBox1.List(I, 7) = c.Offset(0, 3)
I = I + 1
Set c = plage.FindNext(c)

Loop While Not c Is Nothing And c.Address <> premier

End If

Dim m As Integer
Dim j As Integer
Dim V(0 To 7) As Variant

With Me.ListBox1
For m = 0 To .ListCount - 1
For j = 0 To .ListCount - 1
If .Column(0, m) > .Column(0, j) And m <> j Then
V(0) = .Column(0, m): .Column(0, m) = .Column(0, j): .Column(0, j) = V(0)
V(1) = .Column(1, m): .Column(1, m) = .Column(1, j): .Column(1, j) = V(1)
V(2) = .Column(2, m): .Column(2, m) = .Column(2, j): .Column(2, j) = V(2)
V(3) = .Column(3, m): .Column(3, m) = .Column(3, j): .Column(3, j) = V(3)
V(4) = .Column(4, m): .Column(4, m) = .Column(4, j): .Column(4, j) = V(4)
V(5) = .Column(5, m): .Column(5, m) = .Column(5, j): .Column(5, j) = V(5)
V(6) = .Column(6, m): .Column(6, m) = .Column(6, j): .Column(6, j) = V(6)
V(7) = .Column(7, m): .Column(7, m) = .Column(7, j): .Column(7, j) = V(7)

End If
Next j
Next m
For m = 0 To .ListCount - 1
.Column(1, m) = m + 1
Next m
End With

pour mieux comprendre https://wetransfer.com/downloads/12d3f7165927d113c76d22876b1c14b620201106094232/47c62c

3 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    bonjour,
    peux-tu utiliser les balises de code quand tu partages du code (et préciser "basic" pour du VBA): https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

    je ne comprends pas ce qu'est une condition dans une listbox.
    ni ce que signifie "faire une condition"
    je ne comprends pas non plus la suite de ton explication.

    peux-tu être plus factuel, peut-être en donnant des exemples, en faisant référence à des lignes de code et à des cellules dans les feuilles?
    1. salut yg_be

      pour mieux comprendre vous pouvez télécharger ce ficher https://wetransfer.com/downloads/12d3f7165927d113c76d22876b1c14b620201106094232/47c62c

      comme vous voyer il y a une condition sur Me.ListBox1.List(I, 4) si elle est inférieure ou supérieure a textbox2... Je veux fusionner deux valeur en double (Me.ListBox1.List(I, 3)) et avoir la somme des deux valeurs en double dans (Me.ListBox1.List(I, 4))
      mon code est:

      Set F = ActiveSheet
      Me.ListBox1.Clear
      
      With ListBox1
      .ColumnCount = 8
      .ColumnWidths = "0;30;70;100;70;70;70;0"
      .RowSource = ""
      End With
      
      
      Set plage = F.[b4].CurrentRegion
      Set plage = ActiveSheet.Range("a5:a30000")
      Set c = plage.Find("code", , , xlPart)
      If Not c Is Nothing Then
      I = 0
      premier = c.Address
      
      Do
      Me.ListBox1.AddItem
      Me.ListBox1.List(I, 0) = c.Offset(0, 0)
      Me.ListBox1.List(I, 1) = c.Offset(0, 0)
      Me.ListBox1.List(I, 2) = c.Offset(0, 1)
      Me.ListBox1.List(I, 3) = c.Offset(0, 2)
      Me.ListBox1.List(I, 4) = c.Offset(0, 15)
      
      If c.Offset(0, 15) < Val(TextBox2.Value) Then Me.ListBox1.List(I, 5) = c.Offset(0, 15) / 2
      If c.Offset(0, 15) >= Val(TextBox2.Value) Then Me.ListBox1.List(I, 5) = c.Offset(0, 15) - TextBox1.Value
      
      If c.Offset(0, 15) >= Val(TextBox2.Value) Then Me.ListBox1.List(I, 6) = TextBox1.Value
      If c.Offset(0, 15) < Val(TextBox2.Value) Then Me.ListBox1.List(I, 6) = c.Offset(0, 15) / 2
      
      Me.ListBox1.List(I, 7) = c.Offset(0, 3)
      I = I + 1
      Set c = plage.FindNext(c)
      
      Loop While Not c Is Nothing And c.Address <> premier
      
      End If
      1. Contributeur
        il faut choisir "basic" pour du VBA.

        j'ai analysé le fichier.

        je ne comprends pas ce veut dire "fusionner deux valeur en double (Me.ListBox1.List(I, 3)": où sont ces valeurs dans le classeur?
    2. cliquer sur le bouton "Résumer" du userform et vous trouver le doublon
      1. Contributeur
        pour "fusionner", il faut alors, avant de faire
        Me.ListBox1.AddItem
        , vérifier si la valeur est déjà présente dans la liste, et modifier la ligne existante, au lieu d'en ajouter une nouvelle.
      2. @yg_beexactement ... comment le faire :(
      3. Contributeur
        @Saddoud_walidun exemple:
        Option Explicit
        Sub tri(a(), gauc, droi, NbCol, colTri)        ' Quick sort
         Dim ref, g, d, c, temp
         On Error GoTo errormessage:
        
         ref = a((gauc + droi) \ 2, colTri)
         g = gauc: d = droi
         Do
             Do While a(g, colTri) < ref: g = g + 1: Loop
             Do While ref < a(d, colTri): d = d - 1: Loop
             If g <= d Then
               For c = 0 To NbCol - 1
                 temp = a(g, c): a(g, c) = a(d, c): a(d, c) = temp
               Next
               g = g + 1: d = d - 1
             End If
         Loop While g <= d
         If g < droi Then Call tri(a, g, droi, NbCol, colTri)
         If gauc < d Then Call tri(a, gauc, d, NbCol, colTri)
        
        errormessage:
        If Err.Number = 9 Then
        MsgBox "Pas de Réservations pour Imprimer"
        End If
        End Sub
        
        Private Sub CommandButton1_Click()
        Dim li As Integer, doublon As Boolean
        Dim F As Worksheet, plage As Range, c, I As Long, premier As String, NbCol, g As Long
        Worksheets("01").Select
         
         
         Set F = ActiveSheet
           Me.ListBox1.Clear
         
         With ListBox1
        .ColumnCount = 8
        .ColumnWidths = "0;30;70;100;70;70;70;0"
        .RowSource = ""
        End With
        
                    
           Set plage = F.[b4].CurrentRegion
              Set plage = ActiveSheet.Range("a5:a30000")
           Set c = plage.Find("code", , , xlPart)
           If Not c Is Nothing Then
             I = 0
             premier = c.Address
             
           Do
               doublon = False
               For li = 0 To Me.ListBox1.ListCount - 1
                    If Me.ListBox1.List(li, 2) = CStr(c.Offset(0, 1)) Then
                        doublon = True
                        Exit For
                    End If
               Next li
               If doublon Then
                    ' ...
               Else
                    Me.ListBox1.AddItem
                    Me.ListBox1.List(I, 0) = c.Offset(0, 0)
                    Me.ListBox1.List(I, 1) = c.Offset(0, 0)
                    Me.ListBox1.List(I, 2) = c.Offset(0, 1)
                    Me.ListBox1.List(I, 3) = c.Offset(0, 2)
                    Me.ListBox1.List(I, 4) = c.Offset(0, 15)
                    
                    If c.Offset(0, 15) < Val(TextBox2.Value) Then Me.ListBox1.List(I, 5) = c.Offset(0, 15) / 2
                    If c.Offset(0, 15) >= Val(TextBox2.Value) Then Me.ListBox1.List(I, 5) = c.Offset(0, 15) - TextBox1.Value
                    
                    If c.Offset(0, 15) >= Val(TextBox2.Value) Then Me.ListBox1.List(I, 6) = TextBox1.Value
                    If c.Offset(0, 15) < Val(TextBox2.Value) Then Me.ListBox1.List(I, 6) = c.Offset(0, 15) / 2
                     
                     Me.ListBox1.List(I, 7) = c.Offset(0, 3)
                    I = I + 1
                End If
               Set c = plage.FindNext(c)
             
           Loop While Not c Is Nothing And c.Address <> premier
                   
        End If
           
        
           Dim a()
           a = Me.ListBox1.List
           NbCol = UBound(a, 2) - LBound(a, 2) + 1
           Call tri(a(), LBound(a), UBound(a), NbCol, 2)
           Me.ListBox1.List = a
        
        
         
        Dim m As Integer
        Dim j As Integer
        Dim V(0 To 7) As Variant
         
        With Me.ListBox1
            For m = 0 To .ListCount - 1
                For j = 0 To .ListCount - 1
                    If .Column(0, m) > .Column(0, j) And m <> j Then
                        V(0) = .Column(0, m): .Column(0, m) = .Column(0, j): .Column(0, j) = V(0)
                        V(1) = .Column(1, m): .Column(1, m) = .Column(1, j): .Column(1, j) = V(1)
                        V(2) = .Column(2, m): .Column(2, m) = .Column(2, j): .Column(2, j) = V(2)
                        V(3) = .Column(3, m): .Column(3, m) = .Column(3, j): .Column(3, j) = V(3)
                        V(4) = .Column(4, m): .Column(4, m) = .Column(4, j): .Column(4, j) = V(4)
                        V(5) = .Column(5, m): .Column(5, m) = .Column(5, j): .Column(5, j) = V(5)
                        V(6) = .Column(6, m): .Column(6, m) = .Column(6, j): .Column(6, j) = V(6)
                        V(7) = .Column(7, m): .Column(7, m) = .Column(7, j): .Column(7, j) = V(7)
                        
                        
                        
                    End If
                Next j
            Next m
            For m = 0 To .ListCount - 1
                .Column(1, m) = m + 1
            Next m
        End With
          
          
        
        Dim z As Single, FF As Long, k 'déclare la variable T (Total) / Type à adapter
        With ListBox1 'prend en compte la ListBox1 (à adapter)
            For FF = 0 To .ListCount - 1 'boucle sur tous les lignes de la ListBox1
                z = z + .Column(4, FF) 'définit le total T (à adapter car tu parles de la colonne 7 et la c'est la "7ème" colonne)
            Next FF 'prochaine ligne de la boucle
            
            
            TextBox3.Value = FormatNumber(z, 3) 'renvoie dans la TextBox1 le total T (à adapter)
        End With 'fin de la prise en compte de la ListBox1
        
        Dim d As Single 'déclare la variable T (Total) / Type à adapter
        With ListBox1 'prend en compte la ListBox1 (à adapter)
            For g = 0 To .ListCount - 1 'boucle sur tous les lignes de la ListBox1
                d = d + .Column(5, g) 'définit le total T (à adapter car tu parles de la colonne 7 et la c'est la "7ème" colonne)
            Next g 'prochaine ligne de la boucle
            
            
            TextBox4.Value = FormatNumber(d, 3) 'renvoie dans la TextBox1 le total T (à adapter)
        End With 'fin de la prise en compte de la ListBox1
        
        Dim h As Single 'déclare la variable T (Total) / Type à adapter
        With ListBox1 'prend en compte la ListBox1 (à adapter)
            For k = 0 To .ListCount - 1 'boucle sur tous les lignes de la ListBox1
                h = h + .Column(6, k) 'définit le total T (à adapter car tu parles de la colonne 7 et la c'est la "7ème" colonne)
            Next k 'prochaine ligne de la boucle
            
            
            TextBox5.Value = FormatNumber(h, 3) 'renvoie dans la TextBox1 le total T (à adapter)
        End With 'fin de la prise en compte de la ListBox1
        
        
        End Sub
        
        Private Sub UserForm_Initialize()
        TextBox1.Value = 600
        TextBox2.Value = 1000
        
        
        
        End Sub
        
      4. @yg_bemerci pour votre effort mais vous avez supprimer les doublons mais le résultat qui reste n'est pas la somme de deux (ou plusieurs) valeurs (Total)
        je veux avoir la somme des deux (ou plusieurs) valeurs du doublon de tel sorte que j'aurai a la fin un seul matricule avec la somme de valeurs (total )
        merci encore
      5. Contributeur
        @Saddoud_waliden effet, j'ai laissé de la place à la ligne 59 pour que tu puisses faire cette partie du travail.