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
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 SubBonjour,
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 SubCdlt,
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 SubOui, 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 SubEst-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 SubRQ : 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 SubSalut 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