Répétition automatique de tableau/ligne
Bonjour tout le monde,
Nouveau sur le forum et stagiaire dans une entreprise j'ai besoin de quelques conseils pour le développement d'un outil Excel.
Pour faire simple, j'ai besoin de créer une fiche d'état des lieux pour des bâtiments. Chaque bâtiment a sa fiche avec ses caractéristiques.
Globalement la fiche d'état des lieux pour un bâtiment c'est un tableau de 2 colonnes et une dizaine de lignes. Le problème c'est que pour chaque projet, le nombre de bâtiment est différent. Dans l'objectif de faire une feuille Excel assez ergonomique j'aimerais une macro où il me suffit de rentrer le nombre de bâtiment à étudier dans une cellule pour que cela me créer le bon nombre de tableaux sur ma feuille Excel, ni trop ni pas assez.
Oui il y a le copier coller et oui je pourrais faire une feuille Excel par bâtiment, mais l'outil est plus complexe que ca.
J'ai donc bel et bien besoin de la fiche état des lieux de tous mes bâtiments sur une même feuille.
Si vous avez des tutos, lien forum ou autres qui pourraient m'aider à réaliser cela je suis preneur.
Cordialement
Bonjour,
Pourquoi pas une simple MEFC ou macro qui masquerai/afficherai le contenu des cellules ou lignes en fonction du nombre de bâtiments inclus dans le projet ?
Mais avant il nous faudrait une trame de votre feuille (anonymisée) afin d'ajuster la macro au plus près du besoin tel qu'avoir la ligne de départ, le nombre de lignes par bâtiment, le nombre de lignes vierges entre chaque bâtiment etc ...
Sans fichier représentatif, voir une feuille avec la situation avant VS la situation après, peu de chance que vous ayez un retour.
Cdlt,
Bonjour Ergotamine,
tout d'abord merci pour votre réponse.
Le problème avec une macro qui masquerait/afficherait les cellules inutiles ou avec une simple MEFC c'est que je ne suis pas sûr que cela soit très compatible avec les nuances de mes différents projets. Je peux passer d'une étude rapide de 2 ou 3 bâtiments à une étude de 30,40 voir 50 bâtiments. Il faut donc que le fichier soit très modulaire et dû peut que je connais je ne suis pas sûr que cela soit la solution la plus adapter.
Mais peut-être que je me trompe ! je vous ai donc joint un simple fichier Excel faisait office de ce que j'avais en tête. Une simple case où l'on vient saisir le nombre des bâtiments et en dessous un exemple très simplifier de tableau d'état des lieux qui se répéterait N fois pour les N bâtiment.
Merci d'avance pour le temps que vous accorderez à me répondre.
Cordialement
Bonjour,
Non je pense que vous avez raison. Par contre étonnante de mettre les différents tableaux en colonne en non en ligne. Cependant, avec la configuration actuelle de votre fichier, à inclure dans le module de code de votre feuille 1 :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("E2")) Is Nothing And IsNumeric(Range("E2")) Then
Application.EnableEvents = False
Range(Cells(5, 5), Cells(9, Application.Max(5, Cells(Columns.Count, 5).End(xlToLeft).Column))).Clear
Range("A5:C9").Copy
For I = 1 To Range("E2")
Cells(5, 1).Offset(, I * 3).PasteSpecial
Cells(5, 1).Offset(, I * 3 + 1) = "Bâtiment " & I + 1
Next I
Application.CutCopyMode = False
Application.EnableEvents = True
Columns.AutoFit
End If
End SubAinsi, dès lorsque que vous modifiez une valeur en E2, le nombre de table s'adapter automatiquement.
Cdlt,
Bonjour Ergotamine,
Tout d'abord merci beaucoup pour votre aide !
Vis-à-vis du code que vous m'avait fourni j'arrive bien à le faire marcher pas de problème.
J'aurais cependant 2 petites requêtes à vous demander:
- Je suis assez nul en code, pourriez-vous me faire des commentaires afin de mieux comprendre ce que vous faite à chaque ligne ? De plus vous avez raison, travailler en colonne est une erreur de ma part. Les commentaires m'aideront à passer de colonne en ligne.
- Enfin la valeur saisie correspond au nombre de tableau à ajouter et non pas au nombre de tableau en tout. En gros il y a toujours un tableau trop. Comment faire pour le supprimer ?
Encore merci,
Cdlt
Bonjour,
Je me suis apperçu d'une petite coquille dans mon code sur le nettoyage des plages où j'ai inversé ligne et colonne. J'ai corrigé le tableau+1 et ai commenté le code :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim I As Byte
If Not Application.Intersect(Target, Range("E2")) Is Nothing And IsNumeric(Range("E2")) Then 'Si la valeur en E2 est numérique et seule la valeur change est E2 alors
Application.EnableEvents = False 'On désactive les procédures évenementielles (évite boucle infinie)
Range(Cells(5, 5), Cells(9, Application.Max(5, Cells(5, Columns.Count).End(xlToLeft).Column + 1))).Clear 'On nettoie la plage L5C5:L9CMAX où CMAX est la dernière colonne pleine de la ligne 5 + 1
Range("A5:C9").Copy 'On copie la plage A5:C9
For I = 1 To Range("E2") - 1 'Pour I = 1 à la valeur de E2-1
Cells(5, 1).Offset(, I * 3).PasteSpecial 'On colle la plage à partir de la cellule de la cellule L5C1 décalée de 3*I vers la droite
Cells(5, 1).Offset(, I * 3 + 1) = "Bâtiment " & I + 1 'On inscrit le bâtiment dans la cellule L5C1 décalée de 3*I+1 vers la droite
Next I 'On boucle sur le I suivant
Application.CutCopyMode = False 'On vide le presse papier
Application.EnableEvents = True 'On réactive les procédures évenementielles (si E2 rechange)
Columns.AutoFit 'On ajuste la largeur des colonnes
End If
End SubEt comme en ligne c'est plus simple à coder pour moi (l'habitude je pense ..) :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim I As Byte
If Not Application.Intersect(Target, Range("E2")) Is Nothing And IsNumeric(Range("E2")) Then 'Si la valeur en E2 est numérique et seule la valeur change est E2 alors
Application.EnableEvents = False 'On désactive les procédures évenementielles (évite boucle infinie)
Range(Cells(10, 2), Cells(Application.Max(Application.Max(10, Cells(Rows.Count, 2).End(xlUp).Row)), 3)).Clear 'On nettoie la plage L10C2:LMAXC3 où LMAX est la dernière ligne pleine de la colonne 2
Range("B4:C9").Copy 'On copie la plage B4:C9
For I = 1 To Range("E2") - 1 'Pour I = 1 à la valeur de E2-1
Cells(4, 2).Offset(I * 6).PasteSpecial 'On colle la plage à partir de la cellule de la cellule L4C2 décalée de 6*I vers le bas
Cells(4, 2).Offset(I * 6 + 1) = "Bâtiment " & I + 1 'On inscrit le bâtiment dans la cellule L4C2 décalée de 6*I+1 vers le bas
Next I 'On boucle sur le I suivant
Application.CutCopyMode = False 'On vide le presse papier
Application.EnableEvents = True 'On réactive les procédures évenementielles (si E2 rechange)
End If
End SubJe vous laisse adapter à votre fichier si besoin.
Cdlt,