Résolu dictionary et listbox

Mickoik

Habitué

:ouch: tu fais ça tellement simplement que ça donne envie de pleurer
 

Mickoik

Habitué
et avant de charger la listbox, il manque des traitement.
il faut donc d'abord charger un autre tableau virtuel qu'on va "traiter"
 

drul

Obscur pro du hardware
Staff
Regarde ceci pour les listbox à plusieurs dimensions:

Code:
Sub retest()
With ListBox21
    .ColumnCount = 3
    .ColumnWidths = "60;60;60"
    .AddItem
    .List(.ListCount - 1, 0) = "a"
    .List(.ListCount - 1, 1) = "b"
    .List(.ListCount - 1, 2) = "c"
End With
End Sub

Pour le 2eme tableau ben ok, faut faire quoi comme traitement ?
 

Mickoik

Habitué


Bonjour,
je pense que c'est presque fini

je te mets où j'en suis dans mon code d'abord :
Code:
Dim tab_donnees()
Dim tab_recup()

Dim derligne_donnees As Integer


' je recupère ma base
derligne_donnees = Sheets("Gestion des installations").Range("O" & Rows.Count).End(xlUp).Row

ReDim tab_donnees(derligne_donnees, 8)

    For i = 1 To derligne_donnees
        tab_donnees(i, 0) = Sheets("Gestion des installations").Range("A" & i)
        tab_donnees(i, 1) = Sheets("Gestion des installations").Range("N" & i)
        tab_donnees(i, 2) = Sheets("Gestion des installations").Range("O" & i)
        tab_donnees(i, 3) = Sheets("Gestion des installations").Range("M" & i)
        tab_donnees(i, 4) = Sheets("Gestion des installations").Range("P" & i)
        tab_donnees(i, 5) = Sheets("Gestion des installations").Range("Q" & i)
        tab_donnees(i, 6) = Sheets("Gestion des installations").Range("R" & i)
        tab_donnees(i, 7) = Sheets("Gestion des installations").Range("S" & i)
    
    Next



' je compte le nombre de ligne de mon tableau resultats

For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)

If clientbox = tab_donnees(i, 0) Then

n = n + 1

End If

Next

 
' je charge mon tableau de resultats

Dim derligne_recup As Integer

derligne_recup = n

 
ReDim tab_recup(derligne_recup, 8)

 
For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)
For k = 1 To derligne_recup

If clientbox = tab_donnees(i, 0) Then
tab_recup(k, 0) = tab_donnees(i, 3)
tab_recup(k, 1) = tab_donnees(i, 1)
tab_recup(k, 2) = tab_donnees(i, 2)
tab_recup(k, 3) = tab_donnees(i, 4)
tab_recup(k, 4) = tab_donnees(i, 5)
tab_recup(k, 5) = tab_donnees(i, 6)
tab_recup(k, 6) = tab_donnees(i, 7)
tab_recup(k, 7) = tab_donnees(i, 8)

End If
Next
Next

maintenant je dois transformer mon tableau qui fait 8 colonnes en un tableau à 3 colonnes je comblerai les trous après.
J'ai écris ça mais il me dit que la sélection n’appartient pas à l'indice

Code:
Dim tab_donnees()
Dim tab_recup()

Dim derligne_donnees As Integer


' je recupère ma base
derligne_donnees = Sheets("Gestion des installations").Range("O" & Rows.Count).End(xlUp).Row

ReDim tab_donnees(derligne_donnees, 8)

    For i = 1 To derligne_donnees
        tab_donnees(i, 0) = Sheets("Gestion des installations").Range("A" & i) 'client
        tab_donnees(i, 1) = Sheets("Gestion des installations").Range("N" & i) 'date
        tab_donnees(i, 2) = Sheets("Gestion des installations").Range("O" & i) 'nombre de cameras
        tab_donnees(i, 3) = Sheets("Gestion des installations").Range("M" & i) 'type camera
        tab_donnees(i, 4) = Sheets("Gestion des installations").Range("P" & i) 'type ecran
        tab_donnees(i, 5) = Sheets("Gestion des installations").Range("Q" & i) 'type dvr
        tab_donnees(i, 6) = Sheets("Gestion des installations").Range("R" & i) 'type DD
        tab_donnees(i, 7) = Sheets("Gestion des installations").Range("S" & i) 'type alim
    
    Next



' je compte le nombre de ligne de mon tableau resultats

For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)

If clientbox = tab_donnees(i, 0) Then

n = n + 1

End If

Next

 
' je charge mon tableau de resultats et transforme mon tableau en 3 colonnes en comblant les trous (que je ferai après)

Dim derligne_recup As Integer

derligne_recup = n * 7

 
ReDim tab_recup(derligne_recup, 3)

 
For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)
For k = 1 To derligne_recup

If clientbox = tab_donnees(i, 0) Then
tab_recup(k, 0) = tab_donnees(i, 2) 'nb de matos
tab_recup(k, 1) = tab_donnees(i, 3) 'matos
tab_recup(k, 2) = tab_donnees(i, 1) 'date

tab_recup(k + 1, 0) = tab_donnees(i, 2) 'mettre si >1
tab_recup(k + 1, 1) = tab_donnees(i, 4)
tab_recup(k + 1, 2) = tab_donnees(i, 1) 'mettre si pas de date

tab_recup(k + 2, 0) = tab_donnees(i, 2) 'mettre si >1
tab_recup(k + 2, 1) = tab_donnees(i, 5)
tab_recup(k + 2, 2) = tab_donnees(i, 1) 'mettre si pas de date

tab_recup(k + 3, 0) = tab_donnees(i, 2) 'mettre si >1
tab_recup(k + 3, 1) = tab_donnees(i, 6)
tab_recup(k + 3, 2) = tab_donnees(i, 1) 'mettre si pas de date

tab_recup(k + 4, 0) = tab_donnees(i, 2) 'mettre si >1
tab_recup(k + 4, 1) = tab_donnees(i, 7)
tab_recup(k + 4, 2) = tab_donnees(i, 1) 'mettre si pas de date





End If
Next
Next

Sheets("Feuil1").Range("D36:F1500") = tab_recup 'juste pour voir si c'est bon
 

drul

Obscur pro du hardware
Staff
Ton problème vient de :
Code:
derligne_recup = n * 7 'd'ou vient ce 7 ?
ReDim tab_recup(derligne_recup, 3)
'...
For k = 1 To derligne_recup 'l'erreur est à mon avis ici, la bonne formule est sûrement "For k = 1 To n"
'...
tab_recup(k + 1, 0) = tab_donnees(i, 2) 'indice hors limite !
ton tableau à derligne_recup ligne, et par la boucle tu essaye d'aller taper en derligne_recup +1, ça ne peut pas marcher
 

Mickoik

Habitué


ça a l'ai de marcher quand j’arrête la macro et que je pointe avec la souris sur les éléments il m'affiche bien le bon élément mais quand il charge le tableau dans la feuille ça n'affiche pas toutes les infos. Je me suis trompé dans la boucle ?
Code:
Dim derligne_recup As Integer

derligne_recup = n * 3
client_sel = Me.Listrecherche.Column(0)
 
ReDim tab_recup(derligne_recup, 3)

 
For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)
For k = 1 To n

If client_sel = tab_donnees(i, 0) Then
tab_recup(k, 0) = tab_donnees(i, 2) 'nb de matos
tab_recup(k, 1) = tab_donnees(i, 3) 'matos
tab_recup(k, 2) = tab_donnees(i, 1) 'date

tab_recup(k + 1, 0) = tab_donnees(i, 2) 'mettre si >1
tab_recup(k + 1, 1) = tab_donnees(i, 4)
tab_recup(k + 1, 2) = tab_donnees(i, 1) 'mettre si pas de date

tab_recup(k + 2, 0) = tab_donnees(i, 2) 'mettre si >1
tab_recup(k + 2, 1) = tab_donnees(i, 5)
tab_recup(k + 2, 2) = tab_donnees(i, 1) 'mettre si pas de date

