Séparation de lignes grâce à un marqueur

arkh01

XLDnaute Nouveau
Bonjour,

Tout d'abord concernant ma version d'Excel ; je développe en 2010 mais l'application est amenée à tourner sur Excel 2000. C'est vieux, c'est tout pourri, mais c'est malheureusement hors de mon contrôle :cry:

Concernant mon problème, je récupère un classeur exporté depuis un programme tiers (Doors), certaines lignes contiennent de très nombreuses informations.
Je m'explique, on définit au préalable un séparateur "===", les cellules sont ensuite formatées de la sorte:
Texte 1
===
Texte 2
===
Texte n

Après passage de la macro, Texte 1, 2 et n sont dans n lignes séparées.
J'ai réussi à faire marcher cela, mon problème intervient quand un Texte est vide ; à ce moment-là, le programme génère une ligne vide.
Cela n'est pas un bug du programme, c'est complétement normal mais j'aimerais ne pas avoir ces lignes vides. Savez-vous comment je pourrais faire ?

J'ai identifié que lorsque Texte 1 est vide, la ligne l'est aussi (à l'exception des 6 premières colonnes qui ne sont pas touchées par la macro).
Cependant si un autre Texte (de 2 à n) est vide, un saut de ligne (chr(10)) est inscrit dans la ligne de décomposition.
Les lignes décomposées de 2 à n ne contiennent rien dans les colonnes 1 à 6, ce qui les rend d'apparence vide (mais certaines cases contiennent un saut de ligne).

J'ai essayé de mettre des conditions dans la sous-macro de décomposition (elles sont en commentaire dans le code ci-dessous). Cela ne fonctionnait pas vraiment, et me créait de nombreux doublons.

Pour les lignes provenant des textes de 2 à n, j'ai essayé de faire une fonction qui les détecte via le chr(10) et les supprime mais en vain. Mes boucles suppriment aussi des lignes pleines. De plus, je préférerai résoudre le problème à la base. Le fichier d'export contenant environ 900 ligne (qui en donnent 1700 à la fin), j'aimerai éviter les étapes non nécessaires.

Pour la ligne qui provient de Texte 1 je bloque complétement car le résultat provoqué peut aussi être tout à fait normal dans d'autres cas (Des donnés jusqu'à la colonne 6 puis plus rien).

Voici la sous-macro correspondant à cette partie du programme
Code:
Private Sub mise_en_forme_1_niveau()
    Dim ligne_source As Long
    Dim ligne_dest As Long
    Dim ligne_dest_decomp As Long
    Dim ligne_dest_decomp_max As Long
    Dim colonne As Long
    Dim txt As String
    Dim last_line As Long
    Dim last_col As Long
    Dim position As Long

    info = "deuxième niveau de mise en forme. Ligne : "
    colonne_start = 7
    colonne_end = 32
    separateur = "==="
    onglet_source = "inter"
    onglet_destination = "inter2"

    'nettoyage de l'onglet de destination
    Sheets(onglet_destination).Rows("2:65536").Delete Shift:=xlUp

    ' récupération des dimensions à traiter
    last_line = Sheets(onglet_source).Cells.SpecialCells(xlCellTypeLastCell).Row
    last_col = Sheets(onglet_source).Cells.SpecialCells(xlCellTypeLastCell).Column
    
    'recopie de la ligne de titre
    For colonne = 1 To last_col
        Sheets(onglet_destination).Cells(RANG_TITRE, colonne).Value = _
            Sheets(onglet_source).Cells(RANG_TITRE, colonne).Value
    Next colonne
    
    ligne_dest = 2
    
    ' pour chaque ligne de la source
    For ligne_source = RANG_TITRE + 1 To last_line
    Application.StatusBar = info & ligne_source
        
        ' on copie d'abord toutes les cellules de la ligne
        For colonne = 1 To last_col
            Sheets(onglet_destination).Cells(ligne_dest, colonne).Value = _
                Sheets(onglet_source).Cells(ligne_source, colonne).Value
        Next
        
        ' pour chaque colonne à éventuellement redécomposer
        ligne_dest_decomp_max = 0
        For colonne = colonne_start To colonne_end
            ligne_dest_decomp = ligne_dest
            txt = Sheets(onglet_destination).Cells(ligne_dest, colonne).Value
            position = InStr(txt, separateur)

            ' on décompose tant que l'on trouve un séparateur
            While (position <> 0)
                Dim gauche As Long
                gauche = position - 2
                If gauche < 0 Then gauche = 0
                'If Not (Left(txt, gauche) Like Chr(10)) Then
                    Sheets(onglet_destination).Cells(ligne_dest_decomp, colonne).Value = Left(txt, gauche)
               ' End If
                'If Left(txt, gauche) Like Chr(10) Then MsgBox "HOURRA!"
                txt = Mid(txt, position + Len(separateur) + 1)
                ligne_dest_decomp = ligne_dest_decomp + 1
                position = InStr(txt, separateur)
            Wend
           ' If (Left(txt, gauche) Like Chr(10)) Then
           '  Sheets(onglet_destination).Cells(ligne_dest_decomp - 1, colonne).Value = Mid(txt, Len(separateur) - 1)
           '  If (ligne_dest_decomp_max < ligne_dest_decomp) Then ligne_dest_decomp_max = ligne_dest_decomp
           ' Else
             Sheets(onglet_destination).Cells(ligne_dest_decomp, colonne).Value = txt
             If (ligne_dest_decomp_max < ligne_dest_decomp) Then ligne_dest_decomp_max = ligne_dest_decomp
           'End If
        Next
        ligne_dest = ligne_dest_decomp_max + 1
    Next
End Sub

J'ai mis le programme complet en fichier joint (avec une base de données très réduite)
Il fonctionne de la manière suivante :
Il se lance en exécutant la sub main
3 séparateurs sont définis dans le main ( --- === ###), le main lance la macro une fois pour chaque séparateur (à la suite)
Les colonnes de 1 à 6 sont ensuite recopiées sur chaque ligne
Les fonctions suivantes n'influent en rien sur le problème, je les ai donc commenté (séparation de données supplémentaire et mise en forme).

Si vous avez besoin du fichier avec la base de données complète je peux l'uploader sans problème.

Je vous remercie d'avance pour toute l'aide que vous pourrez m'apporter.

Cordialement,
Cédric Mabileau.
 

Pièces jointes

  • vba doors forum.xlsm
    42.6 KB · Affichages: 33
C

Compte Supprimé 979

Guest
Re : Séparation de lignes grâce à un marqueur

Bonjour Arkh01

Tout d'abord concernant ma version d'Excel ; je développe en 2010 mais l'application est amenée à tourner sur Excel 2000. C'est vieux
Alors moi je te dis GROSSE connerie ... tu ne dois pas développer sur une version plus récente ou tu vas vers de GROS problèmes

A+
 

vmatthieu

XLDnaute Occasionnel
Re : Séparation de lignes grâce à un marqueur

bonsoir,
c'est peut être bête mais si tu testes chaque cellule sur les trois ou quatre premier caractères avec un genre
for variable=1to4
if mid(cellule,variable,1)=" " then
d=d+1
else
end if
next
if d=4 then
supprime la ligne
else
end if

bonne soirée
 

Discussions similaires

Réponses
28
Affichages
925

Statistiques des forums

Discussions
311 735
Messages
2 082 024
Membres
101 873
dernier inscrit
excellllll