XL 2013 [Résolu] Erreur: l'indice n'appartient pas à la sélection avec tableau

Lone-wolf

XLDnaute Barbatruc
Bonjour le Forum :)

J'ai un souci avec cette macro à la ligne Redim Preserve

VB:
Private Sub Lister()

    With ActiveSheet
        Bd = .Range("a2:h" & .Range("h" & Rows.Count).End(xlUp).Row)
        n = 0
    End With

    ListBox1.Clear
    For i = LBound(Bd) To UBound(Bd)
        If Bd(i, 1) Like CbEleve & "*" Then
           n = n + 1: ReDim Preserve Tbl(1 To UBound(Bd, 2), 1 To n)
            For k = 1 To UBound(Bd, 2): Tbl(k, n) = Bd(i, k): Next k
        End If
    Next i
    ListBox1.Column = Tbl

    For i = 0 To ListBox1.ListCount - 1
        ListBox1.List(i, 6) = Replace(ListBox1.List(i, 6), ",", ".")
    Next i

End Sub

Je ne comprends pas pourquoi cette ligne provoque une erreur, pourtant je l'utilise dans d'autres formulaires sans problèmes.
Si vous pourriez m'éclairer (malgré qui fasse déjà jour :D).

EDIT: j'ai trouvé. Il fallait initialiser la Listbox.
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Bonjour tout le monde :)

@eriiiic : tu as vu que j'ai édité mon premier message? Dans Userfom_Initialize, il fallait que je mette ceci

VB:
For k = 4 To 8
        If Sheets(k).Activate Then
            With Sheets(k)
                Bd = .Range("a2:h" & .Range("h" & Rows.Count).End(xlUp).Row)
            End With
        Else
            Exit For
        End If
    Next k

        With ListBox1
            .ColumnCount = 8
            .ColumnWidths = "80;80;80;120;100;100;60;60"
            .List = Bd
            .Clear
        End With

Puisque vous êtes là, j'aurais besoin de quelqu'un qui maiderait dans la gestion de 5 classes. Pour l'instant j'arrive plus ou moins à gerer une classe, j'ai donc ceci

VB:
Private Sub Resultats_Eleves()
Dim d1 As Object, d2 As Object, class As String, WsB As Worksheet, Ws As Worksheet
Dim Tablo As Variant, Tbl1, Tbl2

    Set d1 = CreateObject("Scripting.Dictionary"): Set d2 = CreateObject("Scripting.Dictionary")

    class = TextBox3.Value

    With WsB
        Tablo = .Range("a2:u" & .Range("u" & Rows.Count).End(xlUp).Row)
    End With

    On Error Resume Next

    For i = LBound(a) To UBound(a)
        If Tablo(i, 13) = "Réussi" And Tablo(i, 7) = class Then
            d1(i) = Array(Tablo(i, 2), a(i, 7), Tablo(i, 8), Tablo(i, 9), Tablo(i, 10), Tablo(i, 11), Tablo(i, 12), Tablo(i, 13))
        End If
        If a(i, 13) = "Echoué" And a(i, 7) = class Then
            d2(i) = Array(Tablo(i, 2), a(i, 7), Tablo(i, 8), Tablo(i, 9), Tablo(i, 10), Tablo(i, 11), Tablo(i, 12), Tablo(i, 13))
        End If
    Next i

    For Each Ws In ThisWorkbook.Sheets
        If Ws.Name = class Then Ws.Activate
    Next Ws
    Tbl1 = Application.Transpose(Application.Transpose(d1.items))
    Tbl2 = Application.Transpose(Application.Transpose(d2.items))

    ActiveSheet.Range("a2").Resize(UBound(Tbl1), UBound(Tbl1, 2)) = Tbl1
    Sheets("6ème").Range("a2").Resize(UBound(Tbl2), UBound(Tbl2, 2)) = Tbl2

    Set d1 = Nothing
    Set d2 = Nothing
End Sub

J'ai donc 5 classes, de la 5ème année à la 9ème. Comme le montre l'exemple tous ceux qui ont réussi passe à la classe suivante et en même temps ils faut qu'ils soient supprimés de l'ancienne; sinon ils restent dans la même classe. Ceci vaut de la 5ème à la 8ème année. Ceux qui réussisent en 9ème faut les supprimer, vu qu'ils ont fini leurs scolarité.
 

ChTi160

XLDnaute Barbatruc
Re
Pourquoi dans cette partie de la procédure , tu charges la ListBox et aussitôt tu l'effaces !
VB:
With ListBox1
            .ColumnCount = 8 'on définit le nombre de colonnes
            .ColumnWidths = "80;80;80;120;100;100;60;60" 'on définit la  largeur des Colonnes
            .List = Bd        '  Ici On charge
            .Clear               '  la On vide ,,,  à déplacer sous With ListBox1
  End With
Voilà ce que j'ai modifié dans la première procédure
' On évite entre autre une Boucle
VB:
Private Sub Lister()
Dim DerLgn As Long
Dim n As Long
    n = 0
    With ActiveSheet
     DerLgn = .Cells(.Rows.Count, 8).End(xlUp).Row
              Bd = .Range("a2:h" & DerLgn).Value
    End With
  
    For i = LBound(Bd) To UBound(Bd)
        If Bd(i, 1) Like CbEleve & "*" Then
           n = n + 1: ReDim Preserve Tbl(1 To UBound(Bd, 2), 1 To n)
            For k = 1 To UBound(Bd, 2)
             Tbl(k, n) = IIf(k = 6, Replace(Bd(i, k), ",", "."), Bd(i, k))
            Next k
        End If
    Next i
With ListBox1
     .Clear                'On efface
     .Column = Tbl 'On colle le Tableau
End With
End Sub

Ps : il est ou le fichier avec le Userform ?
Bonne fin de journée
Jean marie
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re

@job75 et @ChTi160 : Gerard, tu as parfaitement raison et suite à ta remarque j'ai modifié comme ceci:

VB:
    Classe = Array("5ème", "6ème", "7ème", "8ème", "9ème")
    For Each Sh In Sheets(Classe)
        Bd = Sh.Range("a2:h" & Sh.Range("h" & Rows.Count).End(xlUp).Row)
    Next Sh

jean marie, merci pour la modif; c'est la 1ère fois que je vois la ligne écrite comme ça.
 

ChTi160

XLDnaute Barbatruc
Re
la Ligne ???????
tu travailles depuis un Userform ?
si Oui pourquoi ne pas créer une Liste (comboBox )qui reprendrait le Nom des Feuilles (Classe)
Ainsi tu pourrais sélectionner la Classe à prendre en compte !
Pas de fichier difficile de comprendre et donc de tester et d'améliorer Lol

jean marie
 
Dernière édition:

Discussions similaires

Réponses
4
Affichages
165