XL 2019 Copier plusieurs lignes et les insérer plusieurs fois sans boucle

miloo

XLDnaute Junior
Bonjour,
j'aimerais copier plusieurs lignes et les insérer plusieurs fois sans boucle si c'est possible, dans un with.
La boucle fait perdre beaucoup de temps à mon code, raison pour laquelle j'aimerais m'en passer.

J'ai essayé d'adapter le code de @eriiic dans le post ci dessous, sans succès:
VB:
Sub dupLigne()
       Rows("1:1").Copy
       Rows("2:" & 2 + [C1]).Insert Shift:=xlDown
End Sub

sachant que ma plage de copie est définie par des variables (de NbLignEntete + 1 à NbLignEntete + NbLignParPers), ainsi que la ligne à partir de laquelle insérer à l'origine (Lign) et le nombre répétitions (NbIDE).
voila le code que j'ai essayé:
Code:
With ThisWorkbook.Worksheets("Janvier")
    .Rows(NbLignEntete + 1 & ":" & NbLignEntete + NbLignParPers).Copy
    .Rows(Lign & ":" & Lign + NbIDE).Insert Shift:=xlDown
End with
ou encore avec
Code:
.Rows(Lign).Resize(NbIDE).Paste Shift:=xlDown
ou encore
Code:
.Rows(Lign).Resize(Rows.Count * NbIDE, 1).PasteSpecial Paste:=xlPasteAll
mais cela ne marche pas
Quelqu'un pourrait-il m'aider?
Merci!
 
Solution
Bonjour,

sachant que ma plage de copie est définie par des variables (de NbLignEntete + 1 à NbLignEntete + NbLignParPers), ainsi que la ligne à partir de laquelle insérer à l'origine (Lign) et le nombre répétitions (NbIDE).
Logiquement le nombre de lignes d'en-tête est égal à 1.
Et ne serait-il pas plus logique d'utiliser le numéro de la ligne d'en-tête plutôt que le nombre de lignes d'en-tête ?

Par contre, il me semble logique d'utiliser le nombre de lignes par personne. ;)


Je pense que tu as fait une erreur de calcul dans ta réflexion : la plage cible ne devrait pas aller de Lign à (Lign + NbIDE), mais plutôt de Lign à (Lign + NbIDE*NbLignParPers - 1). Non ?

TooFatBoy

XLDnaute Barbatruc
Bonjour,

sachant que ma plage de copie est définie par des variables (de NbLignEntete + 1 à NbLignEntete + NbLignParPers), ainsi que la ligne à partir de laquelle insérer à l'origine (Lign) et le nombre répétitions (NbIDE).
Logiquement le nombre de lignes d'en-tête est égal à 1.
Et ne serait-il pas plus logique d'utiliser le numéro de la ligne d'en-tête plutôt que le nombre de lignes d'en-tête ?

Par contre, il me semble logique d'utiliser le nombre de lignes par personne. ;)


Je pense que tu as fait une erreur de calcul dans ta réflexion : la plage cible ne devrait pas aller de Lign à (Lign + NbIDE), mais plutôt de Lign à (Lign + NbIDE*NbLignParPers - 1). Non ?
 

Phil69970

XLDnaute Barbatruc
Re

@miloo

Je n'ai pas joint mon fichier car il est assez volumineux
Il suffit de mettre un fichier représentatif cela permet d'avoir des réponses plus pertinentes

C'est quoi représentatif ?

- représentatif, même organisation des lignes et des colonnes, mêmes libellés, mêmes noms de feuilles...
- anonymisé, pas de données personnelles réelles tels nom, n° sécu, adresse ... remplacé par Nom1, Nom2 etc ....
- simplifié, une quinzaine de lignes reproduisant l'ensemble des différents cas envisageables (Avec le résultat souhaité éventuellement)

Si cela fonctionne sur le fichier fourni et pas sur le vrai fichier c'est qu'il n'est en rien représentatif ou que tu n'as pas su transposer ce qui devrait être un simple copier coller du code.
 

miloo

XLDnaute Junior
Bonjour @TooFatBoy , @Phil69970 , vous avez été très réactifs, donc je m'excuse pour ma réponse tardive, j'étais en déplacement et un peu débordé.

@TooFatBoy, pour NbLignEnTete, il s'agit plutôt d'une mauvaise appellation de ma part, j'aurais dû l'appeler NumLignEnTete. Dans mon fichier, c'est 5 pour les onglets des mois de l'année. Je ne sais pas si c'est ce qui crée une confusion.

@TooFatBoy , @Phil69970, il s'agit d'un fichier de planning. L'exemple pour la feuille Janvier, il y a 5 lignes fixes puis 6 lignes par personne (avant la ligne TOTAUX). Je copie ces 6 lignes autant de fois que je veux générer d'employés (info onglet Horaires, colonne O).

Dans la Sub AjoutIDE() du module "ModuleGenerer", je chercher à optimiser le code suivant, en remplaçant la boucle For, qui me semble prendre du temps. J'espère qu'une ligne de code du style de celle décrite dans mon 1er post pourra accélérer cela (et me faire progresser sur la connaissance de syntaxe VBA).

VB:
Lign = LignTotaux
For i = 1 To NbIDE - 1
    With ThisWorkbook.Worksheets("Janvier")
        .Rows(NbLignEntete + 1 & ":" & NbLignEntete + NbLignParPers).Copy
        .Rows(Lign).Insert
        Lign = LignTotaux + NbLignParPers
    End With
Next
 

Pièces jointes

  • PlanningXLDownloads.xlsm
    129.4 KB · Affichages: 3

miloo

XLDnaute Junior
Donc ça corrige le problème ?
Non, mon problème n'est pas sur le résultat en lui même, mais la méthode, la syntaxe. Je voudrais éviter la boucle For qui, combinée au Insert, me semble prendre beaucoup de temps. Je cherche à savoir si la commande Insert dispose d'une option pour répéter l'insertion x fois (ici, NbIDE fois) avec par exemple quelque chose du style : .Rows(a).Resize(x).Paste Shift:=xlDown
 

miloo

XLDnaute Junior
@TooFatBoy, effectivement cela fonctionne. Toutes mes excuses, je n'avais pas vraiment compris ton 1er post, et je me focalisais sur une syntaxe alors que c'est le contenu de mon calcul qui était faux et ne permettait pas d'insérer le bon nombre de colonnes.
En réalité, la bonne formule dans mon cas est (Lign + (NbIDE - 1) * NbLignParPers - 1), mais le principe que tu proposais est bon.
Merci pour ta patience! Et merci pour l'aide!
Bonne soirée.
 

Discussions similaires

Statistiques des forums

Discussions
313 228
Messages
2 096 390
Membres
106 598
dernier inscrit
cch