Copier coller à la suite d'un tableau
Bonjour à tous,
J'aimerais récupérer l’ensemble des données d'un tableau et le coller à la suite d'un autre tableau (fichier différent)
Voici la macro qui j'ai essayée:
Sub AZS()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim i As Long
Set ws1 = ActiveWorkbook.Worksheets("Mouvement")
Set ws2 = ActiveWorkbook.Worksheets("testo")
i = ws2.Range("B" & Rows.Count).End(xlUp).Row + 1
ws1.Activate
Range("B4:K10").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
ws2.Cells(i, 2).Select
ActiveSheet.Paste
End Sub
Merci.
Dans l'exemple ci-joint, j'ai réalisé la macro sur des feuilles par facilité.
Bonjour,
Je préfèrerais nettement quelque chose comme :
Sub AZS()
Dim ws As Worksheet, i&, j&
Set ws = Worksheets("testo")
i = ws.Range("B" & Rows.Count).End(xlUp).Row + 1
With Worksheets("Mouvement")
j = .Range("B" & .Rows.Count).End(xlUp).Row
ws.Range("B" & i).Resize(j - 3, 10).Value = .Range("B4:K" & j).Value
End With
End Sub[et accessoirement indenté, et mis sous balise Code dans le post... ]
Dans l'exemple ci-joint, j'ai réalisé la macro sur des feuilles par facilité.
Je ne sais pas ce que peut bien vouloir dire réaliser une macro sur des feuilles !!!
Merci Mferrand.
Afin de m'endormir un peu plus instruis, serais t-il possible d'avoir des commentaires sur votre code.
Bien cordialement,
Stan95
Bonsoir,
C'est assez simple ! Travaillant sur deux feuilles, on peut en mettre une sous bloc With, ce qui entraîne sa mise en mémoire et VBA y accède plus rapidement, si on peut le faire directement on ne gagne rien à rajouter une variable, on peut donc s'en passer.
Et on affecte seulement l'autre feuille à une variable (laquelle permet aussi un accès rapide).
Note cependant que la mise sous bloc With apporte toujours un gain même avec une variable... (et on gagne aussi en écriture).
On affecte donc la variable Worksheet et on détermine la ligne d'insertion de la plage à copier. Jusque là, tu avais ça dans ton code, donc pas de surprise.
C'est ensuite qu'on sous bloc With avec la feuille source. Dans le bloc, toute expression commençant par un point réfère à cette feuille. On recherche la dernière ligne, comme auparavant encore...
Mais arrivé là, on a le choix, copier-coller n'est pas la seule option. En VBA, ce qu'on ne peut pas faire en manuel, on peut affecter globalement les valeurs d'une plage à une autre, sous la forme :
PlageCible.Value = PlageSource.Value
Ce qui, dès lors que l'on ne s'occupe que des valeurs, est plus économique. Il convient seulement que les deux plages aient la même taille. C'est ce qu'on fait avec cette ligne :
ws.Range("B" & i).Resize(j - 3, 10).Value = .Range("B4:K" & j).ValuePour la source, pas de problème de compréhension : B4:K... jusqu'à la ligne j. J'ai supposé d'après ce qui figurait que c'était bien la délimitation de la plage (sinon facile de modifier...).
Commençant ligne 4, cette plage occupe j-3 lignes et 10 colonnes (B à K). On se sert de ces indications pour dimensionner la plage cible qui commence ligne i en B.
On indique donc cette cellule pour définir la plage qu'on redimensionne avec Resize à : j-3 lignes et 10 colonnes.
Cordialement.