Liste avec n fois certaines lignes

chris

XLDnaute Barbatruc
Bonjour

Je tourne en rond sur la duplication d'une liste par formule.

J'ai des colonnes d'une liste 1 à récupérer dans une liste 2 mais la colonne D de la liste 1 indique un nombre N qui doit reproduire les lignes de la liste 1 autant de fois dans la liste B.

Ma vraie liste est longue donc si on peut éviter le matriciel c'est bien sinon je prends aussi...

Merci
 

Pièces jointes

  • Liste_Chris.xlsx
    12.2 KB · Affichages: 31

Dranreb

XLDnaute Barbatruc
Alors je ne sais pas faire par formules, ça m'est trop compliqué. En VBA c'est assez simple :
VB:
Sub Essai()
Dim TE(), LE&, TS(), LS&, N&, C&
TE = [Tableau1].Value
ReDim TS(1 To WorksheetFunction.Sum([Tableau1[Nombre]]), 1 To 3)
For LE = 1 To UBound(TE, 1)
   For N = 1 To TE(LE, 4)
      LS = LS + 1
      For C = 1 To 3: TS(LS, C) = TE(LE, C): Next C, N, LE
With ActiveSheet.ListObjects("Tableau2")
   While .ListRows.Count > LS: .ListRows(.ListRows.Count).Delete: Wend
   .DataBodyRange.Resize(LS).Value = TS
   End With
End Sub
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum, chris, Dranreb

@Dranreb
En testant ton code sur le fichier de chris, j'ai une erreur d’exécution 91
Variable objet ou variable de bloc With non défini
Et je n'arrive pas à trouver ce qui cloche

PS: Test sur W10+ Excel 2013

EDITION: Je viens de trouver, l'erreur se produit si Tableau2 ne contient que la ligne d'entête.
Du coup, je passe par un petit biais par forcément des plus affriolant ;)
VB:
With ActiveSheet.ListObjects("Tableau2")
    While .ListRows.Count > LS
    .ListRows(.ListRows.Count).Delete
    Wend
    .Range(2, 1) = 1 ' le petit biais en question ;)
    .DataBodyRange.Resize(LS).Value = TS
End With
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

C'est bien .HeaderRowRange
(et c'est plus propre que mon biais ;))

Question subsidiaire:
Pourquoi cette syntaxe ne fonctionne pas?
VB:
With [Tableau2]
    While .ListRows.Count > LS
    .ListRows(.ListRows.Count).Delete
    Wend
    .HeaderRowRange.Offset(1).Resize(LS).Value = TS
End With
 

Dranreb

XLDnaute Barbatruc
Parce que [Tableau2] est une expression Range, non ListObject.
Mais on devrait pouvoir y arriver aussi en écrivant différemment la suite.
Je n'aurais pas dû utiliser les 2 systèmes dans une même macro, ce n'est pas très homogène.
 

Dranreb

XLDnaute Barbatruc
Je n'ai plus sous les yeux le tableau de Chris me permettant de comprendre pourquoi tu en es si sûr.
Je voulais seulement illustrer que si on est gêné parce qu'on n'a qu'un Range alors qu'on veut travailler avec le ListObject qui le couvre, ce n'est pas grave, parce qu'un Range à une propriété ListObject qui le donne.
Edit: Ah oui vu "Taleau" au lieu de "Tableau"
 
Dernière édition:

chris

XLDnaute Barbatruc
Bonjour

J'ai bidouillé le code (concis et efficace ;) de dranreb) de mon côté.
Comme la boucle de vidage du Tableau ne m'emballait pas, j'ai directement fait un delete du databodyrange mais j'ai vu que dans ce cas il faut remplir une cellule de la ligne sous les en-têtes pour pouvoir y déverser TS.
Comme j'avais une formule à mettre, cela reste propre... mais je note le header.offset

Même si je sais pas encore s'il va servir pour ce projet, il me resservira à coup sûr donc merci encore.

Bon week end
 

Discussions similaires

Statistiques des forums

Discussions
312 321
Messages
2 087 265
Membres
103 501
dernier inscrit
talebafia