Macro pour coller en incrémentant de + 1 ligne

Bonjour,

Débutante en macro je me heurte à un problème, sans doute pas très compliqué à résoudre, mais pour lequel je ne trouve pas de réponse dans les livres :

Soit une feuille excel "fact"

Dans cette feuille, je sélectionne la zone N43 à W43 que je copie

pour la coller (collage spécial/Valeurs) dans la feuille "COMPTA"

sachant qu'après cette opération, je remets la feuille "fact" à zéro pour une nouvelle saisie dont la zone N43 à W43 sera collée dans "COMPTA", mais à la ligne en dessous du collage précédent.

Etc .....

Autrement dit, comment faire une macro avec collage ligne suivante.

Voici ma macro

Comme je ne sais faire qu'en automatique, soit toutes les références sont en absolue, soit elles sont toutes en relatif, alors que N43:W43 c'est de l'absolu alors que A2 devrait être du relatif.

Voici ma "superbe" macro )))

Sub compta4()

'

' compta4 Macro

'

' Touche de raccourci du clavier: Ctrl+o

'

Range("N43:W43").Select

Selection.Copy

Sheets("COMPTA").Select

Range("A2").Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

Sheets("fact").Select

End Sub

Bon, j'avais averti : je débute.

Merci d'avance à qui pourra me donner la solution.

Cdlt

Ciboulette05

Bonsoir,

Nettoyée de l'enregistreur :

Sub compta4()
'
' compta4 Macro
'
' Touche de raccourci du clavier: Ctrl+o
'
    Worksheets("fact").Range("N43:W43").Copy
    With Worksheets("COMPTA")
        .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
    End With
End Sub

Cordialement

