Création automatique de feuille sur excel

Résolu/Fermé
AC211984 Messages postés 30 Date d'inscription mardi 2 décembre 2014 Statut Membre Dernière intervention 20 avril 2016 - 2 déc. 2014 à 19:07
AC211984 Messages postés 30 Date d'inscription mardi 2 décembre 2014 Statut Membre Dernière intervention 20 avril 2016 - 16 déc. 2014 à 19:08
Bonjour,

Je constitue actuellement une base de données d'un inventaire et de diagnostic de patrimoine arboré.
Ma première feuille contient toutes les données accumulées pour chaque arbre sur une ligne avec une multitude de colonnes comprenant chacune un renseignement spécifique.

La suite est un peu plus compliqué, en effet, je souhaite créer, pour chaque arbre, une fiche d'observations qui accueillera toutes les données pré-remplit dans mon premier tableau sur une fiche individuelle.
Mais, pour éviter de recopier à chaque fois les mêmes données dans chaque nouvelle feuille, je voudrai créer, en cliquant sur un bouton (pour faire simple), une fiche qui se remplirait, de manière automatique avec les données déjà existantes.

Je ne sais pas si c'est assez clair, et je ne sais pas si c'est faisable non plus, j'ai déjà cherché en bidouillant un peu, mais je n'y parviens pas !

Si l'un ou l'une, ou plusieurs d'entre vous ont des idées, des pistes, ou des solutions, je suis preneuse...je gagnerai un temps phénoménal !

Merci d'avance pour vos réponses.

Bonne soirée.
A voir également:

6 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 déc. 2014 à 19:13
Bonjour,

Si je comprend bien..
Tu souhaites :

Pour chaque LIGNE de ta feuil1 (correspondant donc à UN arbre)
Créer UNE nouvelle Feuille....
Cette feuille contiendrait le contenu des différentes colonnes de la ligne en question.

Il te faut donc faire ça en VBA ...

Dans l'idéal :
Tu créés une feuille MODEL
tu y places tes différents textes.. les formats de tes cellules..; les styles (couleur..).

Ensuite, via une Macro :
Tu parcours ton tableau (celui de ta feuille 1 ).
Pour chaque ligne :
- On duplique la feuille Modele .. que tu renomme (en te basant sur le contenu d'une colonne de ta ligne )
- On prend le contenu des différentes colonnes et on les places dans les bonnes case de cette nouvelle feuille...
...


Donc avant de pouvoir t'aider plus... il faut :
1 - Tu créés ta feuille Modele
2 - Tu déposes ton fichier sur un site comme : cijoint.com
3 - Tu nous colles le lien vers ce fichier ici
4 - Tu indiques précisément.. quelle colonne correspond à quel emplacement dans ta feuille à remplir..



0
AC211984 Messages postés 30 Date d'inscription mardi 2 décembre 2014 Statut Membre Dernière intervention 20 avril 2016
2 déc. 2014 à 20:54
Bonsoir,

Merci pour votre réponse, j'ai donc placé le nom de chaque colonne comme vous me l'avez indiqué sur ma feuille de base. Certaines ont des blancs car certaines choses se traitent vraiment au cas par cas.

Voici le lien où trouvé le fichier :

https://www.cjoint.com/?0Lcu4PIzeqv

Si je comprends bien, il faut absolument passer par une macro, mais je ne comprends pas trop comment créer chaque feuille, avec à chaque fois les infos d'une ligne différente avec la même macro, j'avoue cependant, ne pas bien maitriser cet outil !

En tout cas, merci de l'aide ! C'est très gentil à vous.

Bonne soirée.
0
AC211984 Messages postés 30 Date d'inscription mardi 2 décembre 2014 Statut Membre Dernière intervention 20 avril 2016
2 déc. 2014 à 22:17
Je viens d'essayer le code...génial !

Par contre certaine colonnes n'ont pas prises si je puis dire. Je peux les ajouter dans le code directement ?

Je ne comprends pas trop comment vous avez fait, je vais creuser et décortiquer ;)

