Copier des lignes

Bonjour,

Dans une feuille Facture , je rentre des items

Je souhaite que en appuyant sur le bouton valider, cela copie les lignes de la facture vers une autre feuille Facturation.

Mon soucis est que cela ne copie que la premiere ligne de la facture. facture 148 voir photo

J'en suis a 149 essais, pourriez vous m'aider s'il vous plait.

Merci

1 2
Private Sub CommandButton1_Click()
Dim nombre_ligne As Integer
Dim ligne As Integer
Dim dlt As Integer
'controler si toute les informations besoin sont la

    For ligne = 0 To nombre_ligne
            Sheets("Facturation").ListObjects(1).ListRows.Add
            dlt = Sheets("Facturation").Range("b9999").End(xlUp).Row

    Sheets("Facturation").Range("c" & dlt) = Range("d5")
    Sheets("Facturation").Range("d" & dlt) = Range("b16")
    Sheets("Facturation").Range("e" & dlt) = Range("c16")
    Sheets("Facturation").Range("f" & dlt) = Range("a16")
    Sheets("Facturation").Range("g" & dlt) = Range("d16")
    Sheets("Facturation").Range("h" & dlt) = Range("e16")
    Sheets("Facturation").Range("i" & dlt) = Range("d8")
    Next ligne
    Range("D8") = ""

    Sheets("Config").Range("d22") = Sheets("Config").Range("d22") + 1

    'savegarder le fichier
    ActiveWorkbook.Save

End Sub

Private Sub Worksheet_Activate()
    'Range("d4") = ""
End Sub

Bonjour,

Votre variable nombre_ligne ne parait pas initialisée. De plus, vous affectiez toujours la ligne 16 (statique) au lieu d'appliquer une incrémentation (15 + ligne) sur les lignes du corps de facture également.

Voici un code à adapter avec vos vrais noms et références. Je commence la boucle à 1.

Je vous conseille par ailleurs de nommer toutes les cellules D5, D6, D8, ... et de nommer "CorpsFacture" la zone avec les lignes (ou de nommer 5 zones comme dans le code ci-dessous) et également vos cellules de totaux. Ce sera plus simple.

Private Sub CommandButton1_Click()

Dim nombre_ligne As Integer
Dim ligne As Integer
Dim dlt As Integer

nombre_ligne = application.counta(Range("ZoneDescription")) 'compte nombre valeurs dans la colonne description de la facture
                                                     'REMPLACER "Zone..." par nom plage ou zone concernée

For ligne = 1 To nombre_ligne 'de 1 à Nb ligne

    with Sheets("Facturation") 'sur facturation
        .ListObjects(1).ListRows.Add 'ajoute ligne au tableau
        with .Range("NOMDUTABLEAU") 'sur les données du tableau (remplacer nom)
            dlt = .Rows.Count 'dernière ligne tab
            'si tableau commence en colonne C comme supposé
            'ICI, ON CONSIDERE LES PLAGES NOMMEES
            'LES RANGE QTÉ À HT NE CONTIENNENT PAS LE TITRE !
            .cells(dlt, 1).value = Range("DateFC")  '!!! CE SONT DES EXEMPLES AVEC LES PLAGES NOMMEES (ICI, D5)
            .cells(dlt, 2).value = Range("NumFC").cells(ligne) 'D4
            .cells(dlt, 3).value = Range("Client") 'D8
            .cells(dlt, 4).value = Range("Quantité").cells(ligne) 'A16, 17, ...
            .cells(dlt, 5).value = Range("Code").cells(ligne)
            .cells(dlt, 6).value = Range("ZoneDescription").cells(ligne)
            .cells(dlt, 7).value = Range("Prix").cells(ligne)
            .cells(dlt, 8).value = Range("HT").cells(ligne)
        end with
    end with

Next ligne

Range("Client") = ""

Sheets("Config").Range("d22") = Sheets("Config").Range("d22") + 1

'savegarder le fichier
'ActiveWorkbook.Save

End Sub

Cdlt,

Bonjour,

Je pense que le problème vient du fait que vous utilisiez des valeurs fixe au lieu de variable:

Sheets("Facturation").Range("d" & dlt) = Range("b16")

Du coup toute la colonne C de la feuille Facturation sera égale à la cellule b16 de la feuille active

il faut jouer sur le Range("b16")

Sheets("Facturation").Range("d" & dlt) = Range("B" & variable)

edit: la réponse de 3GB est quand même beaucoup plus précise que la mienne ^^

Bonjour et merci beacoup de votre aide et rapidité

