XL 2010 copier et dupliquer X fois sur une feuille

trueblood

XLDnaute Nouveau
bonjour,
peut être un cas d'école, mais je ne trouve rien qui correspond à mon besoin sur internet, je pense à du VBA mais je ne maitrise pas. j'ai aussi pensé a des formules mais le tableau nom pouvant évoluer, je ne pense pas que ça soit le plus simple à faire.
Sur la feuille 1, j'ai un tableau contenant le nom de personnes, sur un autre tableau de la même feuille j'ai des dates calculées et j'aimerai assemblé le tout sur la feuille 2.
feuille 1
nom date
denis 04/01/2021
arnaud 11/01/2021
julien 18/01/2021
........... ......................
résultat feuille 2
nom date
denis 04/01/2021
denis 11/01/2021
denis 18/01/2021
denis ...............
arnaud 04/01/2021
arnaud 11/01/2021
arnaud 18/01/2021
arnaud ...............
julien 04/01/2021
julien 11/01/2021
julien 18/01/2021
julien ...............

si vous avez une idée, je suis preneur.
Merci à vous
 

Pièces jointes

  • Classeur2.xlsx
    18.5 KB · Affichages: 6
Solution
Bonjour trueblood, et bienvenu sur XLD,
En PJ un essai avec cette macro :
VB:
Sub Worksheet_Activate()
    Dim F, NbLigNoms%, NbLigDates%, Nom%, Dat%, Ligne%
    Set F = Sheets("Feuil1")
    [A:B].ClearContents: [A1] = "Nom": [B1] = "Date"
    Application.ScreenUpdating = False
    NbLigNoms = F.[Tableau2].ListObject.ListRows.Count    ' Nb ligne TDS
    NbLigDates = F.[Tableau3].ListObject.ListRows.Count    ' Nb ligne TDS
    Ligne = 2
    For Nom = 1 To NbLigNoms
        For Dat = 1 To NbLigDates
            Cells(Ligne, "A") = [Tableau2[nom]].Item(Nom)
            Cells(Ligne, "B") = F[Tableau3[dates]].Item(Dat)
            Ligne = Ligne + 1
        Next Dat
    Next Nom
    Application.ScreenUpdating = True
End Sub
La macro s'exécute automatiquement...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour trueblood, et bienvenu sur XLD,
En PJ un essai avec cette macro :
VB:
Sub Worksheet_Activate()
    Dim F, NbLigNoms%, NbLigDates%, Nom%, Dat%, Ligne%
    Set F = Sheets("Feuil1")
    [A:B].ClearContents: [A1] = "Nom": [B1] = "Date"
    Application.ScreenUpdating = False
    NbLigNoms = F.[Tableau2].ListObject.ListRows.Count    ' Nb ligne TDS
    NbLigDates = F.[Tableau3].ListObject.ListRows.Count    ' Nb ligne TDS
    Ligne = 2
    For Nom = 1 To NbLigNoms
        For Dat = 1 To NbLigDates
            Cells(Ligne, "A") = [Tableau2[nom]].Item(Nom)
            Cells(Ligne, "B") = F[Tableau3[dates]].Item(Dat)
            Ligne = Ligne + 1
        Next Dat
    Next Nom
    Application.ScreenUpdating = True
End Sub
La macro s'exécute automatiquement lorsqu'on sélectionne la feuille 2
 

Pièces jointes

  • Classeur2 (1).xlsm
    21.1 KB · Affichages: 5

trueblood

XLDnaute Nouveau
Merci,

ça parait tellement facile, un grand merci sylvanu.
y a t'il possibilité de conserver les formules de dates ? ou obligatoirement on les met en Valeur.

si je comprends bien le déroulé, sur la feuille2 on crée les entêtes, puis on définit le nombre de lignes des 2 tableaux, on lui dit d'écrire en ligne 2 de la feuille 2, et de prendre le nom du tableau A et d'associer toutes les dates, puis de passer au prochain nom... ?
en tout cas un grand merci 👏
👏
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Tel quel, le VBA colle les valeurs.
Ca n'a aucune importance puisque tout le tableau est reconstruit lorsqu'on sélectionne la feuille 2.
Si vous changiez la formule alors vous seriez sur la feuille 1. En sélectionnant la feuille 2 elle serait reconstruite et les nouvelles valeurs seraient prises en compte.
 

trueblood

XLDnaute Nouveau
Tel quel, le VBA colle les valeurs.
Ca n'a aucune importance puisque tout le tableau est reconstruit lorsqu'on sélectionne la feuille 2.
Si vous changiez la formule alors vous seriez sur la feuille 1. En sélectionnant la feuille 2 elle serait reconstruite et les nouvelles valeurs seraient prises en compte.
je pensais le reconstruire en sélectionnant le feuille 2 uniquement si j'ai une nouvelle entrée de personne. Avec le résultat de la feuille 2, je compte rajouter des champs et faire un TCD. Si les dates changent (début de chaque année), je n'ai besoin que de faire une actualisation de TCD.

on ne peut pas rajouter un ? (merci l'enregistreur de macro ;)), mais je ne sais pas trop où...
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
 

trueblood

XLDnaute Nouveau
Mais vos formules référencent par rapport à des valeurs en feuille 1. Copiées en feuille2 elles ne marcheraient plus.
Ou alors il faudrait référencer par une formule les valeurs présentes en feuille 1. Et là, je sèche.
Encore merci pour les réponses et votre temps, je vais essayer de contourner le problème différemment en laissant les valeurs. :)

etant nouveau sur le forum et ne maitrisant pas la manière de faire, a-t-on besoin de clôturer une demande, un sujet ? je ne voudrai pas commettre d'impaire
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Vous pouvez clore le post et indiquer si une solution vous convient.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
J'ai une une idée en collant des formules. la macro est moins lisible et sera plus difficile à maintenir. Cependant elle marche avec :
VB:
Sub Worksheet_Activate()
    Dim F, NbLigNoms%, NbLigDates%, Nom%, Dat%, Ligne%
    Set F = Sheets("Feuil1")
    [A:B].ClearContents: [A1] = "Nom": [B1] = "Date"
    Application.ScreenUpdating = False
    NbLigNoms = F.[Tableau2].ListObject.ListRows.Count    ' Nb ligne TDS
    NbLigDates = F.[Tableau3].ListObject.ListRows.Count    ' Nb ligne TDS
    Ligne = 2
    For Nom = 1 To NbLigNoms
        For Dat = 1 To NbLigDates
            Cells(Ligne, "A") = [Tableau2[nom]].Item(Nom)
            ' Récupère la ligne date
            Lignetablo = Application.Match([Tableau3[dates]].Item(Dat), F.[C:C], 0)
            ' Colle la formule =Feuil1!Cxx avec xx la bonne ligne
            Cells(Ligne, "B").Formula = "=Feuil1!C" & Lignetablo
            ' Récupère la ligne nom
            Lignetablo = Application.Match([Tableau2[nom]].Item(Nom), F.[A:A], 0)
            ' Colle la formule =Feuil1!Axx avec xx la bonne ligne
            Cells(Ligne, "A").Formula = "=Feuil1!A" & Lignetablo
            Ligne = Ligne + 1
        Next Dat
    Next Nom
    Application.ScreenUpdating = True
End Sub
A essayez. Vérifier : en feuille 2 on a des formules qui référence Feuille 1 et non des valeurs.
 

Pièces jointes

  • Classeur2 (1) (2).xlsm
    24.3 KB · Affichages: 0

Statistiques des forums

Discussions
311 733
Messages
2 082 009
Membres
101 865
dernier inscrit
MLL