Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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 ).

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

eriiic

XLDnaute Barbatruc
Bonjour,

Est-ce que Tbl existe en tant que tableau lors du 1er ReDim Preserve ? On ne voit pas sa déclaration ni son initialisation.
Si non il faudrait faire avant tes boucles un :
VB:
ReDim Tbl(1 To UBound(Bd, 2), 1 To 1)
eric
 

ChTi160

XLDnaute Barbatruc
Bonjour lone-wolf
Bonjour le Fil (eriiiic),le Forum

je pense a rien , j'attends la réponse des experts !
Non testé pas de fichier !
Bonne journée
Amicalement
jean marie
 
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:

Lone-wolf

XLDnaute Barbatruc
Re jean marie

@ChTi160 : oui, je travail avec un formulaire et j'utilise une combo pour les feuilles.

La ligne? Bein c'est celle-ci : Tbl(k, n) = IIf(k = 6, Replace(BD(i, k), ",", "."), BD(i, k))
Mais, ça ne fait pas de remplacement dans la listbox.
 

Lone-wolf

XLDnaute Barbatruc
Re

@ChTi160 : j'ai pris ton exemple justement, mais pas de changement. Chez toi ça fonctionne par-ce que vous utilisez la virgule en France, enfin je crois. L'usf en question est UsfMoyenne.
 

Pièces jointes

  • fichier.zip
    1 MB · Affichages: 23
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…