Ton code fonctionne a merveille

voici le code adapté, j'ai supprimé .cells(ligne) a la d5 car si plus de 3 items cela affiché le client dans la colone date.

Private Sub CommandButton1_Click()

Dim nombre_ligne As Integer
Dim ligne As Integer
Dim dlt As Integer

nombre_ligne = Application.CountA(Range("a16:a27")) 'compte nombre valeurs dans la colonne description de la facture
                                                     'REMPLACER "Zone..." par nom plage ou zone concernée

For ligne = 1 To nombre_ligne 'de 1 à Nb ligne

    With Sheets("Facturation") 'sur facturation
        .ListObjects(1).ListRows.Add 'ajoute ligne au tableau
        With .Range("Facture") 'sur les données du tableau (remplacer nom)
            dlt = .Rows.Count 'dernière ligne tab
            'si tableau commence en colonne C comme supposé
            'ICI, ON CONSIDERE LES PLAGES NOMMEES
            'LES RANGE QTÉ À HT NE CONTIENNENT PAS LE TITRE !
            .Cells(dlt, 1).Value = Range("d4") '!!! CE SONT DES EXEMPLES AVEC LES PLAGES NOMMEES (ICI, D5)
            .Cells(dlt, 2).Value = Range("d5")
            .Cells(dlt, 3).Value = Range("b16").Cells(ligne)
            .Cells(dlt, 4).Value = Range("c16").Cells(ligne)
            .Cells(dlt, 5).Value = Range("a16").Cells(ligne)
            .Cells(dlt, 6).Value = Range("d16").Cells(ligne)
            .Cells(dlt, 7).Value = Range("e16").Cells(ligne)
            .Cells(dlt, 8).Value = Range("d8")
        End With
    End With

Next ligne

Range("d8") = ""

Sheets("Config").Range("d22") = Sheets("Config").Range("d22") + 1

'savegarder le fichier
'ActiveWorkbook.Save

End Sub

Oui, c'est une erreur de ma part... J'ai édité mon commentaire et fait un copier / coller sans faire attention.

Donc pour résumer, ton tableau sur la feuille facturation se nomme "Facture".

Si je peux me permettre, je te conseille de :

- mettre le client en colonne 3 de ton tableau, c'est plus intuitif (Date - facture - client - .... - Totaux).

- et surtout nommer les cellules D4, D5, ..., A16:A27, .... via le gestionnaire de noms (ou définir un nom). C'est en général dans le volet excel Formules (ou données parfois).
Pourquoi ? Car, sinon, tes références dans ton code sont statiques et au moindre petit changement sur ta feuille (exemple : rajouter une adresse bis pour le client, une mention spéciale), ça décalerait tout et ça ne marcherait plus.

Cdlt,

Super merci de tes conseils.

Dernière question j'essai de faire enregistrer les mêmes information sur une seconde feuille mais cela affiche un bug.

