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

[2010] VBA - TextToColumns FieldInfo:=

6 réponses
Avatar
Péhemme
Bonjour à Tous,

Dans le cadre d'une association, je souhaite automatiser la présentation
d'une liste de participants.
Cette liste est issue (en C5) d'un copier-coller (à la main) des
destinataires d'un courriel.

Afin de "travailler" le résultat de ce copier-coller, j'ai écrit la macro
suivante qui fonctionne (si des puristes trouvent à la simplifier, ils
seront les bienvenus).

Ma question concerne le tableau de tableaux à passer à la méthode
FieldInfo:= du TextToColumns.
Comment automatiser cette information afin de l'adapter à une liste
évolutive (mon exemple comporte 20 participants, mais ce nombre peut être
variable) ?

À la lecture de l'aide, j'ai bien compris que le premier argument était le
n° de ma colonne de mon tableau et le second 1 du type général.
Mais comment l'automatiser ?
Une boucle sur les colonnes ? Mais je ne vois pas comment l'écrire pour
restituer le tableau final.

Sub ListeDesParticipants()
Dim DerCol As Integer
Dim DerLin As Long

With Application
.ScreenUpdating = False
.CutCopyMode = False
End With

Range("C5").TextToColumns _
Destination:=Range("C10"), _
DataType:=xlDelimited, _
Tab:=False, _
Semicolon:=True, _
Comma:=False, _
Space:=False, _
Other:=False, _
FieldInfo:= _
Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1),
Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10,
1), _
Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1),
Array(15, 1), _
Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1),
Array(20, 1), _
Array(21, 1))

DerCol = Cells(10, Columns.Count).End(xlToLeft).Column

Range(Cells(10, 3), Cells(10, DerCol)).Copy
Range("C15").PasteSpecial _
Paste:=xlPasteAll, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=True
Application.CutCopyMode = False

Selection.TextToColumns _
Destination:=Range("F15"), _
DataType:=xlDelimited, _
Other:=True, OtherChar:="<", _
FieldInfo:= _
Array(Array(1, 1), Array(2, 1))

DerLin = Range("G" & Rows.Count).End(xlUp).Row

Range("G15:G" & DerLin).Replace _
What:=">", Replacement:=""

Range("F15:F" & DerLin).Cut Range("C15")
Application.CutCopyMode = False

Range("C15:C" & DerLin).TextToColumns _
Destination:=Range("C15"), _
DataType:=xlDelimited, _
Space:=True, _
FieldInfo:= _
Array(Array(1, 1), Array(2, 1))

With Application
.ScreenUpdating = True
End With

End Sub

Merci d'avance de votre aide.
Michel

6 réponses

Avatar
Jacquouille
Bonsoir Michel,

Toujours sur le pont ?
On s'accroche ?
Petit coucou en passant.
Mais je suis incapable de te répondre. -((

Jacques.

Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"Péhemme" a écrit dans le message de groupe de discussion :
l17gpr$hjs$

Bonjour à Tous,

Dans le cadre d'une association, je souhaite automatiser la présentation
d'une liste de participants.
...
Merci d'avance de votre aide.
Michel
Avatar
MichD
Bonjour,

Pour la partie "TextToColumns", il s'agit d'indiquer
simplement la première ligne et la dernière ligne que tu veux
traiter. Par exemple, pour traiter les lignes 5 à x

'-----------------------------
With Worksheets("Feuil1") 'Nom de la feuille que tu veux
With .Range("C5:C" & .Range("C65536").End(xlUp).row)
.TextToColumns _
Destination:=Worksheets("Feuil1").Range("C10"), _
DataType:=xlDelimited, _
Tab:úlse, _
Semicolon:=True, _
Comma:úlse, _
Space:úlse, _
Other:úlse, _
FieldInfo:= _
Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1),
Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1),
Array(10, 1), _
Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1),
Array(15, 1), _
Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1),
Array(20, 1), _
Array(21, 1))
End With
End With
'-----------------------------


MichD
---------------------------------------------------------------
"Péhemme" a écrit dans le message de groupe de discussion :
l17gpr$hjs$

Bonjour à Tous,

Dans le cadre d'une association, je souhaite automatiser la présentation
d'une liste de participants.
Cette liste est issue (en C5) d'un copier-coller (à la main) des
destinataires d'un courriel.

Afin de "travailler" le résultat de ce copier-coller, j'ai écrit la macro
suivante qui fonctionne (si des puristes trouvent à la simplifier, ils
seront les bienvenus).

Ma question concerne le tableau de tableaux à passer à la méthode
FieldInfo:= du TextToColumns.
Comment automatiser cette information afin de l'adapter à une liste
évolutive (mon exemple comporte 20 participants, mais ce nombre peut être
variable) ?

