XL 2016 créer feuilles depuis table d'entrée puis synthétiser

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 !

saimone

XLDnaute Nouveau
Bonjour,
J'aimerais ajouter automatiquement des feuilles sur la base d'un modèle, depuis une table d'entrée.


La table d'entrée est nommée form, elle comporte des longueurs depuis la colonne A2 (A3, A4, A5 etc...); largeur depuis B2 (B3, B4, B5 etc...; et épaisseur depuis C2 (C3, C4, C5 etc...)
numéro depuis la colonne D2 (D3; D4; D5 etc...)

Le nombre de ligne est évolutif (40 maximum)

Le modèle comporte des formule ayant besoin des longueurs, largeurs et épaisseurs, il s'appelle mod.


J'aimerais depuis une macro présente sur la table d'entrée pour:
- créer une feuille par ligne ayant pour nom le numéro présent en colonne D, en partant du modèle de base.
- remplir les cellules correspondantes

Egalement, j'aimerais une autre macro synthétisant les éléments des feuilles créées par la première macro; dans la feuille !synthèse

Je vous mets en PJ le fichier de base (base .xlsx) et un fichier d'exemple (resultatsouhaité.xlsx)


D'avance merci pour votre aide
 

Pièces jointes

Bonjour,
A essayer
VB:
Sub Insere_Feuille()
Dim Wh As Worksheet, Dl As Integer, i As Integer
Set Wh = Worksheets("form"): Dl = Range("D65536").End(xlUp).Row
For i = 2 To Dl
ActiveWorkbook.Sheets.Add after:=ActiveSheet
  
    With ActiveSheet
    .Name = Wh.Range("D" & i).Value
    .Cells(2, 2).Value = Wh.Cells(1, 4)
    .Cells(2, 3).Value = Wh.Cells(1, 1)
    .Cells(2, 4).Value = Wh.Cells(1, 2)
    .Cells(2, 5).Value = Wh.Cells(1, 3)
    .Cells(3, 2).Value = Wh.Cells(i, 4)
    .Cells(3, 3).Value = Wh.Cells(i, 1)
    .Cells(3, 4).Value = Wh.Cells(i, 2)
    .Cells(3, 5).Value = Wh.Cells(i, 3)
  
    End With
Next i
End Sub

ou à partir d'un bouton, comme le fichier retourné

VB:
Private Sub CommandButton1_Click()
Dim Wh As Worksheet, Dl As Integer, i As Integer
Set Wh = Worksheets("form"): Dl = Range("D65536").End(xlUp).Row
For i = 2 To Dl
ActiveWorkbook.Sheets.Add after:=ActiveSheet
    
    With ActiveSheet
    .Name = Wh.Range("D" & i).Value
    .Cells(2, 2).Value = Wh.Cells(1, 4)
    .Cells(2, 3).Value = Wh.Cells(1, 1)
    .Cells(2, 4).Value = Wh.Cells(1, 2)
    .Cells(2, 5).Value = Wh.Cells(1, 3)
    .Cells(3, 2).Value = Wh.Cells(i, 4)
    .Cells(3, 3).Value = Wh.Cells(i, 1)
    .Cells(3, 4).Value = Wh.Cells(i, 2)
    .Cells(3, 5).Value = Wh.Cells(i, 3)
    
    End With
Next i
End Sub

@+
 

Pièces jointes

Dernière édition:
Voilà, tout en un, mais je pourrai pas faire mieux de mon coté