tab_recup(k + 3, 0) = tab_donnees(i, 2) 'mettre si >1
tab_recup(k + 3, 1) = tab_donnees(i, 6)
tab_recup(k + 3, 2) = tab_donnees(i, 1) 'mettre si pas de date

tab_recup(k + 4, 0) = tab_donnees(i, 2) 'mettre si >1
tab_recup(k + 4, 1) = tab_donnees(i, 7)
tab_recup(k + 4, 2) = tab_donnees(i, 1) 'mettre si pas de date

End If
Next
Next

Sheets("Feuil1").Range("D36:F" & n + 36) = tab_recup 'juste pour voir si c'est bon



 

drul

Obscur pro du hardware
Staff
Oui :D

Essayes un truc comme ça:
Code:
derligne_recup = n * 5
client_sel = Me.Listrecherche.Column(0)
 
ReDim tab_recup(derligne_recup, 3)
 
 
For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)
    For k = 1 To n
        l = 1 + (k - 1) * 5
        If client_sel = tab_donnees(i, 0) Then
        tab_recup(l, 0) = tab_donnees(i, 2) 'nb de matos
        tab_recup(l, 1) = tab_donnees(i, 3) 'matos
        tab_recup(l, 2) = tab_donnees(i, 1) 'date
         
        tab_recup(l + 1, 0) = tab_donnees(i, 2) 'mettre si >1
        tab_recup(l + 1, 1) = tab_donnees(i, 4)
        tab_recup(l + 1, 2) = tab_donnees(i, 1) 'mettre si pas de date
         
        tab_recup(l + 2, 0) = tab_donnees(i, 2) 'mettre si >1
        tab_recup(l + 2, 1) = tab_donnees(i, 5)
        tab_recup(l + 2, 2) = tab_donnees(i, 1) 'mettre si pas de date
         
        tab_recup(l + 3, 0) = tab_donnees(i, 2) 'mettre si >1
        tab_recup(l + 3, 1) = tab_donnees(i, 6)
        tab_recup(l + 3, 2) = tab_donnees(i, 1) 'mettre si pas de date
         
        tab_recup(l + 4, 0) = tab_donnees(i, 2) 'mettre si >1
        tab_recup(l + 4, 1) = tab_donnees(i, 7)
        tab_recup(l + 4, 2) = tab_donnees(i, 1) 'mettre si pas de date
         
        End If
    Next
Next
 

Mickoik

Habitué

non ça fait la même chose
 

Mickoik

Habitué
Comme ça ça marche presque :

Code:
ReDim tab_recup(derligne_recup, 3)

 
For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)
For k = 1 To n
 
If clientbox = tab_donnees(i, 0) Then
tab_recup(k, 0) = tab_donnees(i, 2) 'nb de matos
tab_recup(k, 1) = tab_donnees(i, 3) 'matos
tab_recup(k, 2) = tab_donnees(i, 1) 'date
 
tab_recup(k + 1, 0) = tab_donnees(i, 2) 'mettre si >1
tab_recup(k + 1, 1) = tab_donnees(i, 4)
tab_recup(k + 1, 2) = tab_donnees(i, 1) 'mettre si pas de date
 
tab_recup(k + 2, 0) = tab_donnees(i, 2) 'mettre si >1
tab_recup(k + 2, 1) = tab_donnees(i, 5)
tab_recup(k + 2, 2) = tab_donnees(i, 1) 'mettre si pas de date
 
tab_recup(k + 3, 0) = tab_donnees(i, 2) 'mettre si >1
tab_recup(k + 3, 1) = tab_donnees(i, 6)
tab_recup(k + 3, 2) = tab_donnees(i, 1) 'mettre si pas de date
 
tab_recup(k + 4, 0) = tab_donnees(i, 2) 'mettre si >1
tab_recup(k + 4, 1) = tab_donnees(i, 7)
tab_recup(k + 4, 2) = tab_donnees(i, 1) 'mettre si pas de date
End If
Next
Next
 