Est-il possible d'appliquer ce code en "option". Par exemple, je clique dans la colonne C sur le nom de l'arbre dans la ligne concernée et là seulement la feuille se créée avec toutes les données ?

En tout cas merci beaucoup, c'est un travail super, je vais pouvoir bien avancer.

Bonne soirée.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 déc. 2014 à 22:24
Je te code ça demain.
0
AC211984 Messages postés 30 Date d'inscription mardi 2 décembre 2014 Statut Membre Dernière intervention 20 avril 2016
2 déc. 2014 à 22:28
Ok merci, ce serait long et compliqué de m'expliquer comment faire ? J'aimerai le comprendre et en faire d'autres si besoin.

Bonne soirée.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 déc. 2014 à 22:33
Ben il faut des connaissances en vba (pour la partie. .je clique sur une ligne..)
Donc oui..ca risque d'être long ;-)
Mais j'essaierai de commenter suffisamment le code.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
3 déc. 2014 à 10:59
Voila les modifs (si il y a des choses que tu ne comprends pas dis le moi)

Code à placer dans un MODULE
Sub AutoCreaAllSheets()
'Macro de création auto de TOUTES les feuilles
'----------------------------------------------
Dim Fdata As Worksheet
Dim NomF As String
Dim ListFeuille As Range
Dim ligne As Integer
Set Fdata = Sheets("Liste arbres")
Set ListFeuille = Fdata.Range("B5:B500")

'on boucle sur les différentes lignes :
For Each cell In ListFeuille
  'On récupère le nom de la "future" feuille
   NomF = cell.Value
   
   'si nomF <> ""
   If NomF <> "" Then
   'On recupere le numero de ligne
    ligne = cell.Row
    Call AutoCreaSheets(Fdata, NomF, ligne)
   End If
    
  Next 'Ligne suivante
End Sub


Sub AutoCreaSheets(Fdata As Worksheet, NomF As String, ligne As Integer)
'---------------------------------------------
'Macro de création auto d'une Feuille
'----------------------------------------------

   'On duplique la feuille Modele
    Call duplicateModele(NomF)
     
   '--------------------------------------
   'On rempli les cases ...
   '--------------------------------------
   
   'recupération des valeurs de la feuille source
    Station = Fdata.Cells(ligne, 1).Value ' Colonne A
    Numerotation = Fdata.Cells(ligne, 2).Value ' Colonne B
    date_plantation = Fdata.Cells(ligne, 4).Value ' Colonne D
    type_plantation = Fdata.Cells(ligne, 5).Value ' Colonne E
    stade_dev = Fdata.Cells(ligne, 6).Value ' Colonne F
    Conduite = Fdata.Cells(ligne, 7).Value  ' Colonne G
    Circonférence = Fdata.Cells(ligne, 8).Value    'Colonne H
    Hauteur = Fdata.Cells(ligne, 9).Value   'Colonne I
    Collet_note = Fdata.Cells(ligne, 10).Value ' Colonne J
    Collet_cmt = Fdata.Cells(ligne, 11).Value ' Colonne K
    tronc_note = Fdata.Cells(ligne, 12).Value ' Colonne L
    tronc_cmt = Fdata.Cells(ligne, 13).Value ' Colonne M
    Houppier_note = Fdata.Cells(ligne, 14).Value ' Colonne N
    Houppier_cmt = Fdata.Cells(ligne, 15).Value ' Colonne O
    Etat_general = Fdata.Cells(ligne, 19).Value 'Colonne S
    Etat_general = Fdata.Cells(ligne, 20).Value 'Colonne T
    Dangerosite = Fdata.Cells(ligne, 21).Value   ' Colonne U
    Maladies = Fdata.Cells(ligne, 16).Value   'Colonne P
    Parasites = Fdata.Cells(ligne, 17).Value    'Colonne Q
    Blessures = Fdata.Cells(ligne, 18).Value    'Colonne R
    Analyses_compl = Fdata.Cells(ligne, 22).Value    'Colonne V
    Preconisations = Fdata.Cells(ligne, 23).Value   'Colonne W
    Valeur_ecologique = Fdata.Cells(ligne, 24).Value    'Colonne X
    Valeur_economique = Fdata.Cells(ligne, 25).Value    'Colonne Y

    
    ' On copie les valeurs dans la nouvelle Feuille...
    Sheets(NomF).Range("B4").Value = Station
    Sheets(NomF).Range("B5").Value = Numerotation
    Sheets(NomF).Range("B10").Value = date_plantation
    Sheets(NomF).Range("B11").Value = type_plantation
    Sheets(NomF).Range("B12").Value = stade_dev
    Sheets(NomF).Range("B13").Value = Conduite
    Sheets(NomF).Range("B14").Value = Circonférence
    Sheets(NomF).Range("B15").Value = Hauteur
    Sheets(NomF).Range("B19").Value = Collet_note
    Sheets(NomF).Range("C19").Value = Collet_cmt
    Sheets(NomF).Range("B20").Value = tronc_note
    Sheets(NomF).Range("C20").Value = tronc_cmt
    Sheets(NomF).Range("B21").Value = Houppier_note
    Sheets(NomF).Range("C21").Value = Houppier_cmt
    Sheets(NomF).Range("B22").Value = Etat_general
    Sheets(NomF).Range("C22").Value = Etat_general
    Sheets(NomF).Range("B24").Value = Dangerosite
    Sheets(NomF).Range("B25").Value = Maladies
    Sheets(NomF).Range("B26").Value = Parasites
    Sheets(NomF).Range("B27").Value = Blessures
    Sheets(NomF).Range("B29").Value = Analyses_compl
    Sheets(NomF).Range("B30").Value = Preconisations
    Sheets(NomF).Range("B32").Value = Valeur_ecologique
    Sheets(NomF).Range("B33").Value = Valeur_economique