À la lecture de l'aide, j'ai bien compris que le premier argument était le
n° de ma colonne de mon tableau et le second 1 du type général.
Mais comment l'automatiser ?
Une boucle sur les colonnes ? Mais je ne vois pas comment l'écrire pour
restituer le tableau final.

Sub ListeDesParticipants()
Dim DerCol As Integer
Dim DerLin As Long

With Application
.ScreenUpdating = False
.CutCopyMode = False
End With

Range("C5").TextToColumns _
Destination:=Range("C10"), _
DataType:=xlDelimited, _
Tab:úlse, _
Semicolon:=True, _
Comma:úlse, _
Space:úlse, _
Other:úlse, _
FieldInfo:= _
Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1),
Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10,
1), _
Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1),
Array(15, 1), _
Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1),
Array(20, 1), _
Array(21, 1))

DerCol = Cells(10, Columns.Count).End(xlToLeft).Column

Range(Cells(10, 3), Cells(10, DerCol)).Copy
Range("C15").PasteSpecial _
Paste:=xlPasteAll, Operation:=xlNone, _
SkipBlanks:úlse, Transpose:=True
Application.CutCopyMode = False

Selection.TextToColumns _
Destination:=Range("F15"), _
DataType:=xlDelimited, _
Other:=True, OtherChar:="<", _
FieldInfo:= _
Array(Array(1, 1), Array(2, 1))

DerLin = Range("G" & Rows.Count).End(xlUp).Row

Range("G15:G" & DerLin).Replace _
What:=">", Replacement:=""

Range("F15:F" & DerLin).Cut Range("C15")
Application.CutCopyMode = False

Range("C15:C" & DerLin).TextToColumns _
Destination:=Range("C15"), _
DataType:=xlDelimited, _
Space:=True, _
FieldInfo:= _
Array(Array(1, 1), Array(2, 1))

With Application
.ScreenUpdating = True
End With

End Sub

Merci d'avance de votre aide.
Michel
Avatar
Péhemme
Merci Denis,

J'ai du mal m'exprimer.
J'ai mes informations à traiter sur une seule ligne.
Mon problème n'est pas au niveau du Range à traiter, mais au niveau du
tableau des tableaux du FieldInfo:= Array(Array(1,1),Array(2,1) etc ...)
Comment, en VBA rendre variable ce tableau en fonction du nombre
d'informations comprises entre, en l'occurrence, les ";" ?

Bien amicalement
Michel


"MichD" a écrit dans le message de groupe de discussion :
l17kp5$t5b$

Bonjour,

Pour la partie "TextToColumns", il s'agit d'indiquer
simplement la première ligne et la dernière ligne que tu veux
traiter. Par exemple, pour traiter les lignes 5 à x

'-----------------------------
With Worksheets("Feuil1") 'Nom de la feuille que tu veux
With .Range("C5:C" & .Range("C65536").End(xlUp).row)
.TextToColumns _
Destination:=Worksheets("Feuil1").Range("C10"), _
DataType:=xlDelimited, _
Tab:úlse, _
Semicolon:=True, _
Comma:úlse, _
Space:úlse, _
Other:úlse, _
FieldInfo:= _
Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1),
Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1),
Array(10, 1), _
Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1),
Array(15, 1), _
Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1),
Array(20, 1), _
Array(21, 1))
End With
End With
'-----------------------------


MichD
---------------------------------------------------------------
"Péhemme" a écrit dans le message de groupe de discussion :
l17gpr$hjs$

Bonjour à Tous,

Dans le cadre d'une association, je souhaite automatiser la présentation
d'une liste de participants.
Cette liste est issue (en C5) d'un copier-coller (à la main) des
destinataires d'un courriel.

Afin de "travailler" le résultat de ce copier-coller, j'ai écrit la macro
suivante qui fonctionne (si des puristes trouvent à la simplifier, ils
seront les bienvenus).

Ma question concerne le tableau de tableaux à passer à la méthode
FieldInfo:= du TextToColumns.
Comment automatiser cette information afin de l'adapter à une liste
évolutive (mon exemple comporte 20 participants, mais ce nombre peut être
variable) ?

À la lecture de l'aide, j'ai bien compris que le premier argument était le
n° de ma colonne de mon tableau et le second 1 du type général.
Mais comment l'automatiser ?
Une boucle sur les colonnes ? Mais je ne vois pas comment l'écrire pour
restituer le tableau final.

Sub ListeDesParticipants()
Dim DerCol As Integer
Dim DerLin As Long

