XL 2016 Créer des classeurs avec un modèle à partir d'une liste

schoum5

XLDnaute Nouveau
Bonjour à tous!

Je me permets de revenir solliciter votre aide.
Je suis en train d'apprendre à créer mes propres macro via VBA et donc son langage et je bloque sur quelque chose qui pour vous, je pense, va vous paraître assez simple .

Ce que je veux faire c'est, créer autant de classeur qu'il y a de ligne dans ma liste dans ma feuille "Feuil1" et que pour chaque classeur créé, ça me colle la feuille "Modele", ça me l'enregistre dans le même dossier que mon classeur source avec le même nom qui se trouve dans ma liste. (Mon classeur source est composé que de ces deux feuilles)

J'ai donc réussi à créer autant de classeur que de ligne dans ma liste ainsi qu'à les enregistrer dans le dossier attendu tout en fermant les nouveaux classeurs créés à chaque fois.
Je bloque dès que je veux incrémenter des action avant d'enregistrer et fermer un classeur créé pour passer au suivant. Et donc par exemple, pour copier ma feuille "Modele" sur chaque nouveau classeur.

J'espère avoir été assez précis dans ma description.
Je vous joint mon "code" que j'ai commencé à écrire.
Si besoin, je peux également vous transmettre mon classeur.

Je vous remercie par avance pour l'aide que vous pourrez m'apporter. Et sans vouloir être embêtant, je suis plus ici pour comprendre la méthode que d'avoir une solution tout faite :).

Au dernière petite question, existe-t'il un moyen de forcer la sauvegarde en ".xlsm" et ne pas être obligé d'enregistrer en "xls"?

VB:
Sub CréerDesClasseurs()


Chemin = ActiveWorkbook.Path


For Each i In Range("Liste")
    If i = "" Then
        Exit For
    Else
        NomDuClasseur = i.Value
        ChemFiche = Chemin & "\" & NomDuClasseur & ".xls"
       
        Workbooks.Add
       
        Workbooks("Test Macros.xlsm").Activate
        Sheets("Modele").Select
        Sheets("Modele").Copy
        Workbooks(NomDuClasseur).Activate
        Sheets("Feuil1").Select
        Sheets("Modele").Select
        Selection.PasteSpecial Paste:=xlPasteValues
        Application.CutCopyMode = False
       
        ActiveWorkbook.SaveAs ChemFiche
       
        ActiveWorkbook.Close True
    End If
Next i


End Sub
 

Jacky67

XLDnaute Accro
Bonjour,
Cela pourrait ressembler à ceci.
Code:
Sub CréerDesClasseurs()
Dim chemin As String, i As Range
chemin = ActiveWorkbook.Path & "\"
For Each i In Range("Liste")
  If i = "" Then    '   ***es-ce bien utile ???
    Exit For
  Else
    Sheets("Modele").Copy
    ActiveWorkbook.SaveAs chemin & i.Value, 52
    ActiveWorkbook.Close True
  End If
Next i
End Sub
Ce code est simple, néanmoins, si tu as besoin d'explication fait le savoir.
 
Dernière édition:

schoum5

XLDnaute Nouveau
Merci beaucoup pour ta réponse! C'est en fait beaucoup plus simple que ce que je fais. Je me complique un peu la vie.
If i = "" Then ' ***es-ce bien utile ???
Je suis parti du principe que comme ma liste évolue, elle peut donc changer de nombre de ligne et je me suis dis que si je ne mettais pas ce "Exit for" ça allait me créer des classeurs sans noms. Je dis peut être une grosse bêtise.

Petite question, à quoi correspond le "52"?
ActiveWorkbook.SaveAs chemin & i.Value, 52
C'est ce qui permet d'enregistrer le classeur en xlsm? J'ai vu dans le dossier que c'était cette extension en tous cas.

Une dernière question, si je veux mettre 2/3 infos sur la feuille "Modele" créée dans un nouveau classeur en fonction des cellules de ma liste, par exemple, que dans le classeur créé, une fois le modèle copier, qu'en A1 de ce modèle je veux le nom de la cellule de la liste corresponde (meme nom que le fichier) je dois mettre tout ça juste après la ligne
Sheets("Modele").Copy
, ou alors de le faire avant?
 

Jacky67

XLDnaute Accro
Je suis parti du principe que comme ma liste évolue
Si la plage nommée "Liste" est une plage dynamique, elle est mise à jour automatiquement.

