Tableaux structurés - Filtre - ListRows

Bonjour,

Je butte toujours sur les même problème de syntaxe... Je viens de passer une a.m. à brasser les ListObject, ListFillrange et autre DataBodyTruc sans parler des ListRows et autres Areas. Chez moi les poux peuvent aller se faire voir... Tous mes cheveux y sont passés !

Dans le classeur joint le problème est de récupérer les données filtrées dans la feuille Source pour les afficher dans la feuille cible.

26testtrans.xlsm (58.32 Ko)

Je butte toujours sur les Set LR =...

Sub MajCible()
Dim i&, LR As ListRow
Dim TData As ListObject, Arr, ArrS(6)
Dim plage As Range, k%
Set TData = Range("TBut").ListObject
   On Error Resume Next 'Réinitialise le tableau 'TBut"
      Range("TBut").ListObject.DataBodyRange.Delete
   On Error GoTo 0
          For Each plage In Range("TSrc").SpecialCells(xlCellTypeVisible).Areas 'ligne douteuse ???
            k = k + 1
            Arr = plage.Value
            '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            If k = 1 Then
               Set LR = TData.ListRows(1)
            Else
               Set LR = TData.ListRows.Add
            End If
            '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                ArrS(0) = Arr(i, 2)
                ArrS(1) = Arr(i, 21)
                ArrS(2) = Arr(i, 22)
                ArrS(3) = Arr(i, 23)
                ArrS(4) = Arr(i, 24)
                ArrS(5) = Arr(i, 25)
                LR.Range.Value = ArrS
         Next
End Sub

Merci de bien vouloir me corriger !

Particulièrement signalé : Le classeur joint est une démo "in situ"

Je sais bien que dans beaucoup de cas on utiliserait des Filtres élaborés, mais ici ce n'est pas possible : Dans la réalité il y a de nombreuses feuilles sources et feuilles cibles. De plus les Tableaux structurés cibles doivent être utilisés pour des graphiques... Donc merci de ne pas suggérer des soluces qui vont m'obliger à jeter une semaine de travail...

A+

Bonjour

J'aurais plutôt fait cela

Sub MyCopy()

    With Range("TBut").ListObject
        .DataBodyRange.Delete
        .ListRows.Add
        With Range("TSrc").ListObject.DataBodyRange
            .Resize(.Rows.Count, 6).SpecialCells(xlCellTypeVisible).Copy
        End With
        .DataBodyRange.Cells(1, 1).PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode=False
    End With

End Sub

Bonjour,

Merci pour cette réponse... Que je retiens pour le cas ou je n'arriverai pas à affecter mon LR

Parce que le Copier/Coller avec Resize ne convient pas :

Je reporte seulement les colonnes B et U,v,W,X,Y pour mes graphiques. Donc il faut absolument que j'aille piocher dans mon Array (LR) les colonnes qui m'intéressent.

Si je fais un copier /Coller intégral ça m'oblige à un boulot assez considérable pour recomposer mes tableaux cible et mes graphiques...

Je ne comprend pas pourquoi je n'arrive pas à gérer les LR dans cette situation alors que ça fait parfaitement le job en mode Ajout dans une base de données...

A+

Finalement je me réponds à moi-même :

J'ai fini par trouvé la solution qui me crevait les yeux depuis hier mais j'ai quand même mis une après-midi à chercher midi à 14 h alors qu'il fallait surtout faire la chasse aux c... !

La soluce :

Sub MajCible()
Dim LR As ListRow,plage As Range
Dim TData As ListObject, Arr(), ArrS(6)
Set TData = Range("TBut").ListObject
   On Error Resume Next
      TData.DataBodyRange.Delete
   On Error GoTo 0
          For Each plage In Range("TSrc").SpecialCells(xlCellTypeVisible).Areas
            Set LR = TData.ListRows.Add
            Arr = plage.Value
                ArrS(0) = Arr(1, 2)
                ArrS(1) = Arr(1, 21)
                ArrS(2) = Arr(1, 22)
                ArrS(3) = Arr(1, 23)
                ArrS(4) = Arr(1, 24)
                ArrS(5) = Arr(1, 25)
                LR.Range.Value = ArrS
         Next
