Bonjour
Je viens de faire des tests avec un fichier > 700 000 lignes... !
Effectivement ça bug !
Alors j'ai trouvé "pourquoi" et aussi "une solution"
Par contre attention le code va être un peu plus compliqué... à ma connaissance je n'ai pas vu ce genre de traitement (programmation) souvent sur le forum, mais il faut dire que ce cas là est particulier... !
Voici le code :
Public Type typPhase
tabPhase() As Variant
End Type
Sub Tasser()
Dim ligFin, ligCpt, nbrLig
Dim tabVrac()
Dim tmp
Dim cptPhase
Dim nbrPhase
Dim debPhase, finPhase
nbrPhase = CompterPhase
debPhase = 2
finPhase = 60000
ReDim tabGood(1 To nbrPhase) As typPhase
For cptPhase = 1 To nbrPhase
tabVrac = Range(Cells(debPhase, 1), Cells(finPhase, 1))
With tabGood(cptPhase)
ReDim .tabPhase(1 To 1, 1 To 1)
End With
nbrLig = 0
For ligCpt = 1 To UBound(tabVrac, 1)
If Left(tabVrac(ligCpt, 1), 3) = "Réf" Then
nbrLig = nbrLig + 1
With tabGood(cptPhase)
ReDim Preserve .tabPhase(1 To 1, 1 To nbrLig)
tmp = Split(tabVrac(ligCpt, 1), ":")
.tabPhase(1, nbrLig) = tmp(1)
End With
End If
Next
debPhase = finPhase + 1
finPhase = debPhase + 60000
Next
Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)).ClearContents
debPhase = 2
For cptPhase = 1 To nbrPhase
With tabGood(cptPhase)
Cells(debPhase, 1).Resize(UBound(.tabPhase, 2), UBound(.tabPhase, 1)) = WorksheetFunction.Transpose(.tabPhase)
debPhase = debPhase + UBound(.tabPhase, 2)
End With
Next
End Sub
Function CompterPhase()
Dim ligFin
ligFin = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox "Votre fichier comporte " & ligFin & " lignes"
MsgBox "le traitement sera effectué en " & (ligFin \ 60000) + 1 & " passes successives !"
CompterPhase = (ligFin \ 60000) + 1
End Function
Quelques explications en vitesse :
- pour palier au bug j'ai découpé le traitement en plusieurs phases de 60 000 lignes chacune
- au début "Public Type typPhase ... End Type"
me permet de décrire le nombre de phase
- à l'intérieur il y a un tableau tabPhase() qui permet de conserver chaque phase
ensuite au début du code je compte le nombre de phases nécessaires c'est la fonction "CompterPhase() associée à nbrPhase = CompterPhase()"je dimensionne donc le tableau tabGood au nombre de phasepuis je rempli le tableau des phases par groupe de 60 000 lignesen cherchant la valeur "Réf..."j'ajoute une colonne au tableau tabPhase à chaque fois que la valeur est trouvéeensuite même procédé de découpage pour recopier le résultat...et voilà !Concernant "Public Type typPhase" :
il s'agit d'un type utilisateur au même titre que String, Boolean, Long, Date... sont des types pré-définis dans Excel, à la différence que ce premier est un type utilisateur
Autre remarque
Pourquoi 60 000 lignes ? tout simplement parce que cela fait à peu près 65 537 soit la dimension sur laquelle "ça bug" donc par sécurité 60 000 "y'a pas de bug" en plus 65 537 est un chiffre bien connu (n'Est-ce pas ?)