XL 2010 Besoin aide sur Array(Array(a,b),Array(c,d)) de TextToColumns

TooFatBoy

XLDnaute Barbatruc
Bonjour,

J'ai récupéré un fichier Excel dans lequel il y a une macro dont j'ai bien compris le but (séparer nom et prénom d'une colonne en deux colonnes), mais dont je ne pige pas exactement le fonctionnement.

J'ai une plage F13:F38 dont chaque cellule contient, soit rien, soit du texte au format "NOM Prénom".
La macro me permet d'obtenir les noms en colonne F et les prénoms en colonne G.
Pour cela elle utilise l'instruction TextToColumns :
VB:
.Range("F13:F38").TextToColumns Destination:=.Range("F13:F38"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
    Semicolon:=False, Comma:=False, Space:=True, Other:=False, _
    FieldInfo:=Array(Array(1, 2), Array(2, 2)), TrailingMinusNumbers:=True

Même si ça fonctionne parfaitement, je ne suis pas certain que les valeurs dans les Array du FieldInfo soient correctes.

Si j'ai bien compris, Array(x,2) veut dire que le champ en question, une fois extrait de la chaîne originelle, sera traité comme étant du simple texte.
Mais que représente la première valeur de l'Array (ici la valeur "x", dans "Array(x,2)") ???

Je crois comprendre que, si je travaille sur des champs de longueurs fixes (par exemple 5 caractères pour le champ n°1, 3 caractères pour le champ n°2, etc.), alors le "x" est le numéro du caractère de la chaîne originelle à partir duquel ledit champ doit être extrait (et est aussi la limite de fin du champ précédent).
Avec MARTIN Gilbert et SCHMITT Helmut,
Array(Array(0,2),Array(6,2)) doit me donner respectivement
"MARTI" "N Gilbert" et "SCHMI" "TT Helmut".

Or ici je ne travaille pas sur des champs de longueurs fixes, mais sur des champs séparés par une espace (donc de longueurs potentiellement variables).
Le "x" représente-t-il toujours le n° du caractère de la chaîne originelle à partir duquel une espace est cherchée ? (visiblement non...)
Quelle valeurs faudrait-il mettre dans les Array ?

Et question subsidiaire : le FieldInfo est-il ici nécessaire, vu qu'on utilise l'espace comme séparateur et qu'il n'y a qu'une seule et unique espace dans chaque chaîne ?
 
Solution
Re

Voici une petite macro illustrative
(avec en bonus une écriture simplifiée -> macro2b)
VB:
Sub Macro2()
With Range("A1")
    .Value = "Staple 1600 Tableur 01/01/2020"
    .TextToColumns Destination:=Range("A2"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1))
    .TextToColumns Destination:=Range("A3"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 2)...

TooFatBoy

XLDnaute Barbatruc
Ceci n'explique que le second paramètre, que j'avais déjà compris (enfin... je crois ;)), et qui dit quel type de donnée utiliser pour la donnée extraite (date, texte, etc.).

Mais je crois que grâce au texte que tu as mis en gras dans ta réponse précédente, j'ai enfin compris à quoi sert le premier paramètre de l'Array ! :)
 

laurent950

XLDnaute Accro
re,
t = Array(Array(1, 2), Array(2, 2))
ci dessous en Jaune les colonnes et en rouge les constantes
1582053481792.png

' Array(Array(1, 2), Array(2, 2)) / C'est l'équivalent de t soit un tableau de tableau
' soit Array(1, 2) / 1 = Numéro de colonne et 2 la constante soit XlColumnDataType spécifiant comment la colonne est analysée
' soit Array(2, 2) / 2 = Numéro de colonne et 2 la constante soit XlColumnDataType spécifiant comment la colonne est analysée
' est donc comment le résultat doit être obtenu soit en Deux colonnes suivant les constantes
' est C'est un tableau de tableau Array = exemple t (ici)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Voici une petite macro illustrative
(avec en bonus une écriture simplifiée -> macro2b)
VB:
Sub Macro2()
With Range("A1")
    .Value = "Staple 1600 Tableur 01/01/2020"
    .TextToColumns Destination:=Range("A2"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1))
    .TextToColumns Destination:=Range("A3"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 2), Array(3, 4), Array(4, 9))
End With
End Sub
Sub Macro2b()
Dim Ffo1, Ffo2
Ffo1 = Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1))
Ffo2 = Array(Array(1, 1), Array(2, 2), Array(3, 4), Array(4, 9))
With Range("A1")
    .Value = "Staple 1600 Tableur 01/01/2020"
    .TextToColumns Destination:=Range("A2"), DataType:=xlDelimited, Space:=True, FieldInfo:=Ffo1
    .TextToColumns Destination:=Range("A3"), DataType:=xlDelimited, Space:=True, FieldInfo:=Ffo2
End With
End Sub
 

TooFatBoy

XLDnaute Barbatruc
La différence entre 4 et 9 est... subtile.

9 ignore la donnée de la colonne.
4 ignore l'analyse de la donnée de la colonne.

C'est bien ça ?



Vous confirmez aussi que la colonne du milieu de ce tableau est complètement vérolée ?
Il faut bien lire respectivement : 4, 7, 10, 0 ou 1, 3, 6, 4 ou 9, 2, 8, 5 ?
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Cette page aussi je l'avais lue avant de venir poser ma question. ;)
Et j'avais interpréter la colonne du milieu comme je l'ai décrit dans ma réponse précédente.
Je suppose que j'ai bon sur ce coup-là, et que c'est la page de Microsoft qui affiche n'importe quoi. ;)


Donc, par rapport à ma réponse #20, 4 et 9 ont bien le fonctionnement que j'indique ? et la colonne "Valeur" doit bien être lue comme je l'indique ???
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

C'est plus un problème de traduction automatique (en français)
Mais comme proposé dans un de mes messages précédents, tu peux reproduire ce que j'ai fait: tester toutes les options en laissant tourner l'enregistreur de macros.
C'est ce que j'ai commencé à faire pour obtenir la macro2.
 

Staple1600

XLDnaute Barbatruc
Re

Exemple 1:
J'ai deux mots dans une cellule séparés par un espace.
Ici j'ai converti, sans rien cocher.
VB:
Sub Macro3()
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
End Sub
Je te laisse faire la suite des tests (si le coeur t'en dit)
 
Dernière édition:

laurent950

XLDnaute Accro
Re,
Bonsoir Staple1600,
Les Arrays c'est pas mal j'ai fait cela : suivant votre exemple, les codes pour les constantes c'est pas très intuitifs quand même est cette fonction "TextToColumns" est déjà assez complexe en soit

VB:
Sub Macro2bis()
Dim t(0) As Variant
t(0) = Array(Array([{1, 1}], [{2, 1}], [{3, 1}], [{4, 1}]), Array([{1, 1}], [{2, 2}], [{3, 4}], [{4, 9}]))

With Range("A1")
    .Value = "Staple 1600 Tableur 01/01/2020"
    .TextToColumns Destination:=Range("A2"), DataType:=xlDelimited, Space:=True, FieldInfo:=t(0)(0)
    .TextToColumns Destination:=Range("A3"), DataType:=xlDelimited, Space:=True, FieldInfo:=t(0)(1)
End With
End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 724
Messages
2 081 936
Membres
101 844
dernier inscrit
pktla