Bonjour, comme ceci cela devrait être bon (si j'ai bien tout compris)

Sub cpcl()
Dim dl&
dl = Sheets("Compta").Cells(Rows.Count, 1).End(xlUp).Row + 1
Sheets("fact").Range("N43:W43").Copy
Sheets("COMPTA").Cells(dl, 1).PasteSpecial Paste:=xlPasteValues
End Sub

Oui ! ça revient au même...

Bonjour,

Merci à tous les deux, car, en effet, les deux macros fonctionnent comme je le souhaite.

Maintenant, à moi de décortiquer pour comprendre comment ça marche, dans les deux cas.

Je reviendrai, si vous le permettez, pour vous demander des précisions afin que mon problème ne soit pas seulement résolu, mais que j'avance sur le chemin du VBA..

Encore merci

et bonne journée

Bonjour

MFerrand : oups, oui pour le coup c'est un véritable doublon :/

Ciboulette05 : pas de souci on répondra à vos interrogations.

Bonjour,

Que donnerait la macro afin que la plage sur la page "fact" soit copiée, quelle soit sa taille ?

Elle est ici clairement définie mais c'est au cas ou elle est variable ?

Merci

Alci

votre demande est trop vague pour avoir une réponse concrète.

Variabilité dans quelle sens ? Abscisse ? Ordonnée ?

La définition de la plage peu s'écrire comme ceci

Feuil1.Range(Cells(1, 1), Cells(1, Columns.Count).End(xlToLeft)).copy

Cela signifie, copier la plage qui va de la cellule A1 à la dernière cellule non vide de la ligne 1

Dans le cas d'une plage variable en ligne.

Désolé pour le manque de clarté mais c'est bien ce que je cherchais.

Merci !

Bonjour,

Je reviens juste après avoir décortiqué les macros de MFerrand et de Machin (qui fonctionnent bien) pour voir si j'ai bien compris.

Partie de la macro de M.Ferrand (celle que j'ai trouvée plus facile au 1er abord car plus proche de la macro enregistrée en auto)

.Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues

signifie : sur toutes les lignes, colonne A, repére la dernière ligne pleine, et décaler de 1 ligne vers le bas

Partie de la macro de Machin :

Dim dl&

dl = Sheets("Compta").Cells(Rows.Count, 1).End(xlUp).Row + 1

La différence c'est que tu déclares une variable d1 qui est = à : dans la feuille "Compta"sur toutes les lignes, colonne A, repère la dernière ligne pleine et décale de 1 ligne vers le bas.

Ce qui permet ensuite de définir le début du collage spécial dans (cells(d1,1)

En effet, ça revient au même, mais peut avoir un avantage si on doit reprendre plusieurs fois cette formule ?

Ai-je bien compris ???????????????

J'avance ..... tout doucement ! Pas évident de causer VBA ;-((((

J'ai une autre question, mais j'ouvre un nouveau fil.

Merci encore et bonne journée

Ciboulette

A-priori, tu as bien compris...

A noter pour parfaire: j'aurais pu ne pas utiliser d'instruction With... End With, en supprimant le point devant Rows.Count (souci purement esthétique de ma part, pour référer à la feuille concernée et ne pas répéter l'indication de la feuille).

Ceci était destiné à te montrer qu'en VBA "standard", ce qui occupe 6 lignes ou plus avec l'enregistreur, n'en prend que 2 ou 1, pour un copier-coller.

source.Copy destination [pour un copier coller ordinaire]

source.Copy

destination.PasteSpecial particularitécollage

[pour un copier-collage special

Outre l'utilisation d'une variable (dont tu sembles avoir compris l'intérêt...), une autre différence dans le code de Machin et le mien est l'utilisation d'arguments nommés (que je n'utilise pas, sauf cas particuliers).

A savoir : nommer les arguments (paste:=....) permet de les mentionner dans n'importe quel ordre, ne pas les nommer exige de les indiquer dans l'ordre où ils figurent pour la méthode concernée (et quand on omet un argument optionnel on ne met rien entre les virgules séparant les arguments à son ordre).

A titre de complément. Bonne continuation.

Bonsoir,

et encore merci pour ces précisions dont je vais essayer de faire bon usage.

Bonne soirée

Ciboulette

Bonjour, je rajoute juste une ou deux petites choses

Sheets("Compta").Cells(Rows.Count, 1).End(xlUp).Row + 1

Sheets("Compta") = feuille compta

.Cells(Rows.Count, 1) = fait référence à la dernière cellule de la colonne A (A65536 pour excel 2003 et A1048576 pour les autres version d'excel).

Cells(Rows.Count, 1).End(xlUp) = fait référence à la dernière cellule non vide de la colonne A en partant du bas et en remontant

Cells(1, 1).End(xldown) = le contraire

.row = signifie que le résultat renvoi un n° de ligne et non une l'adresse de cellule tout entière (qui serai B5 par exemple) (ligne en anglais se dit row)

Le tout en une seule ligne signifie que l'on recherche le n° de la dernière ligne non vide. On affecte généralement se numéro à une variable afin de, si on doit l'utiliser souvent, n'écrire que le nom de la variable au lieu de l'instruction toute entière.

Bonsoir Machin,

Ah !!!!! Je n'avais pas vraiment tout compris comme ça, en particulier le Cells(Rows.Count, 1).End(xlUp) en remontant qui se transforme en Cells(Rows.Count, 1).End(xldown) en descendant. C'est génial ! )))

Je vais me coucher moins bête ce soir.

Encore plein de merci car je n'y serais jamais arrivée toute seule malgré les kg de bouquins que j'ai achetés.

Finalement c'est avec vous et les cours VBA de ce site que j'avance le mieux.

Bonne soirée

Ciboulette

...remontant qui se transforme en Cells(Rows.Count, 1).End(xldown) en descendant <-- Non non..

Cells(1, 1).End(xlDown)

Chercher la dernière cellule non vide à partir de la cellule A1 en allant vers bas (Cells(1,1) = A1 car la syntaxe est Cells(ligne,colonne)

autant pour moi !!!! ))))

je retourne réviser

Ciboulette

Machin a écrit :

Rechercher des sujets similaires à "macro coller incrementant ligne"