End Sub

Function FExist(NomF As String) As Boolean ' test si la feuille existe
    Application.ScreenUpdating = False
    On Error Resume Next
    FExist = Not Sheets(NomF) Is Nothing
    Application.ScreenUpdating = True
End Function

Sub duplicateModele(strFeuilName As String)
' avant de poursuivre on regarde si la feuille existe déjà
If FExist(strFeuilName) Then
  recreer = MsgBox("La feuille " & strFeuilName & " existe déjà... !" & vbCrLf & " voulez-vous la recréer ?", vbYesNo)
  ' si on dit de la recréer.. on la supprime d'abord..
  If recreer = 6 Then
    Application.DisplayAlerts = True
    Sheets(strFeuilName).Delete
    Application.DisplayAlerts = False
  Else
    Exit Sub
  End If
End If
    'On duplique la feuille modèle
    Sheets("MODEL").Select
    Sheets("MODEL").Copy After:=Sheets(ThisWorkbook.Sheets.Count)
    'On renomme la feuille
    ActiveSheet.Name = strFeuilName
End Sub



Code à mettre Dans l'objet Feuil1:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim Fdata As Worksheet
 Dim NomF As String
 Dim ligne As Integer
 Set Fdata = Sheets("Liste arbres")
 
 'declenchement de la macro lors du clic dans les cellules de la colonne 2
 If Target.Column = 2 Then
 'On recupere le numero de ligne
     ligne = Target.Row
     NomF = Cells(ligne, 2).Value
    'si nomF <> ""
    If NomF <> "" Then
    
     Call AutoCreaSheets(Fdata, NomF, ligne)
    End If
 
 End If
End Sub

0
AC211984 Messages postés 30 Date d'inscription mardi 2 décembre 2014 Statut Membre Dernière intervention 20 avril 2016
3 déc. 2014 à 13:11
Bonjour,

Je ne comprends pas où je dois placer les codes, le MODULE ? Et l'OBJET DE LA FEUILLE ?

Je ne vois pas trop...

