Copier ligne

Marc_5338 -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Dans une feuille excel , je rentre des items de la colonne B a la colonne E.
Je peux avoir autant de ligne que le client achete d'objet.

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

Mon soucis est que cela ne copie qu'e la premiere ligne de la facture.

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


Pourrais je avoir un peu d'aide s'il vous plait?

Merci

9 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    je vois plusieurs défauts dans ton code:
    - ta variable nombre_ligne n'est jamais initialisée
    - ta variable dlt n'est jamais initialisée
    - ta variable ligne n'est pas utilisée

    tout cela explique bien le comportement que tu observes.
    est-ce ton premier code VBA?
    cherches-tu une formation dans ce domaine?
    0
  2. Marc_5338
     
    Bonjour

    J'apprends et c'est mon 2ie code.

    J'essai de faire un logiciel de caisse pour le plaisir.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je pense que tu as intérêt à commencer par te former, peut-être en suivant des tutos. sinon tu n'apprendras sans doute pas, et où sera le plaisir?
      0
  3. Marc_5338
     
    J'ai suivi le tuto de tuto derien pour la gestion des stock.
    J'ai ajouté le system de facturation qui fonctionne avec le booking et le stock, mais la je souhaite le refaire sans les user forms et je ne comprends pas comment initialiser mes lignes dans ce cas.

    Peux tu me donner un exemple s'il te plait.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      comprends-tu le code que tu as écrit?
      que fait la ligne 14?
      0
  4. Marc_5338
     
    Sheets("Facturation").Range("c" & dlt) = Range("d5")

    Sur la feuille Facturation je vais récupérer la 1ere cellule vide de la colonne C et y copier la valeur de la cellule d5 de la feuille Facture.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      préférable de faire ainsi:
      Sheets("Facturation").Range("c" & dlt) = Sheets("Facture").Range("d5")

      est-ce bien ce que tu veux réaliser, copier la valeur de la cellule d5?

      que penses-tu de mes remarques:
      - ta variable nombre_ligne n'est jamais initialisée
      - ta variable ligne n'est pas utilisée
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Marc_5338
     
    Bon matin
    oui et cela fonctionne pour la 1ere ligne

    Dim nombre_ligne As Integer
    Dim ligne As Integer
    Dim dlt As Integer
    
    
    ____________ici je recupere le nombre de cellule non vide entre a16 et a27
    Sub Compter()
        nombre_ligne Application.CountA([A16:A27])
     End Sub
    
    ____________ Resutat =3 c'est correct
    
    
    Private Sub CommandButton1_Click()
    
    'controler si toute les informations besoin sont la
    
        For ligne = 0 To nombre_ligne ' ligne 0 a 3
            Sheets("Facturation").ListObjects(1).ListRows.Add
            dlt = Sheets("Facturation").Range("b9999").End(xlUp).Row
      
        
            Sheets("Facturation").Range("b" & dlt) = Sheets("Facture").Range("d4")
            Sheets("Facturation").Range("c" & dlt) = Sheets("Facture").Range("d5")
            Sheets("Facturation").Range("d" & dlt) = Sheets("Facture").Range("b16")
            Sheets("Facturation").Range("e" & dlt) = Sheets("Facture").Range("c16")
            Sheets("Facturation").Range("f" & dlt) = Sheets("Facture").Range("a16")
            Sheets("Facturation").Range("g" & dlt) = Sheets("Facture").Range("d16")
            Sheets("Facturation").Range("h" & dlt) = Sheets("Facture").Range("e16")
            Sheets("Facturation").Range("i" & dlt) = Sheets("Facture").Range("d8")
        Next ligne
        Range("D8") = ""
        
        Sheets("Config").Range("d22") = Sheets("Config").Range("d22") + 1
    
        'savegarder le fichier
        ActiveWorkbook.Save
            
            
        
        
    
    End Sub


    Cela ne me copie que la 1ere ligne encore.



    Je facture 3 item puis j'appuie sur le bouton, le code s'effectue.

    Je ne vois pas l'erreur.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      en ligne 18: la ligne 0 n'existe pas.
      où dans ton code fais-tu quelque-chose pour ne pas toujours recopier la première ligne?
      0
  7. Marc_5338
     
    Merci de ton aide.

    Je viens de modifier le code et c'est déjà mieux.

    J'ai bien mes 3 lignes a présent mais le soucis est que c'est 3 fois la même.

    J'ai crée ligne et je l’incrémente jusqu'au nombre de ligne contenue dans Facture.



    Dim nombre_ligne As Integer
    Dim ligne As Integer
    Dim dlt As Integer
    
    Sub Compter()
        nombre_ligne Application.CountA([A16:A27])
     End Sub
    
    Private Sub CommandButton1_Click()
    
    'controler si toute les informations besoin sont la
    ligne = 0
        
        For ligne = 0 To nombre_ligne
                Sheets("Facturation").ListObjects(1).ListRows.Add
                dlt = Sheets("Facturation").Range("b9999").End(xlUp).Row
      
        
        Sheets("Facturation").Range("b" & dlt) = Sheets("Facture").Range("d4")
        Sheets("Facturation").Range("c" & dlt) = Sheets("Facture").Range("d5")
        Sheets("Facturation").Range("d" & dlt) = Sheets("Facture").Range("b16")
        Sheets("Facturation").Range("e" & dlt) = Sheets("Facture").Range("c16")
        Sheets("Facturation").Range("f" & dlt) = Sheets("Facture").Range("a16")
        Sheets("Facturation").Range("g" & dlt) = Sheets("Facture").Range("d16")
        Sheets("Facturation").Range("h" & dlt) = Sheets("Facture").Range("e16")
        Sheets("Facturation").Range("i" & dlt) = Sheets("Facture").Range("d8")
        Next ligne
        Range("D8") = ""
        
        Sheets("Config").Range("d22") = Sheets("Config").Range("d22") + 1
        ligne = ligne + 1
        'savegarder le fichier
        ActiveWorkbook.Save
        
        
        


    Je pense que le soucis vient de cette ligne

      Sheets("Facturation").ListObjects(1).ListRows.Add


    Car ce n'est pas une liste.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      pourquoi ne montres-tu qu'une partie de ton code?
      à quoi servent les lignes 12 et 31?
      as-tu essayé en supprimant la ligne 15 qui te semble suspecte?
      à quoi sert la déclaration de la routine Compter()?
      tu es surpris que c'est 3 fois la même information copiée. dans quelle partie de ton code essaies-tu de copier autre chose?
      0
  8. Marc_5338
     
    Voici le code complet

    Dim nombre_ligne As Long
    Dim ligne As Integer
    Dim dlt As Integer
    
    Sub Compter()
        nombre_ligne Application.CountA([A16:A27])
     End Sub
    
    Private Sub CommandButton1_Click()
    
    'controler si toute les informations besoin sont la
    ligne = 0
        
        For ligne = 0 To nombre_ligne
                Sheets("Facturation").ListObjects(1).ListRows.Add
                dlt = Sheets("Facturation").Range("b9999").End(xlUp).Row
      
        
        Sheets("Facturation").Range("b" & dlt) = Sheets("Facture").Range("d4")
        Sheets("Facturation").Range("c" & dlt) = Sheets("Facture").Range("d5")
        Sheets("Facturation").Range("d" & dlt) = Sheets("Facture").Range("b16")
        Sheets("Facturation").Range("e" & dlt) = Sheets("Facture").Range("c16")
        Sheets("Facturation").Range("f" & dlt) = Sheets("Facture").Range("a16")
        Sheets("Facturation").Range("g" & dlt) = Sheets("Facture").Range("d16")
        Sheets("Facturation").Range("h" & dlt) = Sheets("Facture").Range("e16")
        Sheets("Facturation").Range("i" & dlt) = Sheets("Facture").Range("d8")
        Next ligne
        Range("D8") = ""
        
        Sheets("Config").Range("d22") = Sheets("Config").Range("d22") + 1
        ligne = ligne + 1
        'savegarder le fichier
        ActiveWorkbook.Save
        
        
        
    
    End Sub
    
    Private Sub Worksheet_Activate()
        'Range("d4") = ""
    End Sub
    


    La ligne 12 et 31 servent a initialiser le count en fonction du nombre d'item dans la facture.

    J'en ai 3 donc je commence a 0 puis incrémente de +1 jusqu'a 3.

    Si je supprime la ligne suspecte cela n'enregistre que la 1ere ligne, donc au final elle est correcte.

    Le fonction compter me sert a savoir le nombre de ligne pleine dans Facture entre les lignes a16 et a27_____________ egal a 3.

    tu es surpris que c'est 3 fois la même information copiée. dans quelle partie de ton code essaies-tu de copier autre chose?

    je comprends que je dois lire et copier la ligne 2 puis 3.

    J'essai un truc et reviens.

    Merci
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je pense que tu devrais étudier ce que font les instructions
      for ... next 
      .
      je demandais à quoi servait la déclaration de la routine Compter(), parce que je ne vois pas où elle est utilisée. Par ailleurs, je pense qu'elle contient une erreur.
      0
  9. Marc_5338
     
    Je viens de tout reprendre, cela est parfait saut que j'obtiens une erreur si je veux copier sur une seconde feuille.

    As tu un indice?

    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 facturation
            .ListObjects(1).ListRows.Add 'ajoute ligne au tableau
            With .Range("Facturation") '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, 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
       
        
    
       
    
    Range("D8") = ""
    
     
    
    Sheets("Config").Range("d22") = Sheets("Config").Range("d22") + 1
    
    'savegarder le fichier
    ActiveWorkbook.Save
    
    End Sub
    
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      indice le plus important: ne pas tenir compte du message d'erreur, ni de la ligne où l'erreur se produit.
      autre indice: toujours préciser sur quelle feuille on travaille, comme suggéré en #7.
      0
  10. Marc_5338
     
    Bon je n'arrive a rien, pourrais tu me corriger le code s'il te plait?
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      peux-tu toujours préciser la feuille devant Range? par exemple, en ligne 19:
      au lieu de:
      .Cells(dlt, 1).Value = Range("d4")

      écrire
      .Cells(dlt, 1).Value = Sheets("???").Range("d4")

      avec, bien sûr, le bon nom de feuille.
      veille aussi à avoir
      option explicit
      au début du module.

      ensuite, si le problème est toujours présent, partager ton code, le message d'erreur, et le numéro de la ligne où se produit l'erreur.
      0