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.
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 SubMerci 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 SubBonjour,
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 SubA+
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.
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 SubOui, J'aime un peu moins : Je trouve que :
Set LR = TData.ListRows.AddC'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.
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
