Liste avec n fois certaines lignes

  • Initiateur de la discussion Initiateur de la discussion chris
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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
 
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:
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
 
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.
 
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:
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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour