Problème avec une copie sur n lignes

Bonjour,

Je vous sollicite car la macro que j'ai réalisée n’aboutit pas au bon résultat lorsqu'elle est exécutée n fois.

Son objet est de créer x lignes d'enregistrements sur la base d'un formulaire qui peut être lancées plusieurs fois.

Mon document est constitué de deux feuilles.

  • Une feuille de formulaire : des champs sont à saisir, et la macro est associée au bouton générer.
  • Une feuille de données, initialement vide, que le formulaire doit contribuer à remplir.

Dans le formulaire, il y a un champ "Nb_passager" qui correspond au nombre de lignes qui doit être créé dans la feuille de données. Le reste de champs, sont des champs de valeurs à saisir par ligne.

Pour simplifier, j'ai réduis le nombre de champs du formulaire, nous prendrons Nb_passager = 10 et nous l'exécuterons 4 fois.

Le problème que je rencontre est le suivant.

Si je mets la ligne de code que j'ai marqué du commentaire "/******", dans la la boucle FOR, alors lorsque je lance la macro la première fois, j'ai 20 lignes de créées, et non 10. Par contre, la deuxième fois, 3e et 4e (et n fois), à chaque exécution, j'en ai bien 10 de créées à la suite. A la fin, j'ai donc un différentiel de 10 qui s'impute toujours au premier lancement de la macro.

Si je la mets avant la boucle FOR, lorsque je lance la première fois la macro, j'ai alors bien le nombre de lignes correspondant lors du lancement de la première requête, à savoir 10. En revanche, par la suite, à la 2nd, 3e, 4e ou n exécution de la macro, je n'ai seulement qu'1 ligne de créée, et non n fois 10.

Je ne sais pas d'où vient le problème dans ce code qui conduit à ne pas créer le bon nombre de lignes. Pouvez-vous s'il vous plait m'éclairer?

Pour info, j'ai fait un Msgbox pour savoir ce que renvoyait derniere_ligne. Il renvoi bien la valeur 1 (qui correspond à la première ligne comportant l’entête des colonnes).

Un grand merci par avance,

Ozy

Dim Feuille_formulaire As Worksheet
Dim Feuille_données As Worksheet

Dim Voyage_code As Integer
Dim Voyage_time_departure As Date
Dim Voyage_time_arrival As Date
Dim Derniere_Ligne As Integer

Set Feuille_formulaire = Worksheets("Générateur Base Mailing")
Set Feuille_données = Worksheets("Base_mailing")

Voyage_code = Worksheets("Générateur Base Mailing").Range("F15").Value
Voyage_time_departure = Worksheets("Générateur Base Mailing").Range("F17").Value
Voyage_time_arrival = Worksheets("Générateur Base Mailing").Range("G17").Value

For i = 1 To Nb_passager

Derniere_Ligne = Worksheets("Base_mailing").Range("E" & Rows.Count).End(xlUp).Row /*********

Worksheets("Base_mailing").Range("K" & Derniere_Ligne + 1 & ":K" & Nb_passager + 1) = Voyage_code
Worksheets("Base_mailing").Range("L" & Derniere_Ligne + 1 & ":L" & Nb_passager + 1) = Voyage_time_departure
Worksheets("Base_mailing").Range("M" & Derniere_Ligne + 1 & ":M" & Nb_passager + 1) = Voyage_time_arrival

Next

Bonjour,

Pas sûr d'avoir bien compris !

J'ai supposé que Nb_passager est un nom de plage.

Essaie ce code :

Sub Test()
Dim Feuille_formulaire As Worksheet
Dim Feuille_données As Worksheet

Dim Voyage_code As Integer
Dim Voyage_time_departure As Date
Dim Voyage_time_arrival As Date

Dim Derniere_Ligne As Integer

    Set Feuille_formulaire = Worksheets("Générateur Base Mailing")
    Set Feuille_données = Worksheets("Base_mailing")

    Voyage_code = Worksheets("Générateur Base Mailing").Range("F15").Value
    Voyage_time_departure = Worksheets("Générateur Base Mailing").Range("F17").Value
    Voyage_time_arrival = Worksheets("Générateur Base Mailing").Range("G17").Value

    For i = 1 To Feuille_formulaire.Range("Nb_passager")
        Derniere_Ligne = Worksheets("Base_mailing").Range("E" & Rows.Count).End(xlUp).Row ' /*********
        Worksheets("Base_mailing").Range("K" & Derniere_Ligne + 1 & ":K" & Derniere_Ligne + i) = Voyage_code
        Worksheets("Base_mailing").Range("L" & Derniere_Ligne + 1 & ":L" & Derniere_Ligne + i) = Voyage_time_departure
        Worksheets("Base_mailing").Range("M" & Derniere_Ligne + 1 & ":M" & Derniere_Ligne + i) = Voyage_time_arrival
    Next i

End Sub

A+

Bonjour Frangy,

Merci pour ton aide, ça m'a permis de débloquer mon problème.

Tout d'abord oui, tu as une bonne déduction, Nb_passager était en effet un range.

Ensuite, je me basé sur Dernière_ligne et d'utilisé la variable i de la boucle m'a permis de faire fonctionner le tout. En revanche, non pas en mettant la ligne de code Derniere_ligne dans la boucle, mais hors de la boucle.

J'ai mis le code qui fonctionne ci-dessous. Si ca peut servir à quelqu'un un jour.

Encore merci Frangy !

Brian

Dim Feuille_formulaire As Worksheet
Dim Feuille_données As Worksheet

Dim Nb_passager As Integer
Dim Voyage_code As Integer
Dim Voyage_time_departure As Date
Dim Voyage_time_arrival As Date
Dim Derniere_Ligne As Integer

Set Feuille_formulaire = Worksheets("Générateur Base Mailing")
Set Feuille_données = Worksheets("Base_mailing")

Nb_passager = Worksheets("Générateur Base Mailing").Range("F9").Value
Voyage_code = Worksheets("Générateur Base Mailing").Range("F15").Value
Voyage_time_departure = Worksheets("Générateur Base Mailing").Range("F17").Value
Voyage_time_arrival = Worksheets("Générateur Base Mailing").Range("G17").Value

Derniere_Ligne = Worksheets("Base_mailing").Range("E" & Rows.Count).End(xlUp).Row

For i = 1 To Nb_passager

Worksheets("Base_mailing").Range("K" & Derniere_Ligne + 1 & ":K" & Derniere_Ligne + i) = Voyage_code
Worksheets("Base_mailing").Range("L" & Derniere_Ligne + 1 & ":L" & Derniere_Ligne + i) = Voyage_time_departure
Worksheets("Base_mailing").Range("M" & Derniere_Ligne + 1 & ":M" & Derniere_Ligne + i) = Voyage_time_arrival

Next
Rechercher des sujets similaires à "probleme copie lignes"