Excel : existe-t-il une macro pour faire une copie conditionnelle de lignes dans un classeur différent ?
Pour que la macro puisse copier des lignes conditionnellement, il faut faire appel à une condition, par exemple la valeur d'une cellule contenant une date.
Les macros sont des scripts qui sont interprétés par les applications Microsoft Office et qui permettent d'effectuer des traitements complexes dans des fichiers. Ces macros sont écrites en Visual Basic.
Pour que la macro puisse copier des lignes conditionnellement, il faut faire appel à une condition, par exemple la valeur d'une cellule contenant une date. On copie les données dans une feuille de calcul correspondant au mois. La première fonction va copier pour un mois en paramètre les données vers la feuille correspondante.
Pour sélectionner l'ensemble de la colonne contenant la date, on utilise la fonction sharePoint.Range() et on part de la cellule de départ jusqu'au mot-clé spRange.End(xlDown).Address, qui récupère la dernière cellule écrite de la colonne. La méthode Format() va récupérer le mois contenu dans la date (format MM).
Méthode de copie des cellules en fonction du mois :
Public Sub MoveData(MonthNumber As Integer, SheetName As String) Dim sharePoint As Worksheet Dim Month As Worksheet Dim spRange As Range Dim cell As Range Set sharePoint = Sheets(Sharepoint) Set Month = Sheets(SheetName) Set spRange = sharePoint.Range(A2) Set spRange = sharePoint.Range(A2: & spRange.End(xlDown).Address) For Each cell In spRange If Format(cell.Value, MM) = MonthNumber Then copyRowTo sharePoint.Range(cell.Row & : & cell.Row), Month End If Next cell End Sub
La méthode pour copier le contenu consiste tout d'abord à chercher dans la feuille de calcul la première ligne vide. Le mot-clé newRange.End(xlDown).Offset(1) équivaut à descendre d'une ligne dans la feuille. Une fois la ligne vide trouvée, la méthode Copy() copie la ligne et la méthode PasteSpecial() effectue un collage spécial sur la ligne. La constante xlPasteAll indique que l'on colle toute la ligne.
Méthode de copie de la ligne :
Sub copyRowTo(rng As Range, ws As Worksheet) Dim newRange As Range Set newRange = ws.Range(A1) If newRange.Offset(1).Value <> Then Set newRange = newRange.End(xlDown).Offset(1) Else Set newRange = newRange.Offset(1) End If rng.Copy newRange.PasteSpecial (xlPasteAll) End Sub