Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Nettoyage de fichier

  • Initiateur de la discussion Initiateur de la discussion Nico
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

N

Nico

Guest
Re bonjour!!

Je vous joint le fichier EXCEL avec le code que j'ai déjà écris.

Alors mon problème est le suivant:

j'importe un fichier qui contient des données. Ces données sont représentées par des lignes de chiffres. Chaque ligne est ce que j'appelerai une 'trame'. Chaque trame commence par le code '90' et se termine 45 cases plus loin (elle font toutes la même taille).
Mon soucis est le fait que le fichier que je reçoit comporte par moment des trames qui se suivent, sans retour à la ligne comme elles devraient le faire!!
J'aimerai de ce fait, pouvoir faire le retour à la ligne dès que la taille de la trame est correcte (45). A savoir que les deux première trames de mon fichier joint sont corretes: elles commencent bien par '90' et se termine à la taille 45.
Notez donc la troisième ligne qui se continue après la fin normale de la trame; c'est en fait une nouvelle trame! Attention vous pouvez aussi noter que la suite de cette trame est la quatrième ligne jusqu'à l'autre '90'!! Il me faut donc choper le reste de cette trame et la refoutre à la ligne jusqu'à la taille prescrite!!
C'est un casse tête pour moi!!
HELPPPPPPP !!!

MERCI [file name=Nettoyage_fic_LOCNG.zip size=16733]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Nettoyage_fic_LOCNG.zip[/file]
 

Pièces jointes

SAlut,

Je te propose cela comme base de travail.
Il faudra peut etre fignioler

Code:
Private Sub CommandButton2_Click()
    Dim i as Integer

    For i = 3 To Range('A65536'Â'Â').End(xlUp).Row + 1
        If Cells(i, 47).Value = '90' Then
            Range(Cells(i, 47), Cells(i, Cells(i, 47).End(xlToRight).Column)).Cut
            Cells(i + 1, 1).Insert Shift:=xlToRight
        End If
    Next
End Sub


@+

Message édité par: Minick, à: 23/02/2005 15:54
 
Minick écrit:

MERCI TU ES MON SAUVEUR !!!!

Ca marche a priori niquel chrome!!!!!!
TROP FORT tu es !!!
 
Minick écrit:

Bonjour,

J'ai quand même un petit soucis avec ta petite fonction...sniff
Je t'explique:
En fait le fichier que je dois tester est composé de milliers de lignes, et avec la fonction Insert xlToRight, au bout de quelques lignes, les cellules dépassent la largeur de la feuille de calcul!! En effet étant donné qu'à chaque traitement on insère la trame devant celle d'en dessous, cela pousse toutes les cellules vers la droite et à force de traitement (comme il y a des milliers de lignes érronées) on dépasse la taille de la feuille...
En fait je pense à la fonction xlDown, non?
cependant je n'arrive pas à le faire, car il faut quand on Insert vers le bas la trame, choper la suite de cette trame qui est à la ligne du dessous!!
Peux tu me revenir en aide?

Merci
 
Salut,

Effectivement je n'avais pas pensé à cela 😱 .

Essayes avec ce code la:

Code:
 Private Sub CommandButton2_Click()
    Dim NLigne As Integer, NbCol As Byte

    Application.ScreenUpdating = False

    NLigne = 3 
    Do
        If Cells(NLigne, 47).Value = '90' Then
            Application.CutCopyMode = False

            Rows(NLigne + 1).Insert Shift:=xlDown
            Range(Cells(NLigne, 47), Cells(NLigne, Cells(NLigne, 47).End(xlToRight).Column)).Cut Destination:=Cells(NLigne + 1, 1)

            NbCol = Cells(NLigne + 1, 1).End(xlToRight).Column
            If NbCol < 47 Then
                Range(Cells(NLigne + 2, 1), Cells(NLigne + 2, 46 - NbCol)).Cut Destination:=Cells(NLigne + 1, NbCol + 1)
                Range(Cells(NLigne + 2, 1), Cells(NLigne + 2, 46 - NbCol)).Delete Shift:=xlToLeft
            End If
        End If
        NLigne = NLigne + 1
    Loop While NLigne < Range('A65536'Â'Â').End(xlUp).Row + 1

    Application.ScreenUpdating = True
End Sub

@+

Message édité par: Minick, à: 24/02/2005 10:12
 
