Création automatique de feuille sur excel

Résolu
AC211984 Messages postés 30 Statut Membre -  
AC211984 Messages postés 30 Statut Membre -
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.

6 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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
  2. AC211984 Messages postés 30 Statut Membre
     
    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
  3. AC211984 Messages postés 30 Statut Membre
     
    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
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Je te code ça demain.
      0
    2. AC211984 Messages postés 30 Statut Membre
       
      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
    3. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      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
  4. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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
    1. AC211984 Messages postés 30 Statut Membre
       
      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
    2. AC211984 Messages postés 30 Statut Membre
       
      J'ai trouvé pour la copie dans le module.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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
    1. AC211984 Messages postés 30 Statut Membre
       
      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
    2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      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
    3. AC211984 Messages postés 30 Statut Membre
       
      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
    4. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > AC211984 Messages postés 30 Statut Membre
       
      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
    5. AC211984 Messages postés 30 Statut Membre
       
      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
  7. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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