VB:
Private Sub CommandButton1_Click()
Dim Wh As Worksheet, Wh2 As Worksheet
Dim Dl As Integer, Dl2 As Integer, i As Integer, j As Integer
Set Wh = Worksheets("form"): Set Wh2 = Worksheets("synthese")
Dl = Range("D65536").End(xlUp).Row
For i = 2 To Dl
ActiveWorkbook.Sheets.Add after:=ActiveSheet
    With ActiveSheet
    .Name = Wh.Range("D" & i).Value
    .Cells(2, 2).Value = Wh.Cells(1, 4)
    .Cells(2, 3).Value = Wh.Cells(1, 1)
    .Cells(2, 4).Value = Wh.Cells(1, 2)
    .Cells(2, 5).Value = Wh.Cells(1, 3)
    .Cells(3, 2).Value = Wh.Cells(i, 4)
    .Cells(3, 3).Value = Wh.Cells(i, 1)
    .Cells(3, 4).Value = Wh.Cells(i, 2)
    .Cells(3, 5).Value = Wh.Cells(i, 3)

    .Cells(9, 2) = "Coté"
    .Cells(10, 2) = "Dessus"
    .Cells(11, 2) = "Int Vertical"
    .Cells(12, 2) = "Int Horizontal"
    .Cells(9, 3) = .Cells(3, 3) & .Cells(3, 4)
    .Cells(10, 3) = .Cells(9, 3)
    .Cells(11, 3) = .Cells(3, 4) - .Cells(3, 5)
    .Cells(12, 3) = .Cells(3, 3) - .Cells(3, 5)
    End With
  
Dl2 = Wh2.Range("C65536").End(xlUp).Row
ActiveSheet.Range("B9:C12").Copy Wh2.Range("B" & Dl2 + 1)
Wh2.Range("A" & Dl2 + 1) = ActiveSheet.Name
Next i

Dl2 = Wh2.Range("C65536").End(xlUp).Row
Wh2.Range("C2:C" & Dl2).Cut Wh2.Range("D2")
Wh2.Range("A2:A" & Dl2).Cut Wh2.Range("C2")
End Sub

et le fichier qui va avec,

@+
 

Pièces jointes

Dernière édition:
Un grand merci pour ton aide.

Je suis allé plus loin dans la démarche avec certains de tes éléments, et d'autres glanés sur ce forum et ailleurs.
La création de feuilles supplémentaires fonctionne désormais à merveille.

J'ai cependant du mal à les synthétiser.
En PJ, il y a le fichier fonctionnel comprenant:

- La feuille d'entrée dans laquelle je rentre des dimensions et d'autres paramètres "LISTE"
Depuis cette feuille je peux générer des feuilles sur la base du modèle, puis les supprimer si besoin.

- la feuille modèle qui sera copiée pour les entrées "MODELE"

- la feuille de synthèse dans laquelle je souhaiterais regrouper toutes les feuilles générées. "SYNTH"

Ce que je souhaiterais:

Lorsque je génère des feuilles, j'aimerais que la partie encadrée en bleue de chaque feuille générée soit copiée l'une en dessous de l'autre dans la feuille "SYNTH"

Attention, le nombre et le nom de chaque feuille ne sera jamais le même d'une utilisation à une autre.

D'avance merci pour ton aide
 

Pièces jointes

Bonjour,
A tester à la place de votre code, j'ai modifié mais pas testé

VB:
Public Sub CreerFeuilles()

    Dim oShModele As Worksheet
    Dim oShListe As Worksheet
    Dim iLigFin As Integer
    Dim iLig As Integer
    Dim oShNew As Worksheet
    Dim sNomOnglet As String
    Dim Derlig As Integer
    Dim Derlign As Integer
   
    Set oShModele = Worksheets("Modele")
    Set oShListe = Worksheets("LISTE")
   
    iLigFin = oShListe.Range("C" & Rows.Count).End(xlUp).Row
   
    For iLig = 2 To iLigFin
        If oShListe.Range("C" & iLig).Value <> "" Then
            sNomOnglet = oShListe.Range("A" & iLig).Value
            If OngletExist(sNomOnglet) Then
                Set oShNew = Worksheets(sNomOnglet)
            Else
                oShModele.Copy after:=Worksheets(Worksheets.Count)
                Worksheets(Worksheets.Count).Name = sNomOnglet
                Set oShNew = Worksheets(Worksheets.Count)
            End If
            oShNew.Range("E2").Value = oShListe.Range("A" & iLig).Value 'repere
            oShNew.Range("B2").Value = oShListe.Range("B" & iLig).Value 'type
            oShNew.Range("B4").Value = oShListe.Range("C" & iLig).Value 'type
            oShNew.Range("C4").Value = oShListe.Range("D" & iLig).Value 'type
            oShNew.Range("D4").Value = oShListe.Range("E" & iLig).Value 'type
            oShNew.Range("C5").Value = oShListe.Range("F" & iLig).Value 'type
            oShNew.Range("G2").Value = oShListe.Range("G" & iLig).Value 'type
            oShNew.Range("G3").Value = oShListe.Range("H" & iLig).Value 'type
            oShNew.Range("G4").Value = oShListe.Range("I" & iLig).Value 'type
        End If

    Derlig = oShModele.Range("B" & Rows.Count).End(xlUp).Row
    Derlign = Worksheets("SYNTH").Range("B" & Rows.Count).End(xlUp).Row
    oShModele.Range("B7:H" & Derlig - 1).Copy Worksheets("SYNTH").Range("B" & Derlign)
       
    Next iLig
   
    'oShListe.Select  'éviter les select et activate
   
    Set oShListe = Nothing
    Set oShModele = Nothing
   
End Sub

@+
 
Dernière édition:
J'ai pas le souci, par-contre j'avais fait une autre ereur, mais pour moi ça fonctionne bien.

VB:
Public Sub CreerFeuilles()

    Dim oShModele As Worksheet
    Dim oShListe As Worksheet
    Dim iLigFin As Integer
    Dim iLig As Integer
    Dim oShNew As Worksheet
    Dim sNomOnglet As String
    Dim Derlig As Integer
    Dim Derlign As Integer
    
    Set oShModele = Worksheets("Modele")
    Set oShListe = Worksheets("LISTE")
    iLigFin = oShListe.Range("C" & Rows.Count).End(xlUp).Row
    
    For iLig = 2 To iLigFin
        If oShListe.Range("C" & iLig).Value <> "" Then
            sNomOnglet = oShListe.Range("A" & iLig).Value
            If OngletExist(sNomOnglet) Then
                Set oShNew = Worksheets(sNomOnglet)
            Else
                oShModele.Copy after:=Worksheets(Worksheets.Count)
                Worksheets(Worksheets.Count).Name = sNomOnglet
                Set oShNew = Worksheets(Worksheets.Count)
            End If
            oShNew.Range("E2").Value = oShListe.Range("A" & iLig).Value 'repere
            oShNew.Range("B2").Value = oShListe.Range("B" & iLig).Value 'type
            oShNew.Range("B4").Value = oShListe.Range("C" & iLig).Value 'type
            oShNew.Range("C4").Value = oShListe.Range("D" & iLig).Value 'type
            oShNew.Range("D4").Value = oShListe.Range("E" & iLig).Value 'type
            oShNew.Range("C5").Value = oShListe.Range("F" & iLig).Value 'type
            oShNew.Range("G2").Value = oShListe.Range("G" & iLig).Value 'type
            oShNew.Range("G3").Value = oShListe.Range("H" & iLig).Value 'type
            oShNew.Range("G4").Value = oShListe.Range("I" & iLig).Value 'type
        End If

Derlig = oShModele.Range("B" & Rows.Count).End(xlUp).Row
Derlign = Worksheets("SYNTH").Range("B" & Rows.Count).End(xlUp).Row
oShModele.Range("B7:H" & Derlig - 1).Copy Worksheets("SYNTH").Range("B" & Derlign + 1)
        
    Next iLig
    
    Set oShListe = Nothing
    Set oShModele = Nothing
    
End Sub
 

Pièces jointes

Pas vraiment 🙂
Dans les feuilles générées, les valeurs des cellules sont bonnes (certaines comprennent des formules).
Il n'y a aucune erreur manquante créant une #valeur!

L'erreur vient lors de la copie dans la feuille de synthèse.

Je n'ai par contre aucune idée de comment contourner ce problème
 
- 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