Minick écrit:

Merci Minick c'est cool de m'aider!!!

Je te joins la nouvelle version avec ton nouveau bout de code...
Il semblerait que la fonction fonctionne bien quelques lignes mais il existe des exceptions dont je ne connait pas la cause.
J'ai des trame, comme tu peux le constater quand tu vas lancer la macro, qui ne vont pas chercher le reste qui se trouve au début de la ligne d'en dessous alors que ça se passe bien avant...Sniff je comprends rien...
Peux tu regarder?? Je te remercie d'avance, tu m'es de grand aide!!!

Nico [file name=Nettoyage_fic_LOCNG_20050224112920.zip size=21133]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Nettoyage_fic_LOCNG_20050224112920.zip[/file]
 

Pièces jointes

Re,
bon je recommence mon post paske c'est l'b.....
j'ai voulu reediter pour faire une mise en garde sur le signe different
et ca m'a fait nawak

je disais donc essayes ceci:

Code:
Private Sub CommandButton2_Click()
    Dim NLigne As Integer, NbCol As Byte

    Application.ScreenUpdating = False

    NLigne = 3
    Do
        NbCol = Cells(NLigne, 1).End(xlToRight).Column

        If NbCol < 46 And Cells(NLigne, 1) < > '' Then
            Range(Cells(NLigne + 1, 1), Cells(NLigne + 1, 46 - NbCol)).Cut Destination:=Cells(NLigne, NbCol + 1)
            Range(Cells(NLigne + 1, 1), Cells(NLigne + 1, 46 - NbCol)).Delete Shift:=xlToLeft
        End If

        If Cells(NLigne, 47).Value = '90' Then
            Application.CutCopyMode = False
            Rows(NLigne + 1).Insert Shift:=xlDown
            Range(Cells(NLigne, 47), Cells(NLigne, Cells(NLigne, 47).End(xlToRight).Column)).Cut Destination:=Cells(NLigne + 1, 1)

            NbCol = Cells(NLigne + 1, 1).End(xlToRight).Column
            If NbCol < 46 Then
                Range(Cells(NLigne + 2, 1), Cells(NLigne + 2, 46 - NbCol)).Cut Destination:=Cells(NLigne + 1, NbCol + 1)
                Range(Cells(NLigne + 2, 1), Cells(NLigne + 2, 46 - NbCol)).Delete Shift:=xlToLeft
            End If
        End If
        NLigne = NLigne + 1
    Loop While NLigne < Range('A65536').End(xlUp).Row + 1

    Application.ScreenUpdating = True
End Sub

Attention:
Il faut enlever l'espace entre < et > sur cette ligne
If NbCol < 46 And Cells(NLigne, 1) < > '' Then

@+

Message édité par: Minick, à: 24/02/2005 12:10
 
Minick écrit:

Resalut Minick!!!
Alors effectivement cette fonction fonctionne mieux!
Cependant il subsiste encore un petit problème dont je te joins un exemple.
En effet il semble que si une trame est plus courte que 46 alors la fonction ne prend pas en compte le '90' qui suit pour mettre le reste à la ligne...Est ce normal? Je pense que non au vue de la fonction...
Ce problème est visible plusieurs fois sur un fichier de + de 5000 lignes.
Peux tu jeter un coup d'oeil?
De plus sur un fichier de + de 5000 lignes, lorsque l'appli rencontre plusieurs problème comme ça, j'ai un bug 'ERREUR 6 Capacité insuffisante...'.

DUR !!!

MERCI [file name=Nettoyage_fic_LOCNG_20050224141038.zip size=19036]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Nettoyage_fic_LOCNG_20050224141038.zip[/file]
 

Pièces jointes

re,

vi vi chui la,

alors, explication de texte:
Je n'est pas geré ce cas car tu avais indiqué dans le poste d'origine
que chaque trame faisait 45 de long + le '90' donc cela été correct.
De plus a la vu de tes fichiers joints avant ce dernier il n'y avait pas ce cas particulier donc je n'ai pas cherché à gerer un tel cas

Donc d'apres tes fichiers et tes explications j'arrive à ceci:

Code:
Private Sub CommandButton2_Click()
    Dim NLigne As Integer, NbCol As Byte
    Dim Rech

    Application.ScreenUpdating = False

    NLigne = 3
    Do
        Set Rech = Range(Cells(NLigne, 2), Cells(NLigne, Cells(NLigne, 1).End(xlToRight).Column)).Find(What:='90', LookIn:=xlValues, Lookat:=xlWhole)

        If Not Rech Is Nothing Then
            Rows(NLigne + 1).Insert Shift:=xlDown
            Range(Cells(NLigne, Rech.Column), Cells(NLigne, Cells(NLigne, Rech.Column).End(xlToRight).Column)).Cut Destination:=Cells(NLigne + 1, 1)
        ElseIf Cells(NLigne + 1, 1) < > 90 Then
            Set Rech = Range(Cells(NLigne + 1, 1), Cells(NLigne + 1, Cells(NLigne + 1, 1).End(xlToRight).Column)).Find(What:='90', LookIn:=xlValues, Lookat:=xlWhole)

            If Not Rech Is Nothing Then
                Range(Cells(NLigne + 1, 1), Cells(NLigne + 1, Rech.Column - 1)).Cut Destination:=Cells(NLigne, 1).End(xlToRight).Offset(0, 1)
                Range(Cells(NLigne + 1, 1), Cells(NLigne + 1, Rech.Column - 1)).Delete Shift:=xlToLeft
        End If
        End If
        NLigne = NLigne + 1
    Loop While NLigne < Range('A65536').End(xlUp).Row + 1

    Application.ScreenUpdating = True
End Sub


@+


PS: Attention à cette ligne avec le signe different
ElseIf Cells(NLigne + 1, 1) < > 90 Then

supprime l'espace comme tout a l'heure

Message édité par: Minick, à: 24/02/2005 15:56
 
Merci Minick, je n'ai pas pu encore tester car je n'arrive pas à compiler les phrases:
&nb sp Range(Cells(NLigne, Rech.Column), Cells(NLigne, Cells(NLigne, Rech.Column).End(xlToRight).Column)).Cut Destination:=Cells(NLigne + 1, 1)
--> '&nb sp' c'est quoi?? pointeur??? mon compilateur ne reconnait pas le '&nb sp'

&n bsp Range(Cells(NLigne + 1, 1), Cells(NLigne + 1, Rech.Column - 1)).Delete Shift:=xlToLeft
--> même remarque...

Merci, je suis un peu limité en VBA dslé...
 
Merci Minick franchement c'est super cool!!!

Il reste juste un dernier truc dont j'ai besoin...
En fait le retour à la ligne de la trame à partir du '90' n'est vrai que si ce '90' est suivi de '2E'. T'as pu remarquer que la majorité des trames commencaient par '90 2E FF FF FF'.
Parce que en effet il peut y avoir un '90' dans une trame mais qui ne correspond paas au début d'une d'entre elles...Tu vois ce que je veux dire??

Récapitulatif: ta dernière fonction est niquel chrome à part ce petit truc, le début d'une trame est traduit par '90 2E FF FF FF', c'est en fait à ce moment là que l'on doit faire le retour à la ligne et récupérer le reste jusqu'au prochain '90 2E FF FF FF'.

Voilà je pense qu'ensuite ça sera terminé, je ne t'embeterai plus...J'espère...
:S

Merci pour tout
 
huuuummm
:evil:
je ne sais pas pkoi mais je m'y attendais.

Il faut que je revois ma strategie car il faut prendre le probleme autrement.
Je vois ca ce soir si je peux sinon ce sera pour demain, je n'ai plus le temps pour le moment.

Mais je voudrais quand meme que tu prennes conscience qu'il est tres
important de bien reflechir à ce que l'on veut avant de faire une demande.

Si tu m'avais donné toutes les infos dans le 1er post, il y a de grande chance pour que ton probleme soit resolu alors que la, on revient sur ce que l'on fait plusieur fois...

@+
 
😱 effectivement je n'ai pas su te dire tout ce dont j'avais besoin dès le début et je m'en excuse, mais j'ai découvert les pb en même temps que j'obtenais des fichiers...

dslé...

En tout cas je pense que c'est le dernier pb!! J'ai testé la fonction sur un fichier de 6000 lignes et ça fonctionne bien, à part le fait que ça met à la ligne à tous les '90' mais ça c'est normal je ne te l'avais pas dis...

Merci de ton aide!
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
10
Affichages
524
Réponses
10
Affichages
384
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…