Petite question, à quoi correspond le "52"?
Cela correspond à l'instruction "FileFormat"==> 52 pour "XLSM" ==>51 pour "XLSX" etc....
C'est ce qui permet d'enregistrer le classeur en xlsm? J'ai vu dans le dossier que c'était cette extension en tous cas.
OUI

je dois mettre tout ça juste après la ligne , ou alors de le faire avant?
Sheets("Modele").Copy
Après cette instruction, c'est la feuille nommée "modèle" du nouveau classeur qui est active, on peut donc y écrire ce que l'on veut avant l'instruction suivante.
 
Dernière édition:

schoum5

XLDnaute Nouveau
Merci encore pour toutes tes réponses!!

J'ai mis un peu de temps à comprendre la plage dynamique.
Ma "liste" n'en est pas une, mais je serai très curieux de savoir comment ça se code.
Je suppose que le but est que plage "liste" ajuste le nombre de ligne qu'il faut afin d'éviter les lignes vides non?
 

Jacky67

XLDnaute Accro
Merci encore pour toutes tes réponses!!

J'ai mis un peu de temps à comprendre la plage dynamique.
Ma "liste" n'en est pas une, mais je serai très curieux de savoir comment ça se code.
Je suppose que le but est que plage "liste" ajuste le nombre de ligne qu'il faut afin d'éviter les lignes vides non?
Re..
Cet exemple en vba prend en compte (sans plage dynamique) tous les noms dans la colonne A de la feuille "debut", à partir de la ligne 2 jusqu'à la dernière ligne occupée de la colonne A
VB:
Sub CréerDesClasseurs()
Dim chemin As String, I As Long, Derlg As Long
Application.ScreenUpdating = False
With Feuil1
  'La liste dans cet exemple est situé en colonne A de la feuil1
  'Feuil1 est le codename de la feuille "Debut"
  Derlg = .Cells(.Rows.Count, "A").End(xlUp).Row  'dernière ligne occupée de la colonne A
  If Derlg > 1 Then  'verification si la liste n'est pas vide
  chemin = ActiveWorkbook.Path & "\"
  For I = 2 To Derlg
  If .Cells(I, 1) <> "" Then  'verififie si la cellule n'est pas vide
  'Cette verification est inutile s'il n'y a pas de trous (cellule vide) en colonne A
  Sheets("Modele").Copy
  'Ci-dessous j'écris dans la feuille "Modele" du nouveau classeur
  [a1] = "Ecriture sur cette feuille"
  [a2] = "Non de le feuille : " & ActiveSheet.Name
  ActiveWorkbook.SaveAs chemin & .Cells(I, 1).Value, 52
  ActiveWorkbook.Close True
  End If
  Next I
  MsgBox "Terminé" ' facultatif"
  Else
  MsgBox "Liste vide"
  End If
End With
Application.ScreenUpdating = True
End Sub
Bon courage
 

Fichiers joints

Dernière édition:

schoum5

XLDnaute Nouveau
Top!!
Merci encore, je vais regarder le code dans son détails et essayer de le réécrire sur mon module pour tenter de bien intégrer tout ça!! Et aller chercher exactement ce que c'est qu'une plage dynamique :) ça pourra toujours être intéressant d'avoir ça en tête aussi car je n'y ai jamais pensé.
Merci pour tout!!
 

schoum5

XLDnaute Nouveau
Bonjour,

Je me permets de revenir sur ce sujet car j'aimerai avoir une petite précision concernant la création de classeur excel via des macro.

Donc sur ce même code ci-dessus, je l'ai adapté pour qu'au lieu qu'il y ait 1 seule feuille sur le nouveau classeur je voulais qu'il y en ait deux. Aucun problème à ce niveau là.

Par contre, ce que j'aimerai faire c'est que dans ce nouveau classeur, à l'ouverture de celui ci j'ai une inputbox qui apparaît automatiquement et en fonction de la saisie, l'utilisateur à accès ou non à certaines feuilles.

Voici le "code" que j'ai fait.
VB:
Public Sub Workbook_Open()
Dim Visible As Variant
    Visible = InputBox("Press OK")
  
If Visible = 505 Then
    Worksheets("Modele").Visible = True
    Worksheets("BASE").Visible = True
Else
    Worksheets("Modele").Visible = True
    Worksheets("BASE").Visible = False
End If

End Sub

J'aimerai donc que celui-ci s'intègre directement lors de la création du nouveau classeur.

Si je ne suis pas assez clair, n'hésitez pas à me le dire, j'essaierai de mieux expliquer mon envie.

Je vous remercie d'avance pour votre aide.
Schoum
 

Discussions similaires


Haut Bas