Créer des feuilles a partir d'une liste sans les re créer
bonjour
je me suis inscrit sur ce forum dans l'espoir de trouver une réponse a mon problème
j'ai réussi a bricoler le travail suivant malgré mes connaissance limités en VBA
mon travail
mon but étant un fichier qui me permet
ne pas créer de redondance de feuilles en cliquant sur le bouton valider
- si modification d'un ligne dans la feuille liste en appuyant sur le bouton valider les feuilles correspondantes se mettent a jour
- si remplissage d'une ou de plusieurs lignes en appuyant su le bouton valider les nouvelles feuilles correspondant a ces lignes vont se crées
- des boutons pour envoyer par email la feuille crée en pièce jointe ayant pour objet le nom de la feuille avec un message standard et des destinataires a renseigner sur la feuille modèle
je vous remercie pour l’intérêt que vous allez accordez a ce projet
slts
Bonjour Timouyassup, bonjour le forum,
Peut-être comme ça :
Sub CreationFeuilleParNom()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim DerLig As Long, i As Integer
Dim NO As Worksheet 'déclare la variable NO (Nouvel Onglet)
Application.ScreenUpdating = False
'******************************************************************************************
'on commence par supprimer tous les onglets de la liste pour être sûr de tout mettre à jour
Application.DisplayAlerts = False 'empêche les messages d'Excel
For Each O In Worksheets 'boucle sur tous les onglets O du classeur
Select Case O.Name 'agit en fonction du nom de l'onglet
Case "Modèle", "Liste" 'cas Modèle ou Liste (rien ne se passe)
Case Else 'tous les autre cas
O.Delete 'supprime l'onglet O
End Select 'fin de l'action en fonction du nom de l'onglet
Next O 'prochain onglet de la boucle
Application.DisplayAlerts = True 'affiche les messages d'Excel
'******************************************************************************************
DerLig = Feuil2.Range("B" & Rows.Count).End(xlUp).Row
For i = DerLig To 4 Step -1
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set NO = Worksheets(Feuil2.Cells(i, 2)) 'définit le nouvel onglet NO (génère une erreur su cet onglet n'existe pas)
If Err <> 0 Then 'condition : si une erreur a été générée
Sheets("Modèle").Copy After:=Feuil2 'copy l'onglet modèle après l'onglet Feuil2
ActiveSheet.Name = Feuil2.Cells(i, 2) 'renomme l'onglet actif
Set NO = ActiveSheet 'définit le nouvel onglet NO
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
NO.Range("D5") = Feuil2.Cells(i, 2)
NO.Range("H5") = Feuil2.Cells(i, 3)
NO.Range("D6") = Feuil2.Cells(i, 4)
NO.Range("A8") = Feuil2.Cells(i, 5)
NO.Range("C8") = Feuil2.Cells(i, 6)
NO.Range("F8") = Feuil2.Cells(i, 7)
Feuil2.Activate
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Feuil2.Shapes.Range(Array("Picture " & i - 3)).Select 'sélectionne l'image correspondante (génère une erreur si l'image n'existe pas)
If Err <> 0 Then GoTo suite 'si une erreur a été générée, va à l'étiquette "suite"
Selection.Copy
NO.Activate
NO.Range("A10").Select
NO.Paste
Selection.ShapeRange.IncrementLeft 260
Selection.ShapeRange.IncrementTop 24
suite: 'étiquette
On Error GoTo 0 'annule la gestion des erreurs
Next i
Application.ScreenUpdating = True
End Sub
Seul le dernier point n'est pas traité...
[Édition]
J'avais mal lu le titre : sans les recréer !... Il suffit de supprimer le code entre les ****
merci chef ça répond tout a fait a ma première roquette j'en suis très ravi . merci encore une fois
je vais voir la communauté pour mon second point
Re,
Je me suis rendu compte que si tu changeais de photo dans la liste, on se retrouvait avec deux photos dans l'onglet correspondant.
J'ai aussi vu un bug avec les photos nommées Picture 1, Picture 2, etc.. Ce bug a disparu en les Nommant Picture_1, Picture_2, etc..
Le code modifié :
Sub CreationFeuilleParNom()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim DerLig As Long, i As Integer
Dim NO As Worksheet 'déclare la variable NO (Nouvel Onglet)
Application.ScreenUpdating = False
DerLig = Feuil2.Range("B" & Rows.Count).End(xlUp).Row
For i = 4 To DerLig
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set NO = Worksheets(Feuil2.Cells(i, 2).Value) 'définit le nouvel onglet NO (génère une erreur su cet onglet n'existe pas)
If Err <> 0 Then 'condition : si une erreur a été générée
Sheets("Modèle").Copy After:=Sheets(Sheets.Count) 'copy l'onglet modèle en dernière position
ActiveSheet.Name = Feuil2.Cells(i, 2) 'renomme l'onglet actif
Set NO = ActiveSheet 'définit le nouvel onglet NO
End If 'fin de la condition
NO.Range("D5") = Feuil2.Cells(i, 2)
NO.Range("H5") = Feuil2.Cells(i, 3)
NO.Range("D6") = Feuil2.Cells(i, 4)
NO.Range("A8") = Feuil2.Cells(i, 5)
NO.Range("C8") = Feuil2.Cells(i, 6)
NO.Range("F8") = Feuil2.Cells(i, 7)
NO.Shapes.Range(Array("Picture_" & i - 3)).Delete
If Err <> 0 Then Err = 0
Feuil2.Activate
Feuil2.Shapes.Range(Array("Picture_" & i - 3)).Select 'sélectionne l'image correspondante (génère une erreur si l'image n'existe pas)
If Err <> 0 Then GoTo suite 'si une erreur a été générée, va à l'étiquette "suite"
Selection.Copy
NO.Activate
NO.Range("A10").Select
NO.Paste
Selection.ShapeRange.IncrementLeft 260
Selection.ShapeRange.IncrementTop 24
suite: 'étiquette
NO.Range("A1").Select
On Error GoTo 0 'annule la gestion des erreurs
Next i
Application.ScreenUpdating = True
End Sub