Bonjour,
J'ai un problème avec une macro que je n'arrive pas à trouver malgré tous les forum que j'ai consulté.
Très mauvaise méthode ! On commence par annalyser ce qu'on veut faire, le découper en opérations élémentaires distinctes, puis on peut écrire la macro !
Je dois reproduire une ligne dans une feuille en regard d'un repère en colonne A.
(On évite de penser copier-coller a-priori !!! on optera pour la solution qui paraîtra la plus simple et la plus rapide pour parvenir au résultat).
La ligne à reproduire se trouve sur une autre feuille, emplacement fixe. Chouette ! je vais nommer cette ligne, cela me simpliera l'opération : en col. A elle comporte la position que je dois retrouver pour positionner sa reproduction, je le laisse de côté et je nomme B17:H17, la partie à reproduire, [je nomme bêtement Ligne ].
Comme pas d'autre préparatif, je peux passer aux opérations:
1) Je dois récupérer la position à rechercher, je prévois une variable pour ça (pos par exemple). La valeur cherchée se trouve dans la cellule qui précède la plage que j'ai nommée, donc même ligne et colonne précédant la première cellule de la plage nommée : je vais simplement l'atteindre avec l'expression [Ligne].Cells(1, 0)
2) Je dois chercher la ligne où je dois reproduire ma plage, dans la colonne A de la feuille cible : l'utilisation de la fonction Match (=EQUIV) qui me renverra directement le numéro de ligne paraît approprié. Je prévois une variable pour le recueillir (lig par exemple)
3) Il reste à finaliser : la plage cible est sur la ligne que j'ai déterminée, elle commence en colonne B, je prends donc cette cellule comme base que je redimensionne sur le nombre de colonne de ma ligne à transférer, je dispose ainsi de la plage cible dont il ne me reste plus qu'à définir la valeur comme étant celle de la plage source. Sans copier-coller qui s'avère inutile.
On écrit donc ce qu'on vient d'énumérer :
Sub TftLigne()
Dim pos%, lig%
pos = [Ligne].Cells(1, 0).Value
With Worksheets("Feuil1")
lig = WorksheetFunction.Match(pos, .Columns("A"), 0)
.Range("B" & lig).Resize(, [Ligne].Columns.Count).Value = [Ligne].Value
End With
End Sub
Et voilà ! Plus qu'à tester.