drul

Obscur pro du hardware
Staff
Je vois pas comment ça peut marcher:
1°) k=1 --> tu ecris les lignes 1,2,3,4
2°) k=2 --> tu écris les lignes 2,3,4,5 --> tu écrases les données précédentes ...
 

Mickoik

Habitué
Pour simplifier le truc pour comprendre ce qui se passe, j'ai écris comme ça :
Code:
Dim derligne_recup As Integer

derligne_recup = n * 5

 
ReDim tab_recup(derligne_recup, 3)

 
For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)
For k = 1 To n
 
If clientbox = tab_donnees(i, 0) Then
tab_recup(k, 0) = tab_donnees(i, 2) 'nb de matos
tab_recup(k, 1) = tab_donnees(i, 3) 'matos
tab_recup(k, 2) = tab_donnees(i, 1) 'date
 

End If
Next
Next


With Sheets("Feuil1")
Range("D38:F48") = tab_recup
End With

en fait quand les cases sont vides, il remplace tout simplement la celule qu'il avait remplie par un vide.
je vais tenter quelque chose
 

Mickoik

Habitué


exactement !
fait alors il faut écrire comment ?
 

drul

Obscur pro du hardware
Staff
Ben c'était l'idée ici:

For k = 1 To n
l = 1 + (k - 1) * 5
If client_sel = tab_donnees(i, 0) Then
tab_recup(l, 0) = tab_donnees(i, 2) 'nb de matos
tab_recup(l, 1) = tab_donnees(i, 3) 'matos
tab_recup(l, 2) = tab_donnees(i, 1) 'date

1°) k=1 --> l = 1+5*0 = 1 --> on écris 1,2,3,4,5
2°) k=2 --> l = 1+5*1 = 6 --> on écris 6,7,8,9,10
...
 

Mickoik

Habitué


ça écrase quand même
 

Mickoik

Habitué
quand ça chargeait une feuille de calcul, le code qui marchait était ça :

Code:
For Each macellule In client_materiel
If macellule = client.Value Then


Sheets("Gestion des installations").Cells(macellule.Row, 15).Copy Destination:=Sheets("Rechercher Client").Range("BA" & Rows.Count).End(xlUp).Offset(1, 0)

derligcam = Sheets("Rechercher Client").Range("BA" & Rows.Count).End(xlUp).Row

Sheets("Gestion des installations").Cells(macellule.Row, 13).Copy Destination:=Sheets("Rechercher Client").Range("BB" & derligcam)
Sheets("Gestion des installations").Cells(macellule.Row, 14).Copy Destination:=Sheets("Rechercher Client").Range("AZ" & derligcam)

Sheets("Gestion des installations").Cells(macellule.Row, 16).Copy Destination:=Sheets("Rechercher Client").Range("BA" & Rows.Count).End(xlUp).Offset(1, 0)
Sheets("Gestion des installations").Cells(macellule.Row, 17).Copy Destination:=Sheets("Rechercher Client").Range("BA" & Rows.Count).End(xlUp).Offset(1, 0)
Sheets("Gestion des installations").Cells(macellule.Row, 18).Copy Destination:=Sheets("Rechercher Client").Range("BA" & Rows.Count).End(xlUp).Offset(1, 0)
Sheets("Gestion des installations").Cells(macellule.Row, 19).Copy Destination:=Sheets("Rechercher Client").Range("BA" & Rows.Count).End(xlUp).Offset(1, 0)
Sheets("Gestion des installations").Cells(macellule.Row, 20).Copy Destination:=Sheets("Rechercher Client").Range("BA" & Rows.Count).End(xlUp).Offset(1, 0)

End If
Next
 

Mickoik

Habitué



Code:
'recherche du matériel
Dim tab_donnees()
Dim tab_recup()

Dim derligne_donnees As Integer


' je recupère ma base
derligne_donnees = Sheets("Gestion des installations").Range("O" & Rows.Count).End(xlUp).Row

