Macro compléter automatiquement cellules selon nombre de caractères donné

pierre31270

XLDnaute Junior
Bonjour,

J'extrais des données depuis Access en *.csv et je souhaiterais les convertir en *.txt. Jusque là tout va bien.
Mon problème est que toutes les lignes du *.txt doivent faire la même longueur soit environ 500 caractères. Etant donné qu'il y a environ une cinquantaine de colonnes pour 500 lignes au minimum, je souhaiterais "automatiser" tout ça.

Y aurait-il une macro, dans ce cas on convertit le *.csv en *.xlsm je suppose, qui puisse permettre de compléter les cellules par un caractère:
-S'il s'agit d'une zone numérique, cellules complétées à gauche par des zéros
-S'il s'agit d'une zone alphanumérique, cellules complétées à droite par des espaces.

sachant que:
- le nombre de caractères par cellules dépend de sa colonne.

Si quelqu'un pouvait me donner des pistes ça serait super sympa:):)

Merci par avance.

Pierre
 

pierre31270

XLDnaute Junior
Re : Macro compléter automatiquement cellules selon nombre de caractères donné

Voila, j'espere que cela pourra aider à titre d'exemple.
J'ai pensé à une fonction concatener et une autre pour tronquer les noms mais rien de vraiment abouti. Si tu as des pistes je suis preneur.
Merci à toi
 

Pièces jointes

  • doc.zip
    762 bytes · Affichages: 121
  • doc.zip
    762 bytes · Affichages: 122
  • doc.zip
    762 bytes · Affichages: 126

mromain

XLDnaute Barbatruc
Re : Macro compléter automatiquement cellules selon nombre de caractères donné

bonjour pierre31270,

il faudrait que tu expliques comment sont générées les infos du fichier texte :
Code:
[B]XXXXXD10041[/B]          DURAND              [B]AVO584962[/B]        avoir 3 durand      [B]2009091020090910D000000000007397EUR111111111[/B]            20091010          PUBLIC       [B]000000000007397FR00111111111[/B]

de plus, je pense que ça serait plus simple de séparer les infos de chaque ligne (du fichier texte) par une tabulation, plutôt que par un nombre (pas constant) d'espaces. est-ce que ça poserait un problème ?

a+
 

pierre31270

XLDnaute Junior
Re : Macro compléter automatiquement cellules selon nombre de caractères donné

et oui c'est là toute la difficulté, chaque ligne doit faire une longueur fixe et il n'y a pas de tabulation possible.
J'ai mis le nombre de caractère que l'on doit retrouver pour chaque info dans les entetes des colonnes du fichier csv.
 

mromain

XLDnaute Barbatruc
Re : Macro compléter automatiquement cellules selon nombre de caractères donné

re-bonjour,

voici une macro (commentée) qui a l'air de fonctionner, du moins pour l'exemple que tu as fait.

-S'il s'agit d'une zone numérique, cellules complétées à gauche par des zéros
-S'il s'agit d'une zone alphanumérique, cellules complétées à droite par des espaces.
c'est pas tout a fait vrai. la deuxième colonne est numérique, mais il faut la compléter avec des espaces après. du coup, dans la macro, plutôt que de faire le test "si la valeur est numérique", j'ai vérifié sa position (son "numéro de colonne") pour préciser quelles données étaient à compléter avec des 0 devant.



Code:
Sub test()
Dim fichierCsv As Object, fichierTexte As Object, myFso As Object
Dim tableauChaines() As String, ligneTexte As String, longueurChamps, i As Integer, tmpStr As String

'définir la longueur imposée de chaque champ
longueurChamps = Array(5, 1, 15, 20, 3, 14, 20, 8, 8, 1, 15, 3, 9, 12, 8, 8, 10, 3, 15, 25, 35)


Set myFso = CreateObject("Scripting.FileSystemObject")

'adapter les chemin des fichiers
Set fichierCsv = myFso.OpenTextFile("E:\aMiki\XLS\test\factures.csv", 1)
Set fichierTexte = myFso.CreateTextFile("E:\aMiki\XLS\test\resultat.txt", True)

'ne pas traiter la première ligne du fichier csv
fichierCsv.ReadLine
'écrire la première ligne du fichier texte
fichierTexte.WriteLine "ENTETE"

'boucler sur toutes les lignes suivantes du fichier csv
While Not fichierCsv.AtEndOfStream
    ligneTexte = ""
    
    'récupérer dans un tableau les éléments de la ligne
    tableauChaines = Split(fichierCsv.ReadLine, ";")
    
    'boucler sur chaque éléments
    For i = LBound(tableauChaines) To UBound(tableauChaines)
    
        'si l'élément est trop long
        If Len(tableauChaines(i)) >= longueurChamps(i) Then
            
            'le tronquer à la longueur voulue
            tmpStr = Left(tableauChaines(i), longueurChamps(i))
        
        'sinon
        Else
            
            ' si on est dans une des 2 colonnes "montant"
            If i = 10 Or i = 18 Then
                
                'enlever le signe - et la virgule
                tmpStr = Replace(Replace(tableauChaines(i), "-", ""), ",", "")
                
                'compléter avec des 0 (avant)
                tmpStr = String(longueurChamps(i) - Len(tmpStr), "0") & tmpStr
            
            'sinon
            Else
                
                'compléter avec des espaces (après)
                tmpStr = tableauChaines(i) & String(longueurChamps(i) - Len(tableauChaines(i)), " ")
            End If
        End If
        
        'ajouter l'élément à la ligne du fichier texte
        ligneTexte = ligneTexte & tmpStr
    Next i
    
    'écrire la ligne dans le fichier texte
    fichierTexte.WriteLine ligneTexte
Wend

'fermer les fichiers et détruire les objets
fichierCsv.Close: fichierTexte.Close
Set fichierCsv = Nothing: Set fichierTexte = Nothing: Set myFso = Nothing
End Sub
a+
 
Dernière édition:

pierre31270

XLDnaute Junior
Re : Macro compléter automatiquement cellules selon nombre de caractères donné

Woaw franchement merci beaucoup ça marche nikel. Comment tu as appris tout ça? ya sans doute pas mal de débrouille mais pourrais-tu me conseiller certains bouquins et/ou sites web s'il te plait?
Encore merci pour ton aide.

A bientot
Pierre
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 611
Messages
2 090 226
Membres
104 453
dernier inscrit
benjiii88