Insertion de lignes copiées

Bonjour,

Je débute en VB et aurai une question à vous soumettre.

Malgré mes recherches je n'ai pas trouvé/compris comment faire la chose suivante:

Insérer plusieurs lignes copiées (nombre pouvant varier) à la 2e ligne de mon tableau.

ma première ligne correspond à l’intitulé de mes colonnes.

ex:

Intitulé

|

|

| (lignes insérées)

|

|

  • (lignes déjà présentes)

les lignes comportent des dates (la plus récente en haut, du coup)

Dans l'attente d'une réponse,

R.

PS: les lignes copiées sont dans le même fichier mais sur une autre feuille que la destination.

(Je souhaiterai aussi savoir s'il est possible de copier les lignes uniquement si elles ne sont pas vides, afin d'automatiser au maximum le processus) (merci)

L'idéal, si possible, serait d'avoir une réponse assez rapide, pour raison d'échéances professionnelle.

merci de votre compréhension

Bonjour,

Sans modèle... Le principe est simple :

Tu copies une plage de cellule, tu insères sur une ligne de même largeur que la plage.

Exemple :

Sub test()
    Worksheets(3).Range("A5:D8").Copy
    Worksheets(1).Range("B2:E2").Insert xlShiftDown
End Sub

Cordialement.

Voici mon code:

Sub Récupération_Tampon()

    For k = 1 To 15                                                        'Colonnes

        Dim wb As Workbook
        Dim DernLigne As Long, I As Long
        Dim Source As String

        Application.ScreenUpdating = False
        Set wb = ThisWorkbook   
        Source = "fichier tampon.xls"                                     'source
        Workbooks.Open (Source)

        With ActiveWorkbook.Worksheets("listeI0_XL")                'destination
            DernLigne = .Cells(Rows.Count, 1).End(xlUp).Row
            For I = 2 To DernLigne                                     'selection ligne 2 à la fin
                wb.Worksheets("Listing des I0").Cells(I, k).Value = .Cells(I, k).Value        'copie ligne par ligne?
            Next I
        End With

        Set wb = Nothing

    Next k

End Sub

Malheureusement, ce n'est pas mon propre code, ce qui fait que je n'ai pas compris 100% de celui-ci. De ce fait je ne sais pas où lui demander de faire l'insertion. Les commentaires sont ce que j'ai compris. J'ai toute fois réussi à l'adapter selon mes besoin (sauf pour ce qui est de l'insertion).

Cordialement

R.

Il n'y a aucune insertion dans ce code...

Et ce n'est pas avec un code écrit ainsi que tu vas apprendre à coder correctement en VBA...

Petit examen critique :

1) En englobant tout le code, y compris les déclarations de variables dans une boucle de 1 à 15, on va répéter affectation et ouverture du fichier 15 fois... ! Je n'ose préjuger du résultat !

2) Les variables se déclarent systématiquement en tête de procédure, et autant que possible toutes (k n'est pas déclarée). C'est une règle à respecter pour avoir un code bien structuré et lisible...

3) Une variable classeur wb pour y affecter... ThisWorkbook !!! Une idiotie pure et simple. ThisWorkbook désigne toujours et partout dans le code le classeur qui contient le code en cours d'exécution, l'expression se suffit à elle-même !

On dira que c'est pour gagner de la place ! Dans ce cas, il vaut mieux commencer par raccourcir les noms de variables (DL au lieu de DernLigne par exemple), utiliser les caractères de déclarations de type quand ils existent, et on gagnera beaucoup plus en déclarant des variables feuilles pour y affecter la feuille source et la feuille cible...

4) Workbooks.Open (Source) : mauvaise syntaxe ! l'argument de la méthode Open ne doit pas être mis entre parenthèses. Il ne l'est que si l'expression se trouve à droite d'un signe =, par exemple dans :

Set wb = Workbooks.Open (Source)

5) Application.ScreenUpdating = False est un peu mal placé et n'est pas suivi par un retour à True après opération. Même si Excel s'en accomode, il demeure préférable d'opérer ce retour...

6) Set wb = nothing : encore une idiotie ! La variable n'a d'existence que dans la procédure. Elle cessera d'exister dès que celle-ci aura atteint la commande End Sub... De plus on y procède dans la fameuse boucle de 1 à 15... on va donc la vider et réaffecter 15 fois avec la même référence comme déjà indiqué !

