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