Dim chemin$, nfichier%, nfiche& 'mémorise les variables
Sub CreerFichiers()
'---se lance par le raccourci clavier Ctrl+F---
Dim t#, i%
t = Timer
chemin = ThisWorkbook.Path & "\Fichiers " & Feuil1.[H1] & "\" 'à adapter
If Dir(chemin, vbDirectory) = "" Then MkDir chemin 'crée le sous-dossier
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'---ferme tous les fichiers .xlsx ouverts
For i = Workbooks.Count To 1 Step -1
With Workbooks(i)
If Right(.Name, 5) = ".xlsx" Then .Close False
End With
Next
'---crée les fichiers et les fiches---
Creations Feuil1, Feuil2, 7 'attention, mettre les bons CodeNames...
Creations Feuil3, Feuil4, 6 'attention, mettre les bons CodeNames...
'---protège les feuilles créées, enregistre et ferme les fichiers--
For i = Workbooks.Count To 1 Step -1
With Workbooks(i)
If Right(.Name, 5) = ".xlsx" Then
.Sheets(1).Protect "toto" 'mot de passe à adapter
.Close True
End If
End With
Next i
If nfichier Then MsgBox nfichier & " fichiers nominatifs avec " & nfiche & " fiches créés en " & Format(Timer - t, "0.0 \sec"), , "Création"
nfichier = 0: nfiche = 0 'RAZ
End Sub
Sub Creations(F1 As Worksheet, F2 As Worksheet, colnom%)
Dim c As Range, nom$, i%, lig&
For Each c In F2.Range("B2:R15")
If Not c.Locked Then c = "" 'sécurité, vide les cellules déverrouillées
Next c
For Each c In F1.Range("A4", F1.Range("A" & F1.Rows.Count).End(xlUp))
nom = c(1, colnom)
If IsNumeric(CStr(c)) And nom <> "" Then
'---crée le fichier---
On Error Resume Next
If IsError(Workbooks(nom)) Then
On Error GoTo 0
nfichier = nfichier + 1 'comptage
Workbooks.Add xlWBATWorksheet 'nouveau document avec 1 feuille
ActiveWorkbook.SaveAs chemin & nom & ".xlsx", 51 'enregistre au format 51 = .xlsx
ActiveSheet.Name = Left(nom, 31)
For i = 1 To 19
Columns(i).ColumnWidth = F2.Columns(i).ColumnWidth 'largeur des colonnes
Next i
ActiveWindow.DisplayGridlines = False 'masque le quadrillage (facultatif)
End If
'---crée la fiche---
nfiche = nfiche + 1 'comptage
F2.Range("C15") = c
With Workbooks(nom & ".xlsx").Sheets(1)
lig = .Range("C" & .Rows.Count).End(xlUp).Row + 1
If lig = 2 Then lig = 1
F2.Rows("1:15").Copy .Cells(lig, 1) 'pour les formats, la ligne 1 évite un problème de bordure
.Cells(lig, 1).Resize(15, 18) = F2.Range("A1:R15").Value 'copie les valeurs
.Cells(lig + 14, 3).Validation.Delete 'supprime la liste de validation
End With
End If
Next c
End Sub