Voilà le code complet au cas où il servirait un jour ou si quelqu'un à une remarque dessus :
Set pn = Worksheets("Périmètres N2000")
Set bdd = Worksheets("BDD ""SPECIES""")
lrpn = pn.Cells(Rows.Count, 1).End(xlUp).Row
lcpn = pn.Cells(1, pn.Columns.Count).End(xlToLeft).Column
lrbdd = bdd.Cells(Rows.Count, 1).End(xlUp).Row
lcbdd = bdd.Cells(1, bdd.Columns.Count).End(xlToLeft).Column
cib = bdd.Rows("1:1").Find("NOM", LookIn:=xlValues, lookat:=xlWhole).Column
With pn
For i = lrpn To 2 Step -1
y = Left(.Cells(i, 2), 9)
With bdd
Set plage = .Range("A1:S" & lrbdd)
plage.AutoFilter Field:=3, Criteria1:=y
Set plage = Nothing
Set rng = Nothing
bdd.Activate
Set plage = bdd.Range(.Cells(2, cib), .Cells(lrbdd, cib)).SpecialCells(xlCellTypeVisible)
q = plage.SpecialCells(xlCellTypeVisible).Count
Set rng = .Cells(2, cib).Resize(lrbdd) 'sitecode
pn.Activate
End With
'Insérer le nombre de lignes adéquat
If q < 1 Then
Exit Sub
End If
If .Cells(i, 1) <> "" Then
pn.Cells(i, 1).Resize(q, 1).EntireRow.Insert
End If
rng.Copy Destination:=pn.Cells(i, 3) '.Resize(q - 2)
Next i
lrpn = pn.Cells(Rows.Count, 1).End(xlUp).Row
For i = lrpn To 2 Step -1
If .Cells(i - 1, 1) = "" Then
.Range(.Cells(i, 1), .Cells(i - 1, 1)).Merge
.Range(Cells(i, 2), Cells(i - 1, 2)).Merge
.Range(Cells(i, 4), Cells(i - 1, 4)).Merge
.Range(Cells(i, 5), Cells(i - 1, 5)).Merge
End If
If .Cells(i, 3) = "" Then
.Cells(i, 3).EntireRow.Delete
End If
Next i
End With
With bdd.Cells(1, 1)
.AutoFilter
End With
Set plage = Nothing
Set rng = Nothing
End Sub
J'ai dû ajouter :
If .Cells(i, 3) = "" Then
.Cells(i, 3).EntireRow.Delete
End If
Car je ne suis pas parvenu à faire en sorte que le code ne génère pas de lignes inutiles.
Si vous avez une solution pour arrêter d'utiliser les .activate je suis preneur !
Bonne journée !