ReDim tab_donnees(derligne_donnees, 8)

    For i = 1 To derligne_donnees
        tab_donnees(i, 0) = Sheets("Gestion des installations").Range("A" & i) 'client
        tab_donnees(i, 1) = Sheets("Gestion des installations").Range("M" & i) 'date
        tab_donnees(i, 2) = Sheets("Gestion des installations").Range("N" & i) 'nombre de cameras
        tab_donnees(i, 3) = Sheets("Gestion des installations").Range("O" & i) 'type camera
        tab_donnees(i, 4) = Sheets("Gestion des installations").Range("P" & i) 'type ecran
        tab_donnees(i, 5) = Sheets("Gestion des installations").Range("Q" & i) 'type dvr
        tab_donnees(i, 6) = Sheets("Gestion des installations").Range("R" & i) 'type DD
        tab_donnees(i, 7) = Sheets("Gestion des installations").Range("S" & i) 'type alim
    
    Next



' je compte le nombre de ligne de mon tableau resultats

For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)

If clientbox = tab_donnees(i, 0) Then

n = n + 1

End If

Next

 
' je charge mon tableau de resultats et transforme mon tableau en 3 colonnes en comblant les trous

Dim derligne_recup As Integer

derligne_recup = n * 5

 
ReDim tab_recup(derligne_recup, 3)
 
 
For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)
    For k = 1 To n
        l = 1 + (k - 1) * 5
        If client_sel = tab_donnees(i, 0) Then
        tab_recup(l, 0) = tab_donnees(i, 2) 'nb de matos
        tab_recup(l, 1) = tab_donnees(i, 3) 'matos
        tab_recup(l, 2) = tab_donnees(i, 1) 'date
 
        tab_recup(l + 1, 0) = tab_donnees(i, 2) 'mettre si >1
        tab_recup(l + 1, 1) = tab_donnees(i, 4)
        tab_recup(l + 1, 2) = tab_donnees(i, 1) 'mettre si pas de date
 
        tab_recup(l + 2, 0) = tab_donnees(i, 2) 'mettre si >1
        tab_recup(l + 2, 1) = tab_donnees(i, 5)
        tab_recup(l + 2, 2) = tab_donnees(i, 1) 'mettre si pas de date
 
        tab_recup(l + 3, 0) = tab_donnees(i, 2) 'mettre si >1
        tab_recup(l + 3, 1) = tab_donnees(i, 6)
        tab_recup(l + 3, 2) = tab_donnees(i, 1) 'mettre si pas de date
 
        tab_recup(l + 4, 0) = tab_donnees(i, 2) 'mettre si >1
        tab_recup(l + 4, 1) = tab_donnees(i, 7)
        tab_recup(l + 4, 2) = tab_donnees(i, 1) 'mettre si pas de date

End If
Next
Next


With Sheets("Feuil1")
Range("D38:F48") = tab_recup
End With
 

drul

Obscur pro du hardware
Staff
Y a quand même un truc qui me chiffonne avec ta double boucle ...

Tu pourrais essayer ça ?
Code:
Dim tab_donnees()
 
Dim derligne_donnees As Integer

 
 
' je recupère ma base

derligne_donnees = Sheets("Gestion des installations").Range("O" & Rows.Count).End(xlUp).Row

 
ReDim tab_donnees(derligne_donnees, 8)

 
For i = 1 To derligne_donnees

    tab_donnees(i, 0) = Sheets("Gestion des installations").Range("A" & i)

    tab_donnees(i, 1) = Sheets("Gestion des installations").Range("N" & i)

    tab_donnees(i, 2) = Sheets("Gestion des installations").Range("O" & i)

    tab_donnees(i, 3) = Sheets("Gestion des installations").Range("M" & i)

    tab_donnees(i, 4) = Sheets("Gestion des installations").Range("P" & i)

    tab_donnees(i, 5) = Sheets("Gestion des installations").Range("Q" & i)

    tab_donnees(i, 6) = Sheets("Gestion des installations").Range("R" & i)

    tab_donnees(i, 7) = Sheets("Gestion des installations").Range("S" & i)