Merci.
0
AC211984 Messages postés 30 Date d'inscription mardi 2 décembre 2014 Statut Membre Dernière intervention 20 avril 2016
3 déc. 2014 à 13:25
J'ai trouvé pour la copie dans le module.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
3 déc. 2014 à 14:14
pour la Feuil :
Dans ton visual basic éditor.. dans l'arboréscence de gauche tu as les objets : Feuil et classeur (thisWorkbook)..
Toi tu cliques sur la "Feuil" correspondant à ta liste d'Arbres et tu y colles le code que je t'ai donné



0
AC211984 Messages postés 30 Date d'inscription mardi 2 décembre 2014 Statut Membre Dernière intervention 20 avril 2016
3 déc. 2014 à 18:06
J'ai bien copié les codes là où il fallait, mais il y a toujours des cellules qui ne se remplissent pas. Je ne comprends pas pourquoi. Et à quoi sert le deuxième code ? Celui que je colle dans l'objet de la feuille ?
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
3 déc. 2014 à 18:50
Ce que je t'ai codé . c'est UNIQUEMENT que Lorsque tu cliques dans une cellule de la colonne 2 ( donc la colonne B ) de ta feuille liste d'Arbres .. ça déclenche la création de cette Feuille (et uniquement de celle là .)

Par contre.. les cellules qui ne se remplissent pas.. et ben.. si tu ne me donnes pas des exemples ça risque d'être compliqué de trouver....

Sachant que pour que tu comprennes le code ...

'--------------------------------------
   'On rempli les cases ...
   '--------------------------------------
   
   'recupération des valeurs de la feuille source
    Station = Fdata.Cells(ligne, 1).Value ' Colonne A
    Numerotation = Fdata.Cells(ligne, 2).Value ' Colonne B
    date_plantation = Fdata.Cells(ligne, 4).Value ' Colonne D
    type_plantation = Fdata.Cells(ligne, 5).Value ' Colonne E
    stade_dev = Fdata.Cells(ligne, 6).Value ' Colonne F
    Conduite = Fdata.Cells(ligne, 7).Value  ' Colonne G
    Circonférence = Fdata.Cells(ligne, 8).Value    'Colonne H
    Hauteur = Fdata.Cells(ligne, 9).Value   'Colonne I
    Collet_note = Fdata.Cells(ligne, 10).Value ' Colonne J
    Collet_cmt = Fdata.Cells(ligne, 11).Value ' Colonne K
    tronc_note = Fdata.Cells(ligne, 12).Value ' Colonne L
    tronc_cmt = Fdata.Cells(ligne, 13).Value ' Colonne M
    Houppier_note = Fdata.Cells(ligne, 14).Value ' Colonne N
    Houppier_cmt = Fdata.Cells(ligne, 15).Value ' Colonne O
    Etat_general = Fdata.Cells(ligne, 19).Value 'Colonne S
    Etat_general = Fdata.Cells(ligne, 20).Value 'Colonne T
    Dangerosite = Fdata.Cells(ligne, 21).Value   ' Colonne U
    Maladies = Fdata.Cells(ligne, 16).Value   'Colonne P
    Parasites = Fdata.Cells(ligne, 17).Value    'Colonne Q
    Blessures = Fdata.Cells(ligne, 18).Value    'Colonne R
    Analyses_compl = Fdata.Cells(ligne, 22).Value    'Colonne V
    Preconisations = Fdata.Cells(ligne, 23).Value   'Colonne W
    Valeur_ecologique = Fdata.Cells(ligne, 24).Value    'Colonne X
    Valeur_economique = Fdata.Cells(ligne, 25).Value    'Colonne Y


Cette partie du code va LIRE le contenu des cellules (de ta feuille Source).
et stocke.. pour chaque "colonne" l'information dans une variable...
par exemple :
  Station = Fdata.Cells(ligne, 1).Value ' Colonne A

Je stocke dans "Station" le contenu de la cellule correspondant à la Ligne / Colonne 1 (soit ..la colonne A)

