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:

eriiiic

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:

job75

XLDnaute Barbatruc
Bonjour à tous,
Donc si tu n'est pas en Option Base 1 et que tu fais :
VB:
ReDim Preserve Tbl(1 To UBound(Bd, 2), 1 To n)
il se peut que tu es un message d'erreur
Pas du tout, il suffit de tester :
Code:
Option Base 0

Sub Test()
Dim tbl, n
ReDim tbl(1 To 2, 1 To 1)
n = 4
ReDim Preserve tbl(1 To 2, 1 To n)
End Sub
A+
 

ChTi160

XLDnaute Barbatruc
Re
Effectivement !!!!! Lol
Bon , j'efface mes bêtises ......
j'attends donc la réponse !
et je passe a autre chose .
Bonne journée
Amicalement
jean marie
 

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.
 

ChTi160

XLDnaute Barbatruc
Non ! pas a partir de la ListBox
mais dans le tableau et ça colle le tableau dans la ListBox .
voir mon fichier joint #9 , Colonne 6 qui est traitée .
pas évident sans fichier .......
un formulaire et j'utilise une combo pour les feuilles
jean marie
 

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.
 

Fichiers joints

Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re

@ChTi160 : j'ai mis le fichier. Mais comme je t'ai dit, j'ai utilisé ta macro pour voir et comme je n'ai pas vus de changement, j'ai remis la mienne.

liste.jpg
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Re
Normal ! dans la procédure que j'ai modifié , je modifie la Colonne 6
Alors que dans ton fichier c'est la 7 ème qui doit être modifiée.....
Donc il faut
VB:
Private Sub Lister()
  Dim x As Integer
  Dim DerLgn As Integer
    With ActiveSheet
         DerLgn = .Range("a" & Rows.Count).End(xlUp).Row
             Bd = .Range("a2:h" & DerLgn).Value
    End With
    n = 0   
    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 = 7, Replace(Bd(i, k), ",", "."), Bd(i, k))
            Next k
        End If
    Next i   
    ListBox1.Column = Tbl
End Sub
n'hésite pas
jean marie
 

Lone-wolf

XLDnaute Barbatruc
Bonsoir jean marie, le Forum :)

@ChTi160 : cette fois c'est ok. Merci chef ;)

Est-ce que c'est possible d'avoir un coup de main concernant le post #6, s'il te plaît? Le formulaire concerné est UsfListe.
 
Dernière édition:

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas