Private Sub Worksheet_Activate()
Dim t, ub&, i&, j&
Application.ScreenUpdating = False
With Feuil1.[A1].CurrentRegion 'à adapter
If .Parent.FilterMode Then .Parent.ShowAllData 'si la feuille est filtrée
.Sort .Columns(2), xlAscending, .Columns(5), , xlAscending, Header:=xlYes 'tri
.EntireColumn.Copy [A1]
End With
Application.Calculation = xlCalculationManual 'évite le recalcul des formules volatiles
With [A1].CurrentRegion
.Value = .Value 'supprime les formules
.Columns(7).Resize(, 2).EntireColumn.Delete
t = .Columns(6).Resize(, 2): ub = UBound(t)
For i = 2 To ub
If t(i, 2) = "" Then
For j = i + 1 To ub
If t(j, 2) <> "" Then Exit For
Next j
t(i, 1) = t(j, 1): t(i, 2) = t(j, 2): t(j, 2) = ""
i = j
End If
Next i
.Columns(6).Resize(, 2) = t 'restitution
On Error Resume Next 'si aucune SpecialCell
.Columns(7).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With
Application.Calculation = xlCalculationAutomatic
With UsedRange: End With 'actualise les barres de défilement
End Sub
Oui mais j'y suis quand même arrivé.Edit : j'ai essayé de mettre le résultat en Feuil1 mais alors la MFC pose problème.
=MOD(SI(COLONNE()<12;$A2;$L2);2)
Sub Regroupement()
Dim F As Worksheet, t, ub&, i&, j&
Set F = ActiveSheet
Application.ScreenUpdating = False
With F.[A1].CurrentRegion 'à adapter
If .Parent.FilterMode Then .Parent.ShowAllData 'si la feuille est filtrée
.Sort .Columns(2), xlAscending, .Columns(5), , xlAscending, Header:=xlYes 'tri
.EntireColumn.Copy Workbooks.Add.Sheets(1).[L1] 'document auxiliaire, à adapter
End With
Application.Calculation = xlCalculationManual 'évite le recalcul des formules volatiles
With ActiveWorkbook.Sheets(1).[L1].CurrentRegion
.Value = .Value 'supprime les formules
.Columns(7).Resize(, 2).EntireColumn.Delete
t = .Columns(6).Resize(, 2): ub = UBound(t)
For i = 2 To ub
If t(i, 2) = "" Then
For j = i + 1 To ub
If t(j, 2) <> "" Then Exit For
Next j
t(i, 1) = t(j, 1): t(i, 2) = t(j, 2): t(j, 2) = ""
i = j
End If
Next i
.Columns(6).Resize(, 2) = t 'restitution
On Error Resume Next 'si aucune SpecialCell
.Columns(7).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
.EntireColumn.Copy F.[L1]
End With
ActiveWorkbook.Close False 'fermeture du document auxiliaire
Application.Calculation = xlCalculationAutomatic
End Sub
Bonjour kingfadhel, le forum,
Oui mais j'y suis quand même arrivé.
1) En modifiant la formule de la MFC :
2) En utilisant un document auxiliaire :Code:=MOD(SI(COLONNE()<12;$A2;$L2);2)
Fichier (3).Code:Sub Regroupement() Dim F As Worksheet, t, ub&, i&, j& Set F = ActiveSheet Application.ScreenUpdating = False With F.[A1].CurrentRegion 'à adapter If .Parent.FilterMode Then .Parent.ShowAllData 'si la feuille est filtrée .Sort .Columns(2), xlAscending, .Columns(5), , xlAscending, Header:=xlYes 'tri .EntireColumn.Copy Workbooks.Add.Sheets(1).[L1] 'document auxiliaire, à adapter End With Application.Calculation = xlCalculationManual 'évite le recalcul des formules volatiles With ActiveWorkbook.Sheets(1).[L1].CurrentRegion .Value = .Value 'supprime les formules .Columns(7).Resize(, 2).EntireColumn.Delete t = .Columns(6).Resize(, 2): ub = UBound(t) For i = 2 To ub If t(i, 2) = "" Then For j = i + 1 To ub If t(j, 2) <> "" Then Exit For Next j t(i, 1) = t(j, 1): t(i, 2) = t(j, 2): t(j, 2) = "" i = j End If Next i .Columns(6).Resize(, 2) = t 'restitution On Error Resume Next 'si aucune SpecialCell .Columns(7).SpecialCells(xlCellTypeBlanks).EntireRow.Delete .EntireColumn.Copy F.[L1] End With ActiveWorkbook.Close False 'fermeture du document auxiliaire Application.Calculation = xlCalculationAutomatic End Sub
Sur 3200 enregistrements c'est un peu plus long => 1,6 seconde.
Bonne journée.
=MOD(DECALER(N°;LIGNE()-LIGNE(N°);decal*(COLONNE()>=COLONNE(N°)+decal););2)
Private Sub Worksheet_Change(ByVal Target As Range)
If ListObjects.Count = 0 Then Exit Sub
On Error Resume Next
With ListObjects(1).DataBodyRange
Intersect(.Cells, .Columns(.Columns.Count).SpecialCells(xlCellTypeBlanks).EntireRow).Delete xlUp
End With
End Sub