Next

 
' je compte le nombre de ligne de mon tableau resultats

listMatos.Clear

For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)

    If clientbox = tab_donnees(i, 0) Then
    
        listMatos.AddItem tab_donnees(i, 3), listMatos.ListCount
    
    End If

Next

 

 

End Sub
Sub retest()
With ListBox21
.ColumnHeads
    .ColumnCount = 3
    .ColumnWidths = "60;60;60"
    .AddItem
    .List(.ListCount - 1, 0) = "a"
    .List(.ListCount - 1, 1) = "b"
    .List(.ListCount - 1, 2) = "c"
End With




End Sub
Sub clearbox()
'recherche du matériel
Dim tab_donnees()
Dim tab_recup()
 
Dim derligne_donnees As Integer
 
 
' je recupère ma base
derligne_donnees = Sheets("Gestion des installations").Range("O" & Rows.Count).End(xlUp).Row
 
ReDim tab_donnees(derligne_donnees, 8)
 
    For i = 1 To derligne_donnees
        tab_donnees(i, 0) = Sheets("Gestion des installations").Range("A" & i) 'client
        tab_donnees(i, 1) = Sheets("Gestion des installations").Range("M" & i) 'date
        tab_donnees(i, 2) = Sheets("Gestion des installations").Range("N" & i) 'nombre de cameras
        tab_donnees(i, 3) = Sheets("Gestion des installations").Range("O" & i) 'type camera
        tab_donnees(i, 4) = Sheets("Gestion des installations").Range("P" & i) 'type ecran
        tab_donnees(i, 5) = Sheets("Gestion des installations").Range("Q" & i) 'type dvr
        tab_donnees(i, 6) = Sheets("Gestion des installations").Range("R" & i) 'type DD
        tab_donnees(i, 7) = Sheets("Gestion des installations").Range("S" & i) 'type alim
 
    Next
 
 
 
' je compte le nombre de ligne de mon tableau resultats
 
For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)
 
If clientbox = tab_donnees(i, 0) Then
 
n = n + 1
 
End If
 
Next
 
 
' je charge mon tableau de resultats et transforme mon tableau en 3 colonnes en comblant les trous
 
Dim derligne_recup As Integer
 
derligne_recup = n * 5
 
 
ReDim tab_recup(derligne_recup, 3)

k = 1
For i = LBound(tab_donnees, 1) To UBound(tab_donnees, 1)
           
    If client_sel = tab_donnees(i, 0) Then
       tab_recup(k, 0) = tab_donnees(i, 2) 'nb de matos
       tab_recup(k, 1) = tab_donnees(i, 3) 'matos
       tab_recup(k, 2) = tab_donnees(i, 1) 'date

       tab_recup(k + 1, 0) = tab_donnees(i, 2) 'mettre si >1
       tab_recup(k + 1, 1) = tab_donnees(i, 4)
       tab_recup(k + 1, 2) = tab_donnees(i, 1) 'mettre si pas de date

       tab_recup(k + 2, 0) = tab_donnees(i, 2) 'mettre si >1
       tab_recup(k + 2, 1) = tab_donnees(i, 5)
       tab_recup(k + 2, 2) = tab_donnees(i, 1) 'mettre si pas de date

       tab_recup(k + 3, 0) = tab_donnees(i, 2) 'mettre si >1
       tab_recup(k + 3, 1) = tab_donnees(i, 6)
       tab_recup(k + 3, 2) = tab_donnees(i, 1) 'mettre si pas de date

       tab_recup(k + 4, 0) = tab_donnees(i, 2) 'mettre si >1
       tab_recup(k + 4, 1) = tab_donnees(i, 7)
       tab_recup(k + 4, 2) = tab_donnees(i, 1) 'mettre si pas de date
       
       k = k + 5
    End If

Next
 
 
With Sheets("Feuil1")
Range("D38:F48") = tab_recup
End With
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 156
Messages
6 718 476
Membres
1 586 439
Dernier membre
Thailounette
Partager cette page
Haut