End Sub

A+

Bonjour,
Tu as effectivement un souci avec Areas.
Si on prend la source 31, on a 20 occurences et tu en récupères 19.
Il manque la ligne 48 car la plage retournée avec Areas est A47:AA48 (et non A47:AA47 et A48:AA48).
Voir pour les autres sources, telle que 24.
Cdlt.

22testtrans.xlsm (51.51 Ko)

Bonjour,

Du coup j'ai remplacé Areas par Rows et ça à l'air d'être Ok...

Merci

Re,
Une alternative sans Listrow.
Cdlt.

Sub MajCible_2()
Dim TData As ListObject
Dim tbl, arr(6)
Dim plage As Range, r As Range

    Set TData = Range("TBut").ListObject

    With TData
        If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
        Set r = .InsertRowRange.Cells(1)
    End With

    For Each plage In Range("TSrc").SpecialCells(xlCellTypeVisible).Rows
        tbl = plage.Value
        arr(0) = tbl(1, 2)
        arr(1) = tbl(1, 21)
        arr(2) = tbl(1, 22)
        arr(3) = tbl(1, 23)
        arr(4) = tbl(1, 24)
        arr(5) = tbl(1, 25)
        r.Resize(1, 6).Value = arr
        Set r = r.Offset(1)
    Next

End Sub

Oui, J'aime un peu moins : Je trouve que :

Set LR = TData.ListRows.Add
C'est plus "visuel" je comprend tout de suite...
Set r = .InsertRowRange.Cells(1)
...est plus nébuleux... il faut le temps que ça remonte à mon cerveau !
Et puis alors après : les Offset... Resize... moi ça me donne des boutons.
Je trouve qu'il y a rien de tel pour compliquer des choses qui sont très simples...

Mébon, c'est certainement une question d'habitude mais moi j'ai pas été élevé avec ces choses là hein...
Les tableaux structurés ça fait pas bien longtemps que je les explore : J'étais déjà à la retraite avant qu'ils apparaissent.
Alors c'est dire que je ne les ai pas usés ! Et vu mon âge ben... toussa m'empêchera pas de dormir ce soir !

A+

Bonjour…

Problème de syntaxe ? Hé oui !

Je ne propose pas de tutos car les personnes qui prennent connaissance de ceux-ci pour les utiliser, pensent souvent que c’est la seule programmation valable mais sont par la suite, déroutés par la nouvelle syntaxe, les nouvelles propriétés mises en place.

Pour l’objet Tableau (classes ListObjects - LisObject), il est toujours proposé, dans les exemples que j’ai parcouru, la nouvelle syntaxe (que l’on retrouve quand on utilise l’éditeur de macro)mais sans préciser que confondre syntaxes et propriétés n’arrange guère les choses.

Pour un tel objet, on pourra très souvent utiliser la syntaxe de base de la classe Range sans perdre de vue que l’objet a une gestion améliorée grâce à des propriétés nouvelles.

Ci-joint, je propose une adaptation du fichier fourni, dans laquelle, la syntaxe n’est pas celle attribuée au seul Tableau. Cela ne veut pas dire que l’on puisse s’en dispenser.

Le tout est de savoir passer de la Théorie à la Pratique sachant que très souvent les chemins possibles peuvent différer.

Oui, il m'arrive souvent d'être un peu approximatif dans mes explications...

C'est même d'ailleurs presque de rigueur sur ce forum Non ?

mdr3

A+

Bonjour à tous

Pour un tel objet, on pourra très souvent utiliser la syntaxe de base de la classe Range sans perdre de vue que l’objet a une gestion améliorée grâce à des propriétés nouvelles.

Les deux grands avantages de coder en fonction de l'objet c'est que :

  • on déplacer le tableau dans l'onglet ou dans un autre, intervertir ses colonnes si besoin, sans toucher à une ligne de code tant que le tableau ne change pas de nom ni ses colonnes de titres
  • la taille (nombre lignes et nombre de colonnes), la position dans l'onglet, sont gérése simplement
Rechercher des sujets similaires à "tableaux structures filtre listrows"