splitté des celulles avec des nombre de champs superieur a 255!

fredh

XLDnaute Occasionnel
[Resolu] Splitté des celulles avec des nombre de champs superieur a 255!

Bonjour a tous
J'ai un fichier excel issu d'une extraction de Base de donnés.
Afin de traité cela il faudrait que je splitte les celulles en colonne A:A
Probleme : si je splite simplement alors j'ai 277 colonnes et excel ne peut en avoir que 255, donc je desir "oublier" quelques champs lors du splittage.
.
Pour cela j'ai pondu la macros suivante (attention ca risque de piquer au yeux car je suis encore debutant :)) :

Code:
Sub aCSV()
Dim colon
Dim n As Integer, ncolon As Integer
'Ici je donne les numero de split a copié
'Je ne veut pas le 6em, 7em, 10em et 11em champ).
'plus tard il faudrait que j'inscrive ici environ 200 champ) Est ce possible?
colon = Array(0, 1, 2, 3, 4, 5, 8, 9, 12, 13, 14, 15, 16, 17)
ncolon = 0
'la 1er ligne est une ligne d'exemple qui representge C1 splitté
'la 2em ligne est une ligne d'exemple de ce que je desire obtenir, donc je commence le traitement en 3em ligne
For n = 3 To Range("A65536").End(xlUp).Row
'Split de la colonne A copie dans A, B, C etc....
    t = Split(Range("A" & n), ";")
 
    Range("A" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("B" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
    Range("C" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("D" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("E" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("F" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("G" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("H" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("I" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("J" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("K" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("L" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("M" & n) = t(m)
    ncolon = colon + 1
    m = colon(ncolon)
 
    Range("N" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("O" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("P" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("Q" & n) = t(m)
    ncolon = ncolon + 1
    m = colon(ncolon)
 
    Range("R" & n) = t(m)
    ncolon = colon + 1
    m = colon(ncolon)
 
    Range("S" & n) = t(m)
    ncolon = colon + 1
    m = colon(ncolon)
 
    Range("T" & n) = t(m)
    ncolon = colon + 1
    m = colon(ncolon)
 
    Range("U" & n) = t(m)
    ncolon = colon + 1
    m = colon(ncolon)
 
    Range("V" & n) = t(m)
    ncolon = colon + 1
    m = colon(ncolon)
 
    Range("W" & n) = t(m)
    ncolon = colon + 1
    m = colon(ncolon)
 
    Range("X" & n) = t(m)
    ncolon = colon + 1
    m = colon(ncolon)
 
    Range("Y" & n) = t(m)
    ncolon = colon + 1
    m = colon(ncolon)
 
    Range("Z" & n) = t(m)
    n = n + 1
Next n
End Sub


J'ai quelques problemes :
1.\ a la fin du split j'ai des problemes de rebouclage, il faudrait que je fasse la manoeuvre que tant qu'il y a quelque chose dans le split....
2.\ je n'arrive pas a suprimez des champs.....Resolue
3.\ je ne suis pas sur du resultat plusieurs lignes (enfin ca devrait rouler mais vu que ca bloque avant...)
4.\ j'aimerai simplifié le code en incrementant les colonnes, afin d'evité les repetition. En effet dans l'exemple j'ai 17 colonne mais en realité j'en ai presque 200 (277 sans la supression).


Ci joint un fichier exemple :
avec des boutons pour lancer la macros, un boutons pour revenir au point de depart afin de retester corectement.
La 3em ligne inclus des MFC afin de colorié en vert un bon resultat et en rouge un mauvais resultat.

Voila j'espere avoir été clair. sinon n'hesité pas


PS edit:

merci et @+
 

Pièces jointes

  • test3.zip
    20.5 KB · Affichages: 33
  • test3.zip
    20.5 KB · Affichages: 38
  • test3.zip
    20.5 KB · Affichages: 39
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : splitté des celulles avec des nombre de champs superieur a 255!

Bonsoir Fredh

je ne suis pas sur que cela puisse t'aider, regarde la macro ci dessous, "split" ton fichier ligne par ligne et transpose les données dans une autre feuille, reste éventuellement à supprimer certaines lignes selon tes critères et transposer dans l'autre sens, tout dépend aussi du nombre de ligne que tu as dans ton fichier source :

Code:
Sub test()
Dim x, i As Integer
For i = 1 To Range("A65536").End(xlUp).Row
    x = Split(Range("A" & i), ";")
    With Sheets("Feuil2")
        .Range(.Cells(1, i), .Cells(UBound(x), i)) = Application.Transpose(x)
    End With
    Erase x
Next i
End Sub

en espérant ne pas être trop à coté du sujet... pas gagné...

bonne soirée
@+
 

pierrejean

XLDnaute Barbatruc
Re : splitté des celulles avec des nombre de champs superieur a 255!

re
@ Banzai64

il y a des similitudes entre ta version et la mienne

toutefois j'attire ton attention sur le fait qu'avec

NonCol = "*6*7*10*11"

InStr(1, NonCol, "*" & CStr(J)) = 0 sera vraie avec j =1 !!!
 

Banzai64

XLDnaute Accro
Re : splitté des celulles avec des nombre de champs superieur a 255!

Bonsoir

Merci pierrejean

Zavais pas vu

Une solution
NonCol = "*6*7*10*11*"

InStr(1, NonCol, "*" & CStr(J) & "*") = 0

je n'ai pas testé


Ps: Je viens de voir ton fichier : T'as copié ? :D
 
Dernière édition:

fredh

XLDnaute Occasionnel
Re : splitté des celulles avec des nombre de champs superieur a 255!

Bonsoir a tous
Merci de participé a mon probleme.

Au 1er apercus (le test pousser sur le gros fichier serat pour demain matin) ca a l'air vraiment tip-top, au petit oignons.
Ce qui me decourage c'est l'apparente facilité avec laquelle vous resolvé les problemes.
J'ai vraiment encore beaucoup a apprendre ! Courage ....
A votre avis comment ca roule sur un gros fichier du genre 35000 ligne de environ 200 colonne chacune ? Je vais mettre le PC sur la terasse, en plein air :):):D:D.
Je vous tient au courant demain matin.
En attendant merci encore et bonne soirée

@+
 

fredh

XLDnaute Occasionnel
Re : splitté des celulles avec des nombre de champs superieur a 255!

Bonjour a tous.
J'ai tester la version de pierrejean et pour un fichier de 5373 ligne de 277 colonne (dont 120 qui vont etre purger) ca a mis 1:01:50 sur un PC P4 2.4Ghz 512Mo RAM. Excel a pris toute la charge CPU mais n'a pas pris plus de 30Mo de RAM...

Ca marche donc tres bien si ce n'est la lenteur du cycle mais ca je crois que vu la clarté du code on ne pourrat pas gagner grand chose. Donc je m'en contente avec plaisir.

Quelque remarques et modification pour coller a ma demande en bleue, et une question en rouge :
Code:
Sub aCSV_DC()
nepasprendre = ",6,7,9,10,11,15,16,20,21,,25,26,30,31,35,36,40,41,45,46,50,51,55,56,57,59,60,61,62,64,65,66,70,71,75,76,80,81,85,86,90,91,92,94,95,96,100,101,105,106,110,111,115,116,120,121,125,126,130,131,135,136,137,139,140,141,142,144,145,146,147,149,150,151,152,154,155,"
For n = 1 To Range("A65536").End(xlUp).Row
[COLOR=seagreen]'Split de la colonne A copie dans A, B, C etc....[/COLOR]
    t = Split(Range("A" & n), ";")
    num = 0
    col = 1
    For m = 1 To UBound(t)
    If InStr(nepasprendre, "," & CStr(num) & ",") = 0 Then
       [COLOR=blue]'Pourquoi mettre "'" avant la valeur ?[/COLOR]
[COLOR=seagreen]       'Cells(n, col) = "'" & t(num)[/COLOR]
       [COLOR=red]'J'aimerai que la valeur t(num) soit netoyer des " et des espaces[/COLOR]
       Cells(n, col) = t(num)
       col = col + 1
    End If
      num = num + 1
      '[COLOR=blue]Ici ce n'est pas le nombre de colonne avant formatage que je veut tester mais celle apres formatage.[/COLOR]
[COLOR=seagreen]      'If num > 256 Then Exit For[/COLOR]
       If col > 256 Then Exit For
    Next m
 Next n
End Sub


Voila en tout cas je vous remercie tous d'avoir participer et resolu mon probleme de base.
Si toutefois quelques uns pourrais m'aider a purger directement le " et les espaces ca serait nickel.
En effet j'ai essayez de le faire (remplacer ""espace" par rien, remplacer "espace"" par rien et remplacer espace par rien) par la suite mais excel ne peut pas tout faire...ERREUR pas assez d'espace blabla. Donc si on nettoie au depart je pense qu'il n'y a plus de soucis.

Voila merci a tous et aussi a ceux qui participeront a ma nouvelle demande..
@+
 

pierrejean

XLDnaute Barbatruc
Re : splitté des celulles avec des nombre de champs superieur a 255!

bonjour fredh

teste:

Code:
Sub aCSV_DC()
Application.ScreenUpdating = False
nepasprendre = ",6,7,9,10,11,15,16,20,21,,25,26,30,31,35,36,40,41,45,46,50,51,55,56,57,59,60,61,62,64,65,66,70,71,75,76,80,81,85,86,90,91,92,94,95,96,100,101,105,106,110,111,115,116,120,121,125,126,130,131,135,136,137,139,140,141,142,144,145,146,147,149,150,151,152,154,155,"
For n = 1 To Range("A65536").End(xlUp).Row
[COLOR=seagreen]'Split de la colonne A copie dans A, B, C etc....[/COLOR]
    t = Split(Range("A" & n), ";")
    num = 0
    col = 1
    For m = 1 To UBound(t)
    If InStr(nepasprendre, "," & CStr(num) & ",") = 0 Then
       [COLOR=blue]'Pourquoi mettre "'" avant la valeur ?[/COLOR]
[COLOR=seagreen]      'Cells(n, col) = "'" & t(num)[/COLOR]
       [COLOR=red]'J'aimerai que la valeur t(num) soit netoyer des " et des espaces[/COLOR]
          Cells(n, col) = Replace(t(num), """", "")
       col = col + 1
    End If
      num = num + 1
      '[COLOR=blue]Ici ce n'est pas le nombre de colonne avant formatage que je veut tester mais celle apres formatage.[/COLOR]
[COLOR=seagreen]     'If num > 256 Then Exit For[/COLOR]
       If col > 256 Then Exit For
    Next m
 Next n
Application.ScreenUpdating = true
End Sub

le ' en sus n'etait la que pour satisfaire la mfc (j'aime beaucoup le vert !!)
et pour col au lieu de num eh bien....:D tu as parfaitement raison ,c'etait une erreur
j'ais ajouté les application.screenupdating qui devraient accelerer le processus
 

fredh

XLDnaute Occasionnel
Re : splitté des celulles avec des nombre de champs superieur a 255!

Bonjour PierreJean

J'ai l'impression que tu est comme Obelix....tu est né dedans (le VBA) en etant petit ? :)

Ta modif marche bien, mais pourrais tu me l'expliqué stp parce que la je suis plus :D?

Tu "charge" la valeur de t(num) et tu remplace les " (guillemet) par rien c'est bien ca ?

Code:
Cells(n, col) = Replace(t(num), """", "")


Il faudrait que je remplace encore les espaces par rien
Code:
Replace " ", ""
 
Dernière édition:

fredh

XLDnaute Occasionnel
Re : splitté des celulles avec des nombre de champs superieur a 255!

re

noprob pierrejean tu es tout excusé.

J'ai écrit
Code:
    If InStr(nepasprendre, "," & CStr(num) & ",") = 0 Then
       Cells(n, col) = Replace(t(num), " ", "")
       Cells(n, col) = Replace(t(num), """", "")
       col = col + 1
    End If
La ca marche mais je ne comprend pas :
d'abord on prend la valeur de t(num) et on enleve les espaces dans le resultat qu'on ecrit dans la celulle

ensuite on prend encore une fois t(num) et on enleve les " dans le resultat qu'on reécrit dans la celulle

Pourtant le resultat de la macros est corecte....je n'ai pas encore saisie...


et si j'ecrit
Code:
          If InStr(nepasprendre, "," & CStr(num) & ",") = 0 Then
       Cells(n, col) = Replace(t(num), """", "")
       Cells(n, col) = Replace(t(num), " ", "")
       col = col + 1
    End If
alors il me reste les " dans mes celulles....



En tout cas merci pierrejean (et les autres aussi) pour le coup de main.
 

fredh

XLDnaute Occasionnel
Re : splitté des celulles avec des nombre de champs superieur a 255!

Rectification ca marche pas, j'ai encore les espaces....donc m'on raisonnement est bon

j'ai modifier le code comme ceci est la ca a l'air de rouler
Code:
If InStr(nepasprendre, "," & CStr(num) & ",") = 0 Then
       Cells(n, col) = Replace(t(num), """", "")
       Cells(n, col) = Replace(Cells(n, col) " ", "")
       col = col + 1
End If

mais bon si tu as une soluce pour le faire en une seule fois ca serait cool

@+
 
Dernière édition:

Discussions similaires

Réponses
7
Affichages
353

Statistiques des forums

Discussions
312 379
Messages
2 087 761
Membres
103 661
dernier inscrit
fcleves