With Application
.ScreenUpdating = False
.CutCopyMode = False
End With

Range("C5").TextToColumns _
Destination:=Range("C10"), _
DataType:=xlDelimited, _
Tab:úlse, _
Semicolon:=True, _
Comma:úlse, _
Space:úlse, _
Other:úlse, _
FieldInfo:= _
Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1),
Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10,
1), _
Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1),
Array(15, 1), _
Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1),
Array(20, 1), _
Array(21, 1))

DerCol = Cells(10, Columns.Count).End(xlToLeft).Column

Range(Cells(10, 3), Cells(10, DerCol)).Copy
Range("C15").PasteSpecial _
Paste:=xlPasteAll, Operation:=xlNone, _
SkipBlanks:úlse, Transpose:=True
Application.CutCopyMode = False

Selection.TextToColumns _
Destination:=Range("F15"), _
DataType:=xlDelimited, _
Other:=True, OtherChar:="<", _
FieldInfo:= _
Array(Array(1, 1), Array(2, 1))

DerLin = Range("G" & Rows.Count).End(xlUp).Row

Range("G15:G" & DerLin).Replace _
What:=">", Replacement:=""

Range("F15:F" & DerLin).Cut Range("C15")
Application.CutCopyMode = False

Range("C15:C" & DerLin).TextToColumns _
Destination:=Range("C15"), _
DataType:=xlDelimited, _
Space:=True, _
FieldInfo:= _
Array(Array(1, 1), Array(2, 1))

With Application
.ScreenUpdating = True
End With

End Sub

Merci d'avance de votre aide.
Michel
Avatar
MichD
| FieldInfo:= Array(Array(1,1),Array(2,1) etc ...)

Il n'y a pas d'ajustement possible pour cette section.
Si à chaque fois la nature des informations et le nombre de champs
sont différents, tu dois refaire la macro et l'adapter à ce que tu veux
faire. Il n'y a pas moyen d'écrire cette section d'une façon générique.
Regarde dans l'aide "TextToColumns", chaque array(x,y) a une signification.

Le x signifie la position du champ dans la chaîne de caractère
le y le type de format de la donnée ou si ce champ doit être distribué
ou non... Lorsque tu utilises l'enregistreur de macro, il utilise tous les
champs, mais tu peux te contenter de définir seulement ceux qui ont
certaines caractéristiques particulières comme les "Dates", les champs
que tu ne veux pas redistribuer... Cependant, tu dois pour ces derniers
définir le paramètre "position" selon la place qu'ils ont dans la chaîne
de caractères(champs) de départ.


MichD
---------------------------------------------------------------
Avatar
isabelle
bonjour Michel,

mets en seulement 1 c'est ben amasse,

FieldInfo:= Array(Array(1, 1))

isabelle

Le 2013-09-16 15:41, Péhemme a écrit :
Merci Denis,

J'ai du mal m'exprimer.
J'ai mes informations à traiter sur une seule ligne.
Mon problème n'est pas au niveau du Range à traiter, mais au niveau du
tableau des tableaux du FieldInfo:= Array(Array(1,1),Array(2,1) etc ...)
Comment, en VBA rendre variable ce tableau en fonction du nombre
d'informations comprises entre, en l'occurrence, les ";" ?

Bien amicalement
Michel
Avatar
Péhemme
Bonjour Isabelle, bonjour Denis,

Malgré mes nombreux séjours à Montréal dans les années 80, je ne connaissais
pas l'expression : "c'est ben amasse".
Grâce à VBA, FieldInfo et Isabelle je viens de l'apprendre :-))
Mille mercis (mille est-ce ben amasse ?) donc à Isabelle pour cette réponse.
Merci également à Denis pour s'être penché sur ma question.
Seul, je n'aurais jamais essayé cette solution.
Merci encore à vous deux pour toute l'aide que vous nous apportez.
Bien amicalement
Michel




"isabelle" a écrit dans le message de groupe de discussion :
l17s6g$i5m$

bonjour Michel,

mets en seulement 1 c'est ben amasse,

FieldInfo:= Array(Array(1, 1))

isabelle

Le 2013-09-16 15:41, Péhemme a écrit :
Merci Denis,

J'ai du mal m'exprimer.
J'ai mes informations à traiter sur une seule ligne.
Mon problème n'est pas au niveau du Range à traiter, mais au niveau du
tableau des tableaux du FieldInfo:= Array(Array(1,1),Array(2,1) etc ...)
Comment, en VBA rendre variable ce tableau en fonction du nombre
d'informations comprises entre, en l'occurrence, les ";" ?

Bien amicalement
Michel