Split si caractère spécial + duplication des lignes

Bonjour à Tous,

Question de noob de la matinée !

A partir d'un tableau de 250000 lignes (ci-joint extrait pour exemple), j'ai besoin de le redessiner selon le contenu de la colonne CC :

  • si cellule en colonne C contient le caractère spécial ";" entre N valeurs, alors split des N valeurs dans N lignes,
  • de plus j'ai besoin de copier les attributs des colonnes A B et D de la ligne originale pour les coller dans les lignes nouvellement créées.

Macro ou formule à votre bon coeur...

Dans le fichier joint :

  • les 2 premières lignes correspondent à ce que j'ai dans mon fichier,
  • les lignes suivantes correspondent à ce que j'ai besoin d'avoir à la place.

Merci d'avance pour votre aide, et si vous avez besoin de davantage de détails n'hésitez pas à me les demander.

@+

FX, 29 ans de Toulouse

42test.xlsx (8.07 Ko)

Bonjour,

une proposition

Sub aargh()
    Dim v
    Dim r()
    q = -1
    cl = 1
    dl = Cells(Rows.Count, 1).End(xlUp).Row
    v = Range("A1:D" & dl)
    For i = 1 To dl
        a = Split(v(i, 3), ";")
        For j = LBound(a) To UBound(a)
            q = q + 1
            ReDim Preserve r(4, q)
            For k = 1 To 4
                If k = 3 Then r(k - 1, q) = a(j) Else r(k - 1, q) = v(i, k)
            Next k
            If q = 65535 Then
                cl = cl + 65535
                Range("A" & cl).Resize(q, 4) = Application.Transpose(r)
                ReDim r(4, 0)
                q = -1
            End If
        Next j
    Next i
    if q>0 then Range("A1").Resize(q, 4) = Application.Transpose(r)
End Sub

Bonjour,

Quelle rapidité merci !

J'ai copié/collé le code dans un module du fichier complet, j'ai modifié le nombre de lignes :

If q = 65535 Then

cl = cl + 65535

Et lorsque je lance la macro j'obtiens une erreur "incompatibilité de type 13"au niveau de cette ligne :

Range("A" & cl).Resize(q, 4) = Application.Transpose(r)

Qu'est ce que je dois modifier ?

Le fichier complet fait 5Mo je ne peux malheureusement pas le joindre...

Merci

Bonjour,

normalement le code devrait fonctionner tel que je te l'ai fourni. tu ne devrais pas modifier le 65535 qui est le nombre maximum d'éléments qui sont admis dans une instruction "transpose".

Ok alors le problème viendrait du fait que mon fichier fait 266594 lignes ?

Je peux le découper en 5 onglets et y appliquer la macro chaque fois sinon...

Bonjour,

mets ton fichier sur cjoint.com et mets le lien sur le forum

Voici

Kukux a écrit :

Ok alors le problème viendrait du fait que mon fichier fait 266594 lignes ?

Je peux le découper en 5 onglets et y appliquer la macro chaque fois sinon...

Bonjour,

à confirmer (h2so4 ?) mais la limite du transpose est 65536

P.

Bonjour,

h2so4 a tenu compte de la limite des 65536 lignes, mais tu as besoin de plus de 1048576 lignes (limite à partir de 2007).

Il t'en faut environ 1300000, donc obligé de découper au moins en 2.

eric

Bonjour,

J'ai découpé le fichier en 4 onglets de 65000 lignes mais j'obtiens toujours la même erreur "incompatibilité de type 13"

re bonjour

il te faut effectivement decouper ton fichier en plusieurs onglets car on dépasse le nombre max de lignes pour un onglet.

de plus, j'ai détecté un bug dans ma gestion du "transpose"

voici une correction

Sub aargh()
    Dim v
    Dim r()
    q = -1
    cl = 1
    dl = Cells(Rows.Count, 1).End(xlUp).Row
    v = Range("A1:D" & dl)
    For i = 1 To dl
        a = Split(v(i, 3), ";")
        For j = LBound(a) To UBound(a)
            q = q + 1
            ReDim Preserve r(4, q)
            For k = 1 To 4
                If k = 3 Then r(k - 1, q) = a(j) Else r(k - 1, q) = v(i, k)
            Next k
            If q = 65535 Then
                 Range("A" & cl).Resize(q, 4) = Application.Transpose(r)
                ReDim r(4, 0)
                q = -1
                cl = cl + 65535
            End If
        Next j
    Next i
    If q > 0 Then Range("A1").Resize(q, 4) = Application.Transpose(r)
End Sub

Merci à tous les 3 de votre disponibilité,

Le code marche bien en divisant le fichier...

Bonsoir le fil

Vois ceci :

Option Explicit
Sub test()
Dim a, b(), e, i As Long, n As Long
    With [a1].CurrentRegion
        a = .Value
        'attention à la 1ère dimension
        ReDim b(1 To 1000000, 1 To 4)
        For i = 1 To UBound(a, 1)
            For Each e In Split(a(i, 3), ";")
                n = n + 1
                b(n, 1) = a(i, 1)
                b(n, 2) = a(i, 2)
                b(n, 3) = e
                b(n, 4) = a(i, 4)
            Next
        Next
        .Offset(, .Columns.Count + 2).Resize(n, UBound(b, 2)).Value = b
    End With
End Sub

klin89

Rechercher des sujets similaires à "split caractere special duplication lignes"