Le deuxième pavé de cette fonction :
    ' On copie les valeurs dans la nouvelle Feuille...
    Sheets(NomF).Range("B4").Value = Station
    Sheets(NomF).Range("B5").Value = Numerotation
    Sheets(NomF).Range("B10").Value = date_plantation
    Sheets(NomF).Range("B11").Value = type_plantation
    Sheets(NomF).Range("B12").Value = stade_dev
    Sheets(NomF).Range("B13").Value = Conduite
    Sheets(NomF).Range("B14").Value = Circonférence
    Sheets(NomF).Range("B15").Value = Hauteur
    Sheets(NomF).Range("B19").Value = Collet_note
    Sheets(NomF).Range("C19").Value = Collet_cmt
    Sheets(NomF).Range("B20").Value = tronc_note
    Sheets(NomF).Range("C20").Value = tronc_cmt
    Sheets(NomF).Range("B21").Value = Houppier_note
    Sheets(NomF).Range("C21").Value = Houppier_cmt
    Sheets(NomF).Range("B22").Value = Etat_general
    Sheets(NomF).Range("C22").Value = Etat_general
    Sheets(NomF).Range("B24").Value = Dangerosite
    Sheets(NomF).Range("B25").Value = Maladies
    Sheets(NomF).Range("B26").Value = Parasites
    Sheets(NomF).Range("B27").Value = Blessures
    Sheets(NomF).Range("B29").Value = Analyses_compl
    Sheets(NomF).Range("B30").Value = Preconisations
    Sheets(NomF).Range("B32").Value = Valeur_ecologique
    Sheets(NomF).Range("B33").Value = Valeur_economique

Et bien... je fais le chemin inverse en quelques sortes...
Je colle le contenu des différentes variables ... dans la nouvelle Feuille ( Sheets(NomF) .. NomF étant une variable contenant le nom (ou le numéro devrais-je dire) de la feuille qui vient d'être créée.
Donc ici :
   Sheets(NomF).Range("B4").Value = Station

Je prend le contenu de ma variable Station (voir l'explication précédente...) et je la place dans ma nouvelle Feuille.. dans la cellule B4 ( Range("B4").Value )




Nb : J'aurais pu le faire en Une seule ligne de code... mais j'ai découpé pour que tu comprennes mieux...
En une seule ligne (pour chaque variable..) on aurait pu écrire :
' Pour Station :
Sheets(NomF).Range("B4").Value = Fdata.Cells(ligne, 1).Value
0
AC211984 Messages postés 30 Date d'inscription mardi 2 décembre 2014 Statut Membre Dernière intervention 20 avril 2016
3 déc. 2014 à 19:18
Merci pour toutes ses explications, je vais me pencher dessus pour comprendre le fonctionnement. Et je vous dirai si cela fonctionne alors. S'agissant des cellules qui ne se copie pas, ce sont les colonnes S, Z, U et C.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > AC211984 Messages postés 30 Date d'inscription mardi 2 décembre 2014 Statut Membre Dernière intervention 20 avril 2016
3 déc. 2014 à 19:19
ce sont les colonnes S, Z, U et C.

Ah ben j'ai du les zapper...désolé

Mais maintenant.. tu as toutes les infos pour les ajouter toi même ;-)
0
AC211984 Messages postés 30 Date d'inscription mardi 2 décembre 2014 Statut Membre Dernière intervention 20 avril 2016
3 déc. 2014 à 19:28
Oui, je vais essayer de le construire moi même, de bonnes heures à me creuser la cervelle en perspectives... ;)

Je pourrai vous recontacter si j'ai d'autres questions ? Sans vouloir vous déranger bien sur.

Merci beaucoup en tout cas, c'est très sympa de votre part. :)

Bonne soirée.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 déc. 2014 à 21:28
En collant ce code dans ton classeur ça devrait fonctionner

Sub AutoCreaSheets()
Dim nomF As String
Dim Fdata As Worksheet
Dim ListFeuille As Range
Dim ligne As Integer

Set Fdata = Sheets("Liste arbres")
Set ListFeuille = Fdata.Range("B5:B500")

