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:

Discussions similaires


Haut Bas