J'essai de faire un booking qui mets a jour les stock a chaque facture, je cmodifie le code dans tous les sens mais toujour une erreur avec la seconde ligne ''''

  With .Range("Facture") 'sur les données du tableau (remplacer nom)
Private Sub CommandButton1_Click()

Dim nombre_ligne As Integer
Dim ligne As Integer
Dim dlt As Integer

nombre_ligne = Application.CountA(Range("a16:a27")) 'compte nombre valeurs dans la colonne description de la facture

For ligne = 1 To nombre_ligne 'de 1 à Nb ligne

    With Sheets("Facturation") 'sur facturation
        .ListObjects(1).ListRows.Add 'ajoute ligne au tableau
        With .Range("Facture") 'sur les données du tableau (remplacer nom)
            dlt = .Rows.Count 'dernière ligne tab
            'si tableau commence en colonne C comme supposé
            'ICI, ON CONSIDERE LES PLAGES NOMMEES
            'LES RANGE QTÉ À HT NE CONTIENNENT PAS LE TITRE !
            .Cells(dlt, 1).Value = Range("d4") '!!! CE SONT DES EXEMPLES AVEC LES PLAGES NOMMEES (ICI, D5)
            .Cells(dlt, 2).Value = Range("d5")
            .Cells(dlt, 3).Value = Range("b16").Cells(ligne)
            .Cells(dlt, 4).Value = Range("c16").Cells(ligne)
            .Cells(dlt, 5).Value = Range("a16").Cells(ligne)
            .Cells(dlt, 6).Value = Range("d16").Cells(ligne)
            .Cells(dlt, 7).Value = Range("e16").Cells(ligne)
            .Cells(dlt, 8).Value = Range("d8")

        End With
    End With

     With Sheets("Booking") 'sur Booking
        .ListObjects(1).ListRows.Add 'ajoute ligne au tableau
        With .Range("Facture") 'sur les données du tableau (remplacer nom)
            dlt = .Rows.Count 'dernière ligne tab

            .Cells(dlt, 2).Value = "Sortie"
            .Cells(dlt, 3).Value = Range("d4").Cells(ligne)
            .Cells(dlt, 4).Value = Range("d5").Cells(ligne)
            .Cells(dlt, 5).Value = Range("a16").Cells(ligne)
            .Cells(dlt, 6).Value = Range("d16").Cells(ligne)
            .Cells(dlt, 7).Value = Range("e16").Cells(ligne)
            .Cells(dlt, 8).Value = Range("d8")

        End With
    End With

Next ligne
   

En fait, il peut y avoir un plage nommée sur chaque feuille si elle s'applique uniquement à sa feuille. Sinon, si un nom s'applique à tout le classeur (et c'est le cas des tableaux structurés), il ne peut y avoir 2 fois le même nom.

Quand tu as copié ta feuille "Facturation", le nom du tableau de la feuille obtenue (Booking) est devenu quelque chose comme "Facture2".

Il faudrait renommer ce 2nd tableau (et dans le code également).

Cordialement,

J'ai une feuille Facture sur laquelle je rentre les items.

J'aimerais copié les information sur une feuille Facturation ( C'est réussi)

J'aimerais copié les information sur une autre feuille Booking (erreur)

En faisant ceci les lignes s'ajoute bien au booking mais elles sont vides.

Private Sub CommandButton1_Click()

Dim nombre_ligne As Integer
Dim ligne As Integer
Dim dlt As Integer
Dim nombre_lignes As Integer
Dim lignes As Integer
Dim DL As Integer
nombre_ligne = Application.CountA(Range("a16:a27")) 'compte nombre valeurs dans la colonne description de la facture
nombre_lignes = Application.CountA(Range("a16:a27"))

For ligne = 1 To nombre_ligne 'de 1 à Nb ligne

    With Sheets("Facturation") 'sur facturation
        .ListObjects(1).ListRows.Add 'ajoute ligne au tableau
        With .Range("Facture") 'sur les données du tableau (remplacer nom)
            dlt = .Rows.Count 'dernière ligne tab
            'si tableau commence en colonne C comme supposé
            'ICI, ON CONSIDERE LES PLAGES NOMMEES
            'LES RANGE QTÉ À HT NE CONTIENNENT PAS LE TITRE !
            .Cells(dlt, 1).Value = Range("d4") '!!! CE SONT DES EXEMPLES AVEC LES PLAGES NOMMEES (ICI, D5)
            .Cells(dlt, 2).Value = Range("d5")
            .Cells(dlt, 3).Value = Range("b16").Cells(ligne)
            .Cells(dlt, 4).Value = Range("c16").Cells(ligne)
            .Cells(dlt, 5).Value = Range("a16").Cells(ligne)
            .Cells(dlt, 6).Value = Range("d16").Cells(ligne)
            .Cells(dlt, 7).Value = Range("e16").Cells(ligne)
            .Cells(dlt, 8).Value = Range("d8")

        End With
    End With
    Next ligne

    For lignes = 0 To nombre_ligne 'de 1 à Nb ligne
      Sheets("Booking").ListObjects(1).ListRows.Add
            DL = Sheets("Booking").Range("b9999").End(xlUp).Row

            Sheets("Booking").Range("B" & DL) = "Sortie"
            Sheets("Booking").Range("C" & DL) = Range("d4")
            Sheets("Booking").Range("D" & DL) = Range("d5")
            Sheets("Booking").Range("F" & DL) = Range("a16")
            Sheets("Booking").Range("G" & DL) = Range("d16")
            Sheets("Booking").Range("H" & DL) = Range("e16")

Next lignes

Range("D8") = ""

Sheets("Config").Range("d22") = Sheets("Config").Range("d22") + 1

'savegarder le fichier
ActiveWorkbook.Save

End Sub

Est-ce que tu peux essayer ceci tout d'abord :

Private Sub CommandButton1_Click()

Dim nombre_lignes%, ligne%, dlt%, DL%

nombre_lignes = Application.CountA(Range("a16:a27")) 'compte nombre valeurs dans la colonne description de la facture

For ligne = 1 To nombre_lignes 'de 1 à Nb ligne

    With Sheets("Facturation") 'sur facturation
        .ListObjects(1).ListRows.Add 'ajoute ligne au tableau
        With .Range("Facture") 'sur les données du tableau (remplacer nom)
            dlt = .Rows.Count 'dernière ligne tab
            'si tableau commence en colonne C comme supposé
            'ICI, ON CONSIDERE LES PLAGES NOMMEES
            'LES RANGE QTÉ À HT NE CONTIENNENT PAS LE TITRE !
            .Cells(dlt, 1).Value = Range("d4") '!!! CE SONT DES EXEMPLES AVEC LES PLAGES NOMMEES (ICI, D5)
            .Cells(dlt, 2).Value = Range("d5")
            .Cells(dlt, 3).Value = Range("b16").Cells(ligne)
            .Cells(dlt, 4).Value = Range("c16").Cells(ligne)
            .Cells(dlt, 5).Value = Range("a16").Cells(ligne)
            .Cells(dlt, 6).Value = Range("d16").Cells(ligne)
            .Cells(dlt, 7).Value = Range("e16").Cells(ligne)
            .Cells(dlt, 8).Value = Range("d8")

        End With
    End With

    with Sheets("Booking")
        .ListObjects(1).ListRows.Add
        with .Range("Stock") 'nom à adapter !!!<<<<<<<<<<<<--------------------------------------
            DL = .rows.count
            .Cells(DL, 1).Value = "Sortie"
            .Cells(DL, 2).Value = Range("d4")
            .Cells(DL, 2).Value = Range("d5")
            .Cells(DL, 2).Value = Range("a16").cells(ligne)
            .Cells(DL, 2).Value = Range("d16").cells(ligne)
            .Cells(DL, 2).Value = Range("e16").cells(ligne)
        end with
    end with

Next ligne

Range("D8") = ""

Sheets("Config").Range("d22") = Sheets("Config").Range("d22") + 1

'savegarder le fichier
ActiveWorkbook.Save

End Sub

RQ : IL FAUT ABSOLUMENT NOMMER TES RANGE D4, D5, D8, A16:A27, ..., E16:E27, AINSI QUE LES SOUS-TOTAUX (E28, E29, ...) !!!

Tu peux m'envoyer ton fichier si tu veux, je peux le faire

J'ai supprimé tous les clients pour raison de confidentialité.

Je te l'envoie en mp

En bas tu verra la page Booking Facture et Facturation.

Dans Facture code tu scan l"item et les infos suivent ( tout est ok.)

Tu clic sur command button 1 et ça lance ton code (ok)

Me reste a copié les items dans Booking pour que l'inventaire suive. (pas fait )

Afficher les numeros de factures du jour afin de cliquer dessus pour les éditer (pas fait)

En fait j'essai de faire moi même le système de caisse de ma compagnie, car pas encore les moyens de payer du monde pour le faire.

Alors, je viens d'essayer de modifier ton fichier mais ça bloque (à cause d'un objet activeX) car je suis sur un mac.

Je l'ai envoyé par conversation privé, j'ai enlevé la protection des cellules

Bonjour

Bon j'ai réussi a afficher dans Facturation et booking.

Dans facturation tout est OK , mais dans booking cela affiche 3x le 1er item.

Comme dans les exemples précédent je facture 3 items différents, dans Booking cela affiche bien les 3 lignes mais elles affichent le 1er item, pourquoi?

Option Explicit
Private Sub CommandButton1_Click()

Dim nombre_ligne As Integer
Dim ligne As Integer
Dim dlt As Integer

Dim DL As Integer
nombre_ligne = Application.CountA(Range("a16:a27")) 'compte nombre valeurs dans la colonne description de la facture

For ligne = 1 To nombre_ligne 'de 1 à Nb ligne

    With Sheets("Facturation") 'sur facturation
        .ListObjects(1).ListRows.Add 'ajoute ligne au tableau
        With .Range("Facture") 'sur les données du tableau (remplacer nom)
            dlt = .Rows.Count 'dernière ligne tab
            'si tableau commence en colonne C comme supposé
            'ICI, ON CONSIDERE LES PLAGES NOMMEES
            'LES RANGE QTÉ À HT NE CONTIENNENT PAS LE TITRE !
            .Cells(dlt, 1).Value = Range("d4") '!!! CE SONT DES EXEMPLES AVEC LES PLAGES NOMMEES (ICI, D5)
            .Cells(dlt, 2).Value = Range("d5")
            .Cells(dlt, 3).Value = Range("b16").Cells(ligne)
            .Cells(dlt, 4).Value = Range("c16").Cells(ligne)
            .Cells(dlt, 5).Value = Range("a16").Cells(ligne)
            .Cells(dlt, 6).Value = Range("d16").Cells(ligne)
            .Cells(dlt, 7).Value = Range("e16").Cells(ligne)
            .Cells(dlt, 8).Value = Range("d8")

        End With
    End With
    Next ligne

    For ligne = 1 To nombre_ligne 'de 1 à Nb ligne
      Sheets("Booking").ListObjects(1).ListRows.Add
            DL = Sheets("Booking").Range("b9999").End(xlUp).Row

            Sheets("Booking").Range("B" & DL) = "Sortie"
            Sheets("Booking").Range("C" & DL) = Sheets("Facture").Range("d4")
            Sheets("Booking").Range("D" & DL) = CDate(Now())
            Sheets("Booking").Range("F" & DL) = Sheets("Facture").Range("d8")
            Sheets("Booking").Range("G" & DL) = Sheets("Facture").Range("b16")
            Sheets("Booking").Range("H" & DL) = Sheets("Facture").Range("a16")

    Next ligne

Range("D8") = ""

Sheets("Config").Range("d22") = Sheets("Config").Range("d22") + 1

'savegarder le fichier
ActiveWorkbook.Save

End Sub

Salut Marc,

Je viens de t'envoyer multitude de messages privés avec justement le code à jour.

Le problème est le même que celui à l'origine de ton poste. Dans ta boucle, tu mets la référence statique, "B16" par exemple, au lieu de jouer sur l'incrémentation de la variable ligne. Il aurait fallu faire :

Sheets("Booking").Range("G" & DL) = Sheets("Facture").Range("b" & 15 + ligne)

ou comme je le préfère :

Sheets("Booking").Range("G" & DL) = Sheets("Facture").Range("Codes").cells(ligne)

>>>> des messages t'attendent !

Bon matin

Je viens de corriger le code, merci.

Je vais allez voir la messagerie

Option Explicit
Private Sub CommandButton1_Click()

Dim nombre_ligne As Integer
Dim ligne As Integer
Dim dlt As Integer

Dim DL As Integer
nombre_ligne = Application.CountA(Range("a16:a27")) 'compte nombre valeurs dans la colonne description de la facture

For ligne = 1 To nombre_ligne 'de 1 à Nb ligne

    With Sheets("Facturation") 'sur facturation
        .ListObjects(1).ListRows.Add 'ajoute ligne au tableau
        With .Range("Facture") 'sur les données du tableau (remplacer nom)
            dlt = .Rows.Count 'dernière ligne tab
            'si tableau commence en colonne C comme supposé
            'ICI, ON CONSIDERE LES PLAGES NOMMEES
            'LES RANGE QTÉ À HT NE CONTIENNENT PAS LE TITRE !
            .Cells(dlt, 1).Value = Range("d4") '!!! CE SONT DES EXEMPLES AVEC LES PLAGES NOMMEES (ICI, D5)
            .Cells(dlt, 2).Value = Range("d5")
            .Cells(dlt, 3).Value = Range("b16").Cells(ligne)
            .Cells(dlt, 4).Value = Range("c16").Cells(ligne)
            .Cells(dlt, 5).Value = Range("a16").Cells(ligne)
            .Cells(dlt, 6).Value = Range("d16").Cells(ligne)
            .Cells(dlt, 7).Value = Range("e16").Cells(ligne)
            .Cells(dlt, 8).Value = Range("d8")

        End With
    End With
    Next ligne

    For ligne = 1 To nombre_ligne 'de 1 à Nb ligne
      Sheets("Booking").ListObjects(1).ListRows.Add
            DL = Sheets("Booking").Range("b9999").End(xlUp).Row

            Sheets("Booking").Range("B" & DL) = "Sortie"
            Sheets("Booking").Range("C" & DL) = Sheets("Facture").Range("d4")
            Sheets("Booking").Range("D" & DL) = CDate(Now())
            Sheets("Booking").Range("F" & DL) = Sheets("Facture").Range("d8")
            Sheets("Booking").Range("G" & DL) = Sheets("Facture").Range("b16").Cells(ligne)
            Sheets("Booking").Range("H" & DL) = Sheets("Facture").Range("a16").Cells(ligne)

    Next ligne

Range("D8") = ""

Sheets("Config").Range("d22") = Sheets("Config").Range("d22") + 1

'savegarder le fichier
ActiveWorkbook.Save

End Sub
Rechercher des sujets similaires à "copier lignes"