'on boucle sur les différentes lignes :
For Each cell In ListFeuille
  'On récupère le nom de la "future" feuille
   nomF = cell.Value
   
   
   'si nomF <> ""
   If nomF <> "" Then
   'On recupere le numero de ligne
    ligne = cell.Row
    
   'On duplique la feuille Modele
    Call duplicateModele(nomF)
     
   '--------------------------------------
   'On rempli les cases ...
   '--------------------------------------
   
   'recupération des valeurs de la feuille source
    Station = Fdata.Cells(ligne, 1).Value
    Numerotation = Fdata.Cells(ligne, 2).Value
    date_plantation = Fdata.Cells(ligne, 4).Value
    type_plantation = Fdata.Cells(ligne, 5).Value
    stade_dev = Fdata.Cells(ligne, 6).Value
    Conduite = Fdata.Cells(ligne, 7).Value  ' Colonne G
    Circonférence = Fdata.Cells(ligne, 8).Value    'Colonne H
    Hauteur = Fdata.Cells(ligne, 9).Value   'Colonne I
    Collet_note = Fdata.Cells(ligne, 10).Value
    Collet_cmt = Fdata.Cells(ligne, 11).Value
    tronc_note = Fdata.Cells(ligne, 12).Value
    tronc_cmt = Fdata.Cells(ligne, 13).Value
    Houppier_note = Fdata.Cells(ligne, 14).Value
    Houppier_cmt = Fdata.Cells(ligne, 15).Value
    Etat_general = Fdata.Cells(ligne, 19).Value 'Colonne S
    Etat_general = Fdata.Cells(ligne, 20).Value 'Colonne T
    Dangerosite = Fdata.Cells(ligne, 21).Value   ' Colonne U
    Maladies = Fdata.Cells(ligne, 16).Value   'Colonne P
    Parasites = Fdata.Cells(ligne, 17).Value    'Colonne Q
    Blessures = Fdata.Cells(ligne, 18).Value    'Colonne R
    Analyses_compl = Fdata.Cells(ligne, 22).Value    'Colonne V
    Preconisations = Fdata.Cells(ligne, 23).Value   'Colonne W
    Valeur_ecologique = Fdata.Cells(ligne, 24).Value    'Colonne X
    Valeur_economique = Fdata.Cells(ligne, 25).Value    'Colonne Y

    
    ' On copie les valeurs dans la nouvelle Feuille...
    Sheets(nomF).Range("B4").Value = Station
    Sheets(nomF).Range("B5").Value = Numerotation
    Sheets(nomF).Range("B10").Value = date_plantation
    Sheets(nomF).Range("B11").Value = type_plantation
    Sheets(nomF).Range("B12").Value = stade_dev
    Sheets(nomF).Range("B13").Value = Conduite
    Sheets(nomF).Range("B14").Value = Circonférence
    Sheets(nomF).Range("B15").Value = Hauteur
    Sheets(nomF).Range("B19").Value = Collet_note
    Sheets(nomF).Range("C19").Value = Collet_cmt
    Sheets(nomF).Range("B20").Value = tronc_note
    Sheets(nomF).Range("C20").Value = tronc_cmt
    Sheets(nomF).Range("B21").Value = Houppier_note
    Sheets(nomF).Range("C21").Value = Houppier_cmt
    Sheets(nomF).Range("B22").Value = Etat_general
    Sheets(nomF).Range("C22").Value = Etat_general
    Sheets(nomF).Range("B24").Value = Dangerosite
    Sheets(nomF).Range("B25").Value = Maladies
    Sheets(nomF).Range("B26").Value = Parasites
    Sheets(nomF).Range("B27").Value = Blessures
    Sheets(nomF).Range("B29").Value = Analyses_compl
    Sheets(nomF).Range("B30").Value = Preconisations
    Sheets(nomF).Range("B32").Value = Valeur_ecologique
    Sheets(nomF).Range("B33").Value = Valeur_economique
 End If
Next 'on passe à la ligne suivante
End Sub



Sub duplicateModele(strFeuilName As String)
    Sheets("MODEL").Select
    Sheets("MODEL").Copy After:=Sheets(ThisWorkbook.Sheets.Count)
    ActiveSheet.Name = strFeuilName
End Sub





NB : Pour le nom des feuilles je me suis basé sur la colonne Numéro...


-1