Autant d'éléments qui impliquent qu'on réécrive correctement la procédure, mais une fois réécrite, la méthode utilisée consiste à opérer une affectation de valeurs de la source à la cible, sans copier-coller, mais cellule par cellule, ce qui peut être relativement long...

(NB- Copier consiste à introduire les données à dupliquer dans le presse-papier de Windows, et coller à reproduire le contenu du presse-papier. Il n'y a pas copier-coller lorsqu'on ne transite pas par le presse-papier.)


Réécriture avec insertion en ligne 2 de la feuille cible :

Sub Récupération_Tampon()
    Dim wbS As Workbook, wsC As Worksheet, nbL&, Source$
    Set wsC = ThisWorkbook.Worksheets("Listing des I0")
    Source = "fichier tampon.xls"
    Application.ScreenUpdating = False
    Set wbS = Workbooks.Open(Source)
    With wbS.Worksheets("listeI0_XL")
        nbL = wsS.Cells(Rows.Count, 1).End(xlUp).Row - 1
        .Range("A2").Resize(nbL, 15).Copy
    End With
    wsC.Range("A2:O2").Insert xlShiftDown
    wbS.Close False
    Application.ScreenUpdating = True
End Sub

Déclarations de variables : une variable classeur (wbS) pour y affecter le classeur source à ouvrir, une variable feuille (wsC) pour y affecter la feuille cible (de ThisWorkbook), une variable de type Long (nbL) pour y affecter le nombre de lignes de la zone à copier (la zone commençant ligne 2, ce nombre sera donc la ligne de la dernière cellule en A -1...)

[Noter que l'on pourrait se contenter d'une variable Integer si le nombre de lignes ne dépasse pas 32767 !]

enfin une variable String pour accueillir le nom du classeur (à noter que le nom n'inclut aucun chemin... donc soit le classeur se trouve dans le dossier courant, soit il conviendra de le rajouter pour ouvrir le classeur source).

Méthode : après ouverture du classeur source, on calcule le nombre de lignes à copier, on dimensionne la plage à copier à partir de A2 (nombre de lignes calculé et nombre de colonnes connu) et on la copie. On la colle par insertion en ligne 2 de la feuille cible. Et on ferme le classeur source.

A tester.

Effectivement, la procédure complète prend un certain temps...

Mais comme dit je n'ai pas les capacité ni l’expertise pour pouvoir coder ce que je voulais dans ce cas là.


Merci beaucoup de vous être penché sur mon cas, je vais essayer votre code de suite!!

Pour le chemin, j'ai dû l'enlever pour des soucis de confidentialité, désolé

Lorsque je lance votre code, après avoir remis le bon chemin source, il m’affiche "erreur '424' objet requis"

Et le débug me renvoie à cette ligne :

nbL = wsS.Cells(Rows.Count, 1).End(xlUp).Row - 1

Ai-je mal copié? Ai-je fais une erreur?


le problème vient-il du fait que " wsS " n'est pas déclaré?

Tu supprimes le wsS, mais tu laisses le point devant .Cells

Un oubli de ma part : j'avais d'abord déclaré une variable feuille, que j'ai supprimée au profit d'une variable classeur (qui permet d'atteindre la feuille qui n'est mentionnée qu'une fois) puis de fermer le classeur à la fin...). J'ai enlevé tous les wsS du code mais un a survécu... Désolé ! Erreur normale donc puisque la variable n'existe pas et ne renvoie rien.

D'accord, merci

"Errare humanum est"

Je n'ai pas pu répondre avant suite à un problème de connexion, mais voilà....

Ça fonctionne!! Un grand merci !!

Oui ! PB de connexion pour tous

17exercice.xlsx (8.71 Ko)

Bonjour moi j'ai une question ci-joint le tableau d'excel que j'ai saisi manuellement, je souhaiterai savoir si c'est possible d'avoir une saisi automatiquement. C'est à dire que si je tape TXM1.8u- qu'il me renvoie automatiquement le type d'entrée/sortie ici dans mon cas AI

Rechercher des sujets similaires à "insertion lignes copiees"