Michael, ton code a déjà le mérite de répondre au besoin !
Pour chipoter, dans le cas de centaines de lignes à traiter,
il vaudrait mieux désactiver l'affichage afin d'accélérer la procédure …
Je ne suis pas sûr si l'insertion est la méthode la plus rapide
mais elle a l'avantage de conserver le format des cellules.
Voici une autre voie - via des variables tableau - comportant des sécurités;
même si le nombre de lignes de code est plus conséquent, elle semble toutefois assez véloce …
Traitement principal dans le bloc des lignes n°16 à 35.
Le bloc suivant est optionnel, il sert juste à uniformiser le format des lignes …
Code à copier dans le module de la feuille à traiter :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| Sub Demo()
Dim Rg As Range
Set Rg = Me.UsedRange.Find("Produit", , xlValues, xlWhole, xlByRows)
If Rg Is Nothing Then Beep: End
With Rg.CurrentRegion
CC& = .Columns.Count: RC& = .Rows.Count
If CC < 4 Or RC = 1 Or .Columns(2).Find(vbLf, , xlValues, xlPart) Is Nothing Then _
Set Rg = Nothing: Beep: End
VA = .Value: L& = .Row: C1& = .Column: Application.ScreenUpdating = False
.HorizontalAlignment = xlCenter: .VerticalAlignment = xlCenter
End With
ReDim SP(2 To 4): SP(3) = Split(""): SP(4) = SP(3)
For R& = 2 To RC
For C& = 2 To 4
SP(C) = Split(VA(R, C), vbLf)
If C = 2 Then U& = UBound(SP(2)): If U = 0 Then Exit For
Next
If U And UBound(SP(3)) = U And UBound(SP(4)) = U Then
ReDim AR(0 To U, 1 To CC)
For N& = 0 To U
For C = 1 To CC
If C < 2 Or C > 4 Then AR(N, C) = VA(R, C) Else AR(N, C) = SP(C)(N)
Next
Next
Cells(L + 1, C1).Resize(U + 1, CC).Value = AR: L = L + U + 1
Else
L = L + 1: Cells(L, C1).Resize(, CC).Value = Application.Index(VA, R)
End If
Next
With Rg.CurrentRegion
If .Rows.Count > RC Then
.Rows(RC).Copy: Me.Activate: AD$ = ActiveCell.Address
.Rows(RC + 1 & ":" & .Rows.Count).PasteSpecial xlPasteFormats
Application.CutCopyMode = False: Range(AD).Select
End If
End With
Set Rg = Nothing: Erase AR, SP, VA
End Sub |
_________________________________________________________________________________________________
Merci de cliquer sur

pour chaque message ayant aidé puis sur

pour clore cette discussion …
_________________________________________________________________________________________________
On ne dit pas une biroute mais une route à deux voies …
Partager