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
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.
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.
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
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.
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?
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
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!!
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.