Macro pour "multiplier"des lignes qui contiennent des listes deroulantes
Bonjour à toutes et à tous,
Nouveau sur ce forum et débutant en VBA, je rencontre une difficulté avec la création d'une macro que je n'arrive pas à résoudre (j'ai même essayé Chat GPT, c'est dire...).
Je suis en train de créer un fichier excel afin de générer des devis pour mon agence de voyage réceptive. Ces devis comportent une partie chiffrée et une partie texte, un itinéraire et une description de cet itinéraire jour par jour, ce que j'appelle plus loin "journée" ou "jour".Le but final est de pouvoir créer un devis chiffré en effectuant les choix des listes déroulantes.
J'ai déja créé un fichier avec les paramètres pour créer une journée (en pièce jointe). Cette journée est présente sur mon fichier sur la feuille Trip Builder. Sur cette feuille la "journée" à modifier consiste en un formulaire composé d'un ensemble de listes déroulantes à selectionner (certaines par validation de données, d'autres avec une macro).
Ce formulaire s'étend de la ligne 31 a la ligne 59 de la colonne A a la colonne L. Sur la ligne 31 apparait la date d'arrivée et le "numéro" du jour (comprendre JOUR 1). Dans la cellule E9, j'ai un chiffre qui représente le nombre de jours dont j'ai besoin. Je souhaite créer une macro sur un module, activée par un bouton qui copie mon formulaire le nombre de fois présent en E9 et que la ligne correspondante a la ligne 31 (donc a partir de la ligne 60) affiche en A60 la date de A31 +1 et dans la colonne B JOUR 2, et ainsi de suite. Le plus important pour moi est que les cellules contenant des listes déroulantes gardent leur fonctionalité que ce soit celles qui fonctionnent a partir d'une macro ou celles qui fonctionnent a partir d'une validation de données. La macro doit d'actualiser a chaque fois que j'appuis sur le bouton.
Je vous remercie par avance pour vos lumières!
Muchos saludos desde Mexico,
Fred.
buenas noches,
Sub Multiplier_Jour1()
Dim iLignes, iDernier, i, c, x
With Range("Jour_01") 'plage nommée jour 1
iLignes = .Rows.Count 'nombre de lignes de cette plage
With .Parent.UsedRange
iDernier = .Row + .Rows.Count - 1 'derniere ligne de cette feuille
End With
x = iDernier - .Row - iLignes + 1 'lignes à supprimer
If x > 0 Then .Offset(iLignes).Resize(x).EntireRow.Delete 'supprimer lignes en dessous "jour_01"
Application.EnableEvents = False 'déactiver évents
For i = 2 To Range("Nombre_de_Jours").Value 'boucle nombre de jours
Set c = .Offset((i - 1) * (iLignes + 5)).Resize(iLignes) 'plage pour jour X (5 = pour avoir quelque lignes supplémentaire, (qu'on cachera plus tard ???)
.Copy c 'copier jour1
c.Name = "Jour_" & Format(i + 1, "00") 'nommer la plage
c.Cells(1).Resize(, 2).Value = Array(.Cells(1).Value2 + i - 1, "Jour" & i) 'ces 2 cellules
Next
Application.EnableEvents = True
End With
End SubBonjour Bart et merci beaucoup pour votre aide,
La macro fonctionne très bien pour toutes les cellules sauf pour les cellules de la colonne B (j'ai une cascade de listes déroulantes dans le jour 1 en A32, A34, A36 et A38 régie par une macro). Les cellules correspondantes dans les jours suivants n'affichent pas la cascade de listes déroulantes... Je suis sur excel 2019, peut être est-ce le problème?
re,
comme ceci ?
Pourquoi utilisez-vous autant de lignes (jusqu'à 200.000 par feuille) qui servent à rien ?
Bonjour Bart,
Encore merci pour votre réponse. Je vais regarder comment est ellaboré votre code car la macro reste ENFIN valide et continue à fonctionner! Toutefois, il me semble que le nombre de jours ne s'actualise pas mais je vais essayer d'y remédier par moi même.
Concernant les lignes, ma base de données n'est pas complete, il manque beaucoup d'hôtels notamment. En plus de cela je devrais ne plus avoir accès à la base moi même d'ici quelques mois. Alors comme les utilisateurs finaux risquent de ne pas savoir bien gérer la structure du fichier, et le temps que la personne que je souhaite former arrive à "maturité", je préfère prevoir large...
Encore une fois, merci beaucoup pour votre aide précieuse!
Bonne journée à vous!