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
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.
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.