Macro extraction données d'une cellule avec renvoi de ligne

Bonjour,

Après avoir parcouru le forum et n'ayant pas trouvé ce que je cherche exactement, je sollicite votre aide pour le problème suivant :

J'ai un fichier (en PJ) dans lequel je reçois des données dans la cellule A2, mais ces données sont dans une seule cellule avec des renvois de ligne.

Je souhaite, par le biais d'une macro, décomposer les données de cette cellule A1, comme présenté dans la colonne B du fichier. Mais mes connaissances dans le domaine VBA sont assez limitées...

De plus, Le nombre de lignes dans la cellule A2 n'est pas fixe, et la macro doit donc être adaptée pour prendre en compte cette variable.

Merci d'avance si vous arrivez à m'aider sur ce problème. Et si jamais vous avez le détail explicite de la macro utilisée, je ne dis pas non (pour ma culture personnelle dans le domaine !).

Sur ce, bon réveillon à toutes et tous, et à l'année prochaine ! (ou avant, je ne dis pas non !)

8classeur1.xlsx (8.22 Ko)

Salut,

Un essai en pièce jointe.

Pour ce qui est de la macro, pose les questions que tu souhaites. Sans connaitre tes capacités à ce niveau, c'est dur d'expliquer un code sans en dire trop ou pas assez.

Cordialement.

9classeur-v1.xlsm (22.22 Ko)

Bonjour

Sub test1()
  Dim s As String
  Dim tbS As Variant
  s = Cells(2, 1).Value ' Récupère la valeur de la cellule A2
  tbS = Split(s, vbLf) ' Transforme la chaine de caractères en tableau avec comme séparateur le code du retour ligne
  tbS = Application.Transpose(tbS)
  Range("C2").Resize(UBound(tbS)) = tbS 'Ecrit le tableau sur la feuille

End Sub
2classeur1.xlsm (13.51 Ko)

Bonjour à tous

Plutôt que du VBA

  • soit formules, (lourding)
  • soit 4 clics avec PowerQuery totalement intégré à Excel, actualisable à volonté

bonjour Yvouille

Je voudrais comprendre !

Pourquoi le "-1" dans ton code ?

Tableau_spécial_Split = Split(Range("A2"), Chr(10), -1)

cela revient-il au même de ne pas déterminer le nombre maximal de sous chaînes ? (il me semble que oui)

et ensuite le délimiteur que tu as choisi est l'espace "Chr(10)", comment savais tu que ce délimiteur était bien lui et non pas "," ou ";" ou ... ?

Bien cordialement

Jacky

@Yvouille, merci beaucoup pour ton retour, c'est vraiment ce qu'il me fallait ! Et pour l'explication de la macro, c'était pour savoir comment fonctionnait cette macro et à quoi servait chaque ligne qui la compose (un peu comme ce qu'à fait @yal_excel plus haut sur la sienne).

@yal_excel, merci également pour ta macro, je vais l'essayer de ce pas !

@78chris, merci de l'astuce, mais le but est de pouvoir reproduire cela à plus grande échelle et rapidement, de plus je réalise plusieurs macros sur les données en question. En ajouter une est donc pour moi la meilleure solution !

Bonjour tout le monde,

Afin de répondre partiellement aux questions posées :

Voici quelques explications si l'on compare la macro de Yal et la mienne :

Je charge mon tableau en une seule ligne

Tableau_spécial_Split = Split(Range("A2"), Chr(10), -1)

Alors que Yal le fait sur deux lignes

s = Cells(2, 1).Value
tbS = Split(s, vbLf)

Selon moi il serait possible de remplacer les deux lignes ci-dessus par :

tbS = Split(Cells(2, 1).Value , vbLf)

Lui utilise le séparateur vbLf alors que j'utilise Chr(10). Se sont deux systèmes possibles et aux résultats identiques, à utiliser selon ses préférences et ses habitudes. Même remarque - dans cette utilisation-ci -pour Range() ou Cells().

Yal utiliser une méthode bien plus rapide afin de reporter les données sur la feuille :

tbS = Application.Transpose(tbS)
Range("C2").Resize(UBound(tbS)) = tbS

alors que je passe par une boucle For/Next fastidieuse. Mais c'est la dernière fois que je l'ai fait, puisque j'ai appris aujourd'hui une méthode plus simple : merci Yal

Selon moi l'effacement des anciennes données est utile car si la deuxième série contient moins de données que la première, certaines données non souhaitées vont rester en place !

@ Jacky

Si tu places le curseur sur le mot ''Split'' dans la ligne que tu as mise en évidence dans ta réponse et que tu tappes F1, tu obtiens l'aide Excel - excellente - qui t'indique ceci :

image

Merci Yvouille et joyeux réveillon

Jacky

RE

@78chris, merci de l'astuce, mais le but est de pouvoir reproduire cela à plus grande échelle et rapidement, de plus je réalise plusieurs macros sur les données en question. En ajouter une est donc pour moi la meilleure solution !

Pour info : PowerQuery estsouvent plus rapide que VBA et remplace de plus en plus VBA.

VBA gère le modèle objet PowerQuery...

Merci à tous pour vos éclaircissements et votre temps !

Ayant trouvé réponse, je note le topic comme résolu.

Bon réveillon à tous et très certainement à l'année prochaine avec plein d'autres questions !

En effet Yvouille on peut même être encore plus synthétique :

Sub test1()
  Range("C2").Resize(UBound(Application.Transpose(Split(Cells(2, 1).Value, vbLf)))) = Application.Transpose(Split(Cells(2, 1).Value, vbLf))
End Sub

Mais je crains que cela ne soit totalement incompréhensible pour un débutant.

La méthode de transfert des données viens du site de Jacques Boisgontier. Une mine d'or quand on veut faire du VBA. Donc merci à lui.

En effet il est prudent d'effacer les anciennes données.

Rechercher des sujets similaires à "macro extraction donnees renvoi ligne"