Microsoft 365 L'indice n'appartient pas à la sélection

PORCHER

XLDnaute Occasionnel
Bonjour,
Je fais appel à vous pour résoudre un problème.
Je rempli ma listview et je souhaite copier la liste entière de ma listview sur ma feuille historique
dans un tableau structuré nommé Tableau1.
Merci de m'aider
Voici ci-dessous le code ;
VB:
Sub ListView_vers_Feuille()
Dim R As Range 'déclare la variable R (Recherche)
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim l As Integer 'déclare la variable I(Incrément)
Dim lg As Long, cl As Long, i As Long, j As Long
Dim T As Variant

Set OB = Worksheets("Bilan") 'définit l'onglet OB
Set TSB = OB.ListObjects("Tableau1")

Set R = TSB.ListColumns(1).Range.Find("")
If R Is Nothing Or TSB.ListRows.Count = 0 Then
    TSB.ListRows.Add 'ajoute une ligne à TSB
    LI = TSB.ListRows.Count  'définit la ligne LI (dernière ligne de TSB)
Else
    LI = R.Row - TSB.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée moins la ligne de en-têtes de TSB)
End If

    With UserFormFiltre.ListView1
        lg = .ListItems.Count
        cl = .ColumnHeaders.Count
        ReDim T(1 To lg, 1 To cl + 1)
        For i = 1 To lg
            T(i, 1) = .ListItems(i).Text
            For j = 1 To cl - 1
                T(i, j + 1) = .ListItems(i).ListSubItems(j).Text
            Next j
           Next i
        End With
For l = 1 To lg ' boucle sur les lignes du tableau
TSB.DataBodyRange(LI, 1 + l) = T(i, 1)
TSB.DataBodyRange(LI, 2 + l) = T(i, 2)
TSB.DataBodyRange(LI, 3 + l) = T(i, 3)   
TSB.DataBodyRange(LI, 4 + l) = T(i, 4) 
TSB.DataBodyRange(LI, 5 + l) = T(i, 5)   
TSB.DataBodyRange(LI, 6 + l) = T(i, 6)
TSB.DataBodyRange(LI, 7 + l) = T(i, 7)
TSB.DataBodyRange(LI, 8 + l) = T(i, 8)
TSB.DataBodyRange(LI, 9 + l) = T(i, 9)
Next
End Sub
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

TSB.DataBodyRange(LI, 1 + l) = T(i, 1)
J'ai l'impression que tu fais varier la colonne avec ta boucle "FOR l", et non la ligne.

En revanche, tu ne fais pas varier i, donc tu vas mettre la même ligne de ton tableau T() dans ton TS.

Et je pense qu'il y a d'autres choses qui ne vont pas :
- pourquoi définir une feuille ?
- pourquoi rechercher une cellule vide dans le TS (le TS est-il déjà en partie rempli ?) ?
 
Dernière édition:

PORCHER

XLDnaute Occasionnel
Bonjour du matin,
Merci pour votre aide.
Effectivement dans la boucle j'avais mis l et suite à vos informations j'ai modifier la boucle par i.
Et là çà fonctionne quoi que j'ai un problème sur la ligne
Je vous transmet le fichier(fichier que j'ai du supprimer plusieurs feuilles afin de réduire le poids.)
Merci
 

Pièces jointes

  • Classeur1.xlsm
    66 KB · Affichages: 2

PORCHER

XLDnaute Occasionnel
Merci quand même.
J'ai trouvé le problème et j'ai modifié comme suit( çà peut aider quel qu'un)
VB:
Sub ListView_vers_Feuille()
    Dim lg As Long, cl As Long, i As Long, j As Long
    Dim Data() As Variant
 
    With UserFormFiltre.ListView1
            'Collecte des données du listview
        lg = .ListItems.Count
        cl = .ColumnHeaders.Count
        ReDim Data(1 To lg, 1 To cl + 1)
        For i = 1 To lg
            Data(i, 1) = .ListItems(i).Text
            For j = 1 To cl - 1
                Data(i, j + 1) = .ListItems(i).ListSubItems(j).Text
            Next j
        Next i
    End With
 
    Dim OB As Excel.Worksheet
    Set OB = Worksheets("Bilan") 'définit l'onglet OB
 
    Dim TSB As Excel.ListObject
    Set TSB = OB.ListObjects("Tableau1")
        'vide le TS
    TSB.DataBodyRange.Delete
 
        ' Ajoute autant de lignes que necessaire
    For i = 1 To lg
        TSB.ListRows.Add
    Next
        'Transfer les données
    TSB.DataBodyRange.Value = Data
 
        'active la feuille a la fin du traitement
    OB.Activate
End Sub
 

TooFatBoy

XLDnaute Barbatruc
pourquoi définir une feuille ?
à on est encore dans un code hybride (range/listobject)
Et c'est toujours le cas avec le dernier code.
Certes, ça n'empêche peut-être pas le code fonctionner correctement, mais c'est dommage de ne pas exploiter le fait qu'un TS est adressable simplement par son nom, donc sans avoir besoin de préciser la feuille dans laquelle il se trouve. 😉
 

Discussions similaires

Statistiques des forums

Discussions
312 520
Messages
2 089 297
Membres
104 092
dernier inscrit
karbone57