Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Excel vers fichier texte

7 réponses
Avatar
martine.leport
Bonjour,
Je dois transformer un fichier excel en fichier texte avec un nombre de car=
act=C3=A8res bien sp=C3=A9cifique pour chaque colonne.
J'ai cr=C3=A9=C3=A9 cette formule :


Range("AD1").Select
ActiveCell.FormulaR1C1 =3D _
"=3DRC1&REPT("" "",12-LEN(RC1)) &RC2&REPT("" "",20-LEN(RC2))&"" ""=
&RC5&REPT("" "",16) &REPT("" "",8-LEN(RC7))&RC7& REPT("" "",8-LEN(RC8))&RC8=
&REPT("" "",8-LEN(RC9))&RC9 &REPT("" "",8-LEN(RC10))&RC10& RC11&REPT(""0""=
,10-LEN(RC12))&RC12 &RC13&REPT("" "",3-LEN(RC13)) &RC14 &REPT("" "",10) &IF=
(ISBLANK(RC16),"" "",RC16) &RC17&REPT("" "",3-LEN(RC17))&RC18&REPT("" "",17=
-LEN" & "&RC19&IF(ISBLANK(RC20),REPT("" "",10),REPT(""0"",10-LEN(RC20))&RC2=
0)&REPT(""0"",18-LEN(RC21))&RC21"
=20

Mais je pense qu'il doit y avoir certainement quelque chose de plus simple
Quelqu'un aurait-il d=C3=A9j=C3=A0 eu ce genre de prob=C3=A8me =C3=A0 r=C3=
=A9soudre ,

merci pour votre aide

caroual

7 réponses

Avatar
MichD
Bonjour,
Donne des exemples (5) représentatifs du contenu de ces cellules et en même
temps, donne-nous le résultat attendu pour chacun de ces exemples.
Pour la création de ton fichier "texte", est-ce qu'une macro ferait ton
affaire? Si oui, donne l'étendue de la plage de cellules à traiter.
MichD
a écrit dans le message de groupe de discussion :
Bonjour,
Je dois transformer un fichier excel en fichier texte avec un nombre de
caractères bien spécifique pour chaque colonne.
J'ai créé cette formule :
Range("AD1").Select
ActiveCell.FormulaR1C1 = _
"=RC1&REPT("" "",12-LEN(RC1)) &RC2&REPT("" "",20-LEN(RC2))&""
""&RC5&REPT("" "",16) &REPT("" "",8-LEN(RC7))&RC7& REPT(""
"",8-LEN(RC8))&RC8 &REPT("" "",8-LEN(RC9))&RC9 &REPT(""
"",8-LEN(RC10))&RC10& RC11&REPT(""0"",10-LEN(RC12))&RC12 &RC13&REPT(""
"",3-LEN(RC13)) &RC14 &REPT("" "",10) &IF(ISBLANK(RC16),"" "",RC16)
&RC17&REPT("" "",3-LEN(RC17))&RC18&REPT("" "",17-LEN" &
"&RC19&IF(ISBLANK(RC20),REPT(""
"",10),REPT(""0"",10-LEN(RC20))&RC20)&REPT(""0"",18-LEN(RC21))&RC21"
Mais je pense qu'il doit y avoir certainement quelque chose de plus simple
Quelqu'un aurait-il déjà eu ce genre de probème à résoudre ,
merci pour votre aide
caroual
Avatar
MichD
Bonjour,
J'ai créé une macro qui fait ce que tu veux...
Tu dois renseigner 2 valeurs :
A )
Nom de la feuille dans l'expression : With Worksheets("Feuil1")
B )
Spécifier l'étendue de ta plage de cellule dans :
Set Rg = .Range("A1:G10") 'à déterminer
La macro fait :
De la colonne A à G, elle remplace le contenu des cellules seulement
avec le nombre de caractères que tu veux retenir pour chacune des colonnes.
Au besoin, j'aurais pu choisir une autre plage de cellules ou sur une autre
feuille pour inscrire le résultat.
Dans la colonne H, pour chacune des lignes, tu obtiens la concaténation
pour toutes les cellules de chacune des lignes. Au besoin du peux insérer
un "séparateur" entre chacune des valeurs dans cette ligne de code
Rg(R.Row, 1).Offset(, Rg.Columns.Count) = Trim(Join(Arr, ""))
'-------------------------------------------------------------
Sub Test()
Dim A As Long
'Représentant la plage de cellules
Dim Rg As Range 'représentant la plage de cellules
Dim C As Range, R As Range, Cel As Range
Dim L As Long 'Variable représentant la longueur
'de la chaîne de caractères que tu veux obtenir
'dans la colonne.
Dim Arr() 'Variable tableau représentant la longueur
'de chacune des colonnes en partant de la colonne la
'plus à gauche vers la droite
'Longueur pour chacune des colonnes
Arr = Array(2, 5, 6, 8, 1, 8, 3)
Application.EnableEvents = True
Application.ScreenUpdating = True
With Worksheets("Feuil1") 'Nom à déterminer
'Définis la plage de cellules.
Set Rg = .Range("A1:G10") 'à déterminer
End With
'Traitement pour chaque colonne de la plage
For Each C In Rg.Columns
'A sert à titre de compteur
L = Arr(A)
'Transformation du contenu de la colonne selon la longueur retenue
C.TextToColumns Destination:=C, DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(Arr(A), 9)),
TrailingMinusNumbers:=True
A = A + 1
Next
'Pour concaténer le texte de chacune des cellules vers la cellule
'à droite de la dernière cellule occupée de la plage.
A = 0
For Each R In Rg.Rows
Erase Arr
For Each C In R.Columns
For Each Cel In C
A = A + 1
ReDim Preserve Arr(1 To A)
Arr(A) = Cel.Value
Next
Next
'dans cette ligne de code, tu peux remplacer "" en
'Insérant un séparateur de ton choix comme espace " ".
Rg(R.Row, 1).Offset(, Rg.Columns.Count) = Trim(Join(Arr, ""))
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'-------------------------------------------------------------
MichD
Avatar
MichD
C'est la même macro que l'autre, sauf que le résultat s'affiche dans les
mêmes colonnes que la plage originale, mais juste en dessous en laissant une
ligne vide entre les 2 plages de cellules.
En passant, n'oublie pas de définir dans cette variable la longueur de la
chaîne de caractères à retenir pour chacune des colonnes dans cette
expression :
'Longueur pour chacune des colonnes
Arr = Array(2, 5, 6, 8, 1, 8, 3) 'Ce sont des valeurs fictives...
'----------------------------------------------------------------------------
Sub Test1()
Dim A As Long
'Représentant la plage de cellules
Dim Rg As Range 'représentant la plage de cellules
Dim C As Range, R As Range, Cel As Range, Rg1 As Range
Dim L As Long 'Variable représentant la longueur
'de la chaîne de caractères que tu veux obtenir
'dans la colonne.
Dim Arr() 'Variable tableau représentant la longueur
'de chacune des colonnes en partant de la colonne la
'plus à gauche vers la droite
'Longueur pour chacune des colonnes
Arr = Array(2, 5, 6, 8, 1, 8, 3)
Application.EnableEvents = True
Application.ScreenUpdating = True
With Worksheets("Feuil1") 'Nom à déterminer
'Définis la plage de cellules.
Set Rg = .Range("C7:I16") 'à déterminer
End With
'Traitement pour chaque colonne de la plage
For Each C In Rg.Columns
'A sert à titre de compteur
L = Arr(A)
'Transformation du contenu de la colonne selon la longueur retenue
C.TextToColumns Destination:=C.Cells(Rg.Rows.Count + 2, 1),
DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(Arr(A), 9)),
TrailingMinusNumbers:=True
A = A + 1
Next
Set Rg1 = Rg.Offset(Rg.Rows.Count + 1)
'pour concaténer le texte de chacune des cellules vers la cellule
'à droite de la dernière cellule occupée de la plage.
A = 0
For Each R In Rg1.Rows
Erase Arr
For Each C In R.Columns
For Each Cel In C
A = A + 1
ReDim Preserve Arr(1 To A)
Arr(A) = Cel.Value
Next
Next
'Dans cette ligne de code, tu peux remplacer "" en
'Insérant un séparateur de ton choix comme espace " ".
Rg1(R.Row, 1).Offset(, Rg1.Columns.Count) = Trim(Join(Arr, ""))
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'----------------------------------------------------------------------------
MichD
"MichD" a écrit dans le message de groupe de discussion :
orq9gm$80b$
Bonjour,
J'ai créé une macro qui fait ce que tu veux...
Tu dois renseigner 2 valeurs :
A )
Nom de la feuille dans l'expression : With Worksheets("Feuil1")
B )
Spécifier l'étendue de ta plage de cellule dans :
Set Rg = .Range("A1:G10") 'à déterminer
La macro fait :
De la colonne A à G, elle remplace le contenu des cellules seulement
avec le nombre de caractères que tu veux retenir pour chacune des colonnes.
Au besoin, j'aurais pu choisir une autre plage de cellules ou sur une autre
feuille pour inscrire le résultat.
Dans la colonne H, pour chacune des lignes, tu obtiens la concaténation
pour toutes les cellules de chacune des lignes. Au besoin du peux insérer
un "séparateur" entre chacune des valeurs dans cette ligne de code
Rg(R.Row, 1).Offset(, Rg.Columns.Count) = Trim(Join(Arr, ""))
'-------------------------------------------------------------
Sub Test()
Dim A As Long
'Représentant la plage de cellules
Dim Rg As Range 'représentant la plage de cellules
Dim C As Range, R As Range, Cel As Range
Dim L As Long 'Variable représentant la longueur
'de la chaîne de caractères que tu veux obtenir
'dans la colonne.
Dim Arr() 'Variable tableau représentant la longueur
'de chacune des colonnes en partant de la colonne la
'plus à gauche vers la droite
'Longueur pour chacune des colonnes
Arr = Array(2, 5, 6, 8, 1, 8, 3)
Application.EnableEvents = True
Application.ScreenUpdating = True
With Worksheets("Feuil1") 'Nom à déterminer
'Définis la plage de cellules.
Set Rg = .Range("A1:G10") 'à déterminer
End With
'Traitement pour chaque colonne de la plage
For Each C In Rg.Columns
'A sert à titre de compteur
L = Arr(A)
'Transformation du contenu de la colonne selon la longueur retenue
C.TextToColumns Destination:=C, DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(Arr(A), 9)),
TrailingMinusNumbers:=True
A = A + 1
Next
'Pour concaténer le texte de chacune des cellules vers la cellule
'à droite de la dernière cellule occupée de la plage.
A = 0
For Each R In Rg.Rows
Erase Arr
For Each C In R.Columns
For Each Cel In C
A = A + 1
ReDim Preserve Arr(1 To A)
Arr(A) = Cel.Value
Next
Next
'dans cette ligne de code, tu peux remplacer "" en
'Insérant un séparateur de ton choix comme espace " ".
Rg(R.Row, 1).Offset(, Rg.Columns.Count) = Trim(Join(Arr, ""))
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'-------------------------------------------------------------
MichD
Avatar
MichD
Voici les 2 macros. J'ai corrigé une inexactitude.
Déplace le résultat vers une autre plage de cellules en dessous.
'------------------------------------------------------------------------------
Sub Test1()
Dim A As Long, Compteur As Long
'Représentant la plage de cellules
Dim Rg As Range 'Représentant la plage de cellules
Dim C As Range, R As Range, Cel As Range, Rg1 As Range
Dim L As Long 'Variable représentant la longueur
'de la chaîne de caractères que tu veux obtenir
'dans la colonne.
Dim Arr() 'Variable tableau représentant la longueur
'de chacune des colonnes en partant de la colonne la
'plus à gauche vers la droite
'Longueur pour chacune des colonnes
Arr = Array(2, 5, 6, 8, 1, 8, 3)
Application.EnableEvents = True
Application.ScreenUpdating = True
With Worksheets("Feuil1") 'Nom à déterminer
'Définis la plage de cellules.
Set Rg = .Range("C7:I16") 'à déterminer
End With
'Traitement pour chaque colonne de la plage
For Each C In Rg.Columns
'A sert à titre de compteur
L = Arr(A)
'Transformation du contenu de la colonne selon la longeur retenue
C.TextToColumns Destination:=C.Cells(Rg.Rows.Count + 2, 1), _
DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), _
Array(Arr(A), 9)), TrailingMinusNumbers:=True
A = A + 1
Next
Set Rg1 = Rg.Offset(Rg.Rows.Count + 1)
'Pour concaténer le texte de chacune des cellules vers la cellule
'à droite de la dernière cellule occupée de la plage.
A = 0
For Each R In Rg1.Rows
Erase Arr
For Each C In R.Columns
For Each Cel In C
A = A + 1
ReDim Preserve Arr(1 To A)
Arr(A) = Cel.Value
Next
Next
'Dans cette ligne de code, tu peux remplacer "" en
'Insérant un séparateur de ton choix comme espace " ".
sss = Rg1(1, 1).Offset(, Rg1.Columns.Count).Address
Compteur = Compteur + 1
Rg1(Compteur, 1).Offset(, Rg1.Columns.Count) = Trim(Join(Arr, ""))
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'------------------------------------------------------------------------------
'Ne déplace pas les résultats vers une autre plage de cellules.
'------------------------------------------------------------------------------
Sub Test()
Dim A As Long, Compteur As Long
'Représentant la plage de cellules
Dim Rg As Range 'représentant la plage de cellules
Dim C As Range, R As Range, Cel As Range
Dim L As Long 'Variable représentant la longueur
'de la chaîne de caractères que tu veux obtenir
'dans la colonne.
Dim Arr() 'Variable tableau représentant la longueur
'de chacune des colonnes en partant de la colonne la
'plus à gauche vers la droite
'Longueur pour chacune des colonnes
Arr = Array(2, 5, 6, 8, 1, 8, 3)
Application.EnableEvents = True
Application.ScreenUpdating = True
With Worksheets("Feuil1") 'Nom à déterminer
'Définis la plage de cellules.
Set Rg = .Range("A1:G10") 'à déterminer
End With
'Traitement pour chaque colonne de la plage
For Each C In Rg.Columns
'A sert à titre de compteur
L = Arr(A)
'Transformation du contenu de la colonne selon la longueur retenue
C.TextToColumns Destination:=C, DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(Arr(A), 9)),
TrailingMinusNumbers:=True
A = A + 1
Next
'Pour concaténer le texte de chacune des cellules vers la cellule
'à droite de la dernière cellule occupée de la plage.
A = 0
For Each R In Rg.Rows
Erase Arr
For Each C In R.Columns
For Each Cel In C
A = A + 1
ReDim Preserve Arr(1 To A)
Arr(A) = Cel.Value
Next
Next
'dans cette ligne de code, tu peux remplacer "" en
'Insérant un séparateur de ton choix comme espace " ".
Compteur = Compteur + 1
Rg(Compteur, 1).Offset(, Rg.Columns.Count) = Trim(Join(Arr, ""))
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'------------------------------------------------------------------------------
MichD
Avatar
MichD
Et pour compléter, si c'est seulement le résultat qui t'intéresse, en
utilisant la même macro qui recopie les données en dessous, il s'agit
d'ajouter 2 lignes de code pour n'avoir que le résultat dans la colonne de
droite du tableau.
À toi de t'amuser!
'----------------------------------------------------------
Sub Test1()
Dim A As Long, Compteur As Long
'Représentant la plage de cellules
Dim Rg As Range 'Représentant la plage de cellules
Dim C As Range, R As Range, Cel As Range, Rg1 As Range
Dim L As Long 'Variable représentant la longueur
'de la chaîne de caractères que tu veux obtenir
'dans la colonne.
Dim Arr() 'Variable tableau représentant la longueur
'de chacune des colonnes en partant de la colonne la
'plus à gauche vers la droite
'Longueur pour chacune des colonnes
Arr = Array(2, 5, 6, 8, 1, 8, 3)
Application.EnableEvents = True
Application.ScreenUpdating = True
With Worksheets("Feuil1") 'Nom à déterminer
'Définis la plage de cellules.
' Set Rg = .Range("A1:G10") 'à déterminer
Set Rg = .Range("C7:i16") 'à déterminer
End With
'Traitement pour chaque colonne de la plage
For Each C In Rg.Columns
'A sert à titre de compteur
L = Arr(A)
'Transformation du contenu de la colonne selon la longeur retenue
C.TextToColumns Destination:=C.Cells(Rg.Rows.Count + 2, 1), _
DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), _
Array(Arr(A), 9)), TrailingMinusNumbers:=True
A = A + 1
Next
Set Rg1 = Rg.Offset(Rg.Rows.Count + 1)
'Pour concaténer le texte de chacune des cellules vers la cellule
'à droite de la dernière cellule occupée de la plage.
A = 0
For Each R In Rg1.Rows
Erase Arr
For Each C In R.Columns
For Each Cel In C
A = A + 1
ReDim Preserve Arr(1 To A)
Arr(A) = Cel.Value
Next
Next
'Dans cette ligne de code, tu peux remplacer "" en
'Insérant un séparateur de ton choix comme espace " ".
sss = Rg1(1, 1).Offset(, Rg1.Columns.Count).Address
Compteur = Compteur + 1
Rg1(Compteur, 1).Offset(, Rg1.Columns.Count) = Trim(Join(Arr, ""))
Next
Rg1(1, 1).Offset(, Rg1.Columns.Count).Resize(Rg1.Rows.Count).Copy _
Rg(1, 1).Offset(, Rg.Columns.Count)
Rg1.Resize(, Rg1.Columns.Count + 1).Clear
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'----------------------------------------------------------
MichD
Avatar
martine.leport
Le jeudi 12 octobre 2017 16:33:59 UTC+2, a écrit  :
Bonjour,
Je dois transformer un fichier excel en fichier texte avec un nombre de c aractères bien spécifique pour chaque colonne.
J'ai créé cette formule :
Range("AD1").Select
ActiveCell.FormulaR1C1 = _
"=RC1&REPT("" "",12-LEN(RC1)) &RC2&REPT("" "",20-LEN(RC2))&"" ""&RC5&REPT("" "",16) &REPT("" "",8-LEN(RC7))&RC7& REPT("" "",8-LEN(RC8))&R C8 &REPT("" "",8-LEN(RC9))&RC9 &REPT("" "",8-LEN(RC10))&RC10& RC11&REPT(""0 "",10-LEN(RC12))&RC12 &RC13&REPT("" "",3-LEN(RC13)) &RC14 &REPT("" "",10) & IF(ISBLANK(RC16),"" "",RC16) &RC17&REPT("" "",3-LEN(RC17))&RC18&REPT("" "", 17-LEN" & "&RC19&IF(ISBLANK(RC20),REPT("" "",10),REPT(""0"",10-LEN(RC20))&R C20)&REPT(""0"",18-LEN(RC21))&RC21"
Mais je pense qu'il doit y avoir certainement quelque chose de plus simpl e
Quelqu'un aurait-il déjà eu ce genre de probème à r ésoudre ,
merci pour votre aide
caroual

Un énorme merci pour tout ce travail
Je vais appliquer tout cela après l'avoir décortiqué
merci
Caroual
Avatar
MichD
Lorsqu'il est possible d'utiliser une formule comme celle que tu as
développée pour obtenir le résultat désiré, c'est la meilleure approche qui
soit et la plus rapide...on peut toujours s'amuser et élaborer une "longue"
procédure, mais ce ne sera jamais aussi performant qu'une"formule en vba".
MichD