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

Execl : transformer une cellule de plusieurs lignes de texte

4 réponses
Avatar
Colasmar
Bonjour,
J'ai besoin de faire une macro un peu compliquée qui réaliserait le travail
suivant :

Dans une base de données Excel, pour un enregistrement donnée, l'une des
cellules peut contenir plusieurs lignes d'information (en fait, il y a une
liste de personne dans la cellule).
Je voudrais donc que la macro
1) identifie combien il y a de personnes saisies dans la cellule
(actuellement elles sont saisie avec un retour chariot (chr(13)) après chaque
nom)
2) Qu'elle recopie l'enregistrement autant de fois qu'il y a de personnes
3) Et naturellement, que pour chaque enregistrement il ne reste qu'une
personne différente dans la cellule

Comme vous pouvez vous en douter, il s'agit d'une base qui permettra ensuite
par fusion avec Word de convoquer chaque personne à la réunion. Evidement
certain pourrait penser qu'il vaudrait mieux tout de suite créer un
enregistrement par personne mais cela ferait alors une base beaucoup trop
lourde et pour ceux qui préfererait me conseiller Access et bien nous n'y
avons pas droit dans la sociéte.

Voilà, je ne suis pas un as en Visual Basic et donc j'ai beau chercher je ne
m'y retrouve pas. Peut être est-ce trop compliqué, mais si quelqu'un a été
confronté à ce problème et qu'il a la soilution et bien cela me ferait bien
gagner du temps.
Merci à tous.

4 réponses

Avatar
Hervé
Bonsoir,
A mettre dans un module standard et à exécuter seulement après avoir
effectué un copier-coller de la ligne 1 (noms des champs) de la base de
données vers la feuille réceptrice et après avoir adapté les noms des
feuilles dans le code. De toutes manières, tester sur une copie du classeur
pour voir le résultat. Le caractère de saut de ligne (Chr(10) ) est obtenu
avec la combinaison {Alt+Entrée}, si tu as fait un saut de ligne avec une
autre combinaison (que je ne connais pas :o(( ) il te faudra tester pour
trouver lequel avec la fonction Chr() :

Sub Recup()
Dim Fe1 As Worksheet
Dim Fe2 As Worksheet
Dim Plage As Range
Dim Cel As Range
Dim Tbl
Dim I As Integer, J As Integer
Dim Ligne As Long
Dim Colonne As Integer

'Adapte les noms de feuilles
'Fe1 = Base de données
Set Fe1 = Worksheets("Feuil1")
'Fe2 = feuille réceptrice des valeurs
Set Fe2 = Worksheets("Feuil2")

'suppose que les données commencent
'en A2(la 1ère ligne étant normalement
'les noms de champs) et que les noms
'à trier se trouvent dans la colonne A
With Fe1
Set Plage = .Range(.[A2], .[A65536].End(3))
End With

'défini le nombre de champs
'(cherche la dernière colonne
'non vide dans la 1ère ligne qui est, comme dit
'plus haut les noms de champs)
Colonne = Fe1.[IV1].End(1).Column

'balaye
For Each Cel In Plage
'cherche le caractère Chr(10) (combinaison {Alt+Entrée})
If InStr(Cel, Chr(10)) <> 0 Then
'réparti les noms dans un tableau
Tbl = Split(Cel, Chr(10))
For I = 0 To UBound(Tbl)
'recherche la ligne vide suivante de la feuille
'réceptrice (la 1ère ligne doit déjà comporter
'les noms de champs identique à la base, Copier-Coller de la 1ère
ligne)
Ligne = Fe2.[A65536].End(3).Offset(1, 0).Row
'inscrit le nom
Fe2.Range("A" & Ligne) = Tbl(I)
'puis les différentes valeurs dans les colonnes adjacentes
For J = 1 To Colonne
Fe2.Range("A" & Ligne).Offset(0, J) = Cel.Offset(0, J)
Next J
Next I
'si pas de caractère de saut de ligne (donc nom unique)
Else
Ligne = Fe2.[A65536].End(3).Offset(1, 0).Row
'inscrit le nom
Fe2.Range("A" & Ligne) = Cel
'idem que ci-dessus
For J = 1 To Colonne
Fe2.Range("A" & Ligne).Offset(0, J) = Cel.Offset(0, J)
Next J
End If
Next Cel

Set Cel = Nothing
Set Plage = Nothing
End Sub

Hervé.

"Colasmar" a écrit dans le message de
news:
Bonjour,
J'ai besoin de faire une macro un peu compliquée qui réaliserait le
travail
suivant :

Dans une base de données Excel, pour un enregistrement donnée, l'une des
cellules peut contenir plusieurs lignes d'information (en fait, il y a une
liste de personne dans la cellule).
Je voudrais donc que la macro
1) identifie combien il y a de personnes saisies dans la cellule
(actuellement elles sont saisie avec un retour chariot (chr(13)) après
chaque
nom)
2) Qu'elle recopie l'enregistrement autant de fois qu'il y a de personnes
3) Et naturellement, que pour chaque enregistrement il ne reste qu'une
personne différente dans la cellule

Comme vous pouvez vous en douter, il s'agit d'une base qui permettra
ensuite
par fusion avec Word de convoquer chaque personne à la réunion. Evidement
certain pourrait penser qu'il vaudrait mieux tout de suite créer un
enregistrement par personne mais cela ferait alors une base beaucoup trop
lourde et pour ceux qui préfererait me conseiller Access et bien nous n'y
avons pas droit dans la sociéte.

Voilà, je ne suis pas un as en Visual Basic et donc j'ai beau chercher je
ne
m'y retrouve pas. Peut être est-ce trop compliqué, mais si quelqu'un a été
confronté à ce problème et qu'il a la soilution et bien cela me ferait
bien
gagner du temps.
Merci à tous.



Avatar
Colasmar
Merci Hervé,
Je vais tester cela. Dans tous les cas ta macro enrichit ma réflexion et mes
connaissances.
Donc merci encore pour le temps gagné.

"Hervé" a écrit :

Bonsoir,
A mettre dans un module standard et à exécuter seulement après avoir
effectué un copier-coller de la ligne 1 (noms des champs) de la base de
données vers la feuille réceptrice et après avoir adapté les noms des
feuilles dans le code. De toutes manières, tester sur une copie du classeur
pour voir le résultat. Le caractère de saut de ligne (Chr(10) ) est obtenu
avec la combinaison {Alt+Entrée}, si tu as fait un saut de ligne avec une
autre combinaison (que je ne connais pas :o(( ) il te faudra tester pour
trouver lequel avec la fonction Chr() :

Sub Recup()
Dim Fe1 As Worksheet
Dim Fe2 As Worksheet
Dim Plage As Range
Dim Cel As Range
Dim Tbl
Dim I As Integer, J As Integer
Dim Ligne As Long
Dim Colonne As Integer

'Adapte les noms de feuilles
'Fe1 = Base de données
Set Fe1 = Worksheets("Feuil1")
'Fe2 = feuille réceptrice des valeurs
Set Fe2 = Worksheets("Feuil2")

'suppose que les données commencent
'en A2(la 1ère ligne étant normalement
'les noms de champs) et que les noms
'à trier se trouvent dans la colonne A
With Fe1
Set Plage = .Range(.[A2], .[A65536].End(3))
End With

'défini le nombre de champs
'(cherche la dernière colonne
'non vide dans la 1ère ligne qui est, comme dit
'plus haut les noms de champs)
Colonne = Fe1.[IV1].End(1).Column

'balaye
For Each Cel In Plage
'cherche le caractère Chr(10) (combinaison {Alt+Entrée})
If InStr(Cel, Chr(10)) <> 0 Then
'réparti les noms dans un tableau
Tbl = Split(Cel, Chr(10))
For I = 0 To UBound(Tbl)
'recherche la ligne vide suivante de la feuille
'réceptrice (la 1ère ligne doit déjà comporter
'les noms de champs identique à la base, Copier-Coller de la 1ère
ligne)
Ligne = Fe2.[A65536].End(3).Offset(1, 0).Row
'inscrit le nom
Fe2.Range("A" & Ligne) = Tbl(I)
'puis les différentes valeurs dans les colonnes adjacentes
For J = 1 To Colonne
Fe2.Range("A" & Ligne).Offset(0, J) = Cel.Offset(0, J)
Next J
Next I
'si pas de caractère de saut de ligne (donc nom unique)
Else
Ligne = Fe2.[A65536].End(3).Offset(1, 0).Row
'inscrit le nom
Fe2.Range("A" & Ligne) = Cel
'idem que ci-dessus
For J = 1 To Colonne
Fe2.Range("A" & Ligne).Offset(0, J) = Cel.Offset(0, J)
Next J
End If
Next Cel

Set Cel = Nothing
Set Plage = Nothing
End Sub

Hervé.

"Colasmar" a écrit dans le message de
news:
> Bonjour,
> J'ai besoin de faire une macro un peu compliquée qui réaliserait le
> travail
> suivant :
>
> Dans une base de données Excel, pour un enregistrement donnée, l'une des
> cellules peut contenir plusieurs lignes d'information (en fait, il y a une
> liste de personne dans la cellule).
> Je voudrais donc que la macro
> 1) identifie combien il y a de personnes saisies dans la cellule
> (actuellement elles sont saisie avec un retour chariot (chr(13)) après
> chaque
> nom)
> 2) Qu'elle recopie l'enregistrement autant de fois qu'il y a de personnes
> 3) Et naturellement, que pour chaque enregistrement il ne reste qu'une
> personne différente dans la cellule
>
> Comme vous pouvez vous en douter, il s'agit d'une base qui permettra
> ensuite
> par fusion avec Word de convoquer chaque personne à la réunion. Evidement
> certain pourrait penser qu'il vaudrait mieux tout de suite créer un
> enregistrement par personne mais cela ferait alors une base beaucoup trop
> lourde et pour ceux qui préfererait me conseiller Access et bien nous n'y
> avons pas droit dans la sociéte.
>
> Voilà, je ne suis pas un as en Visual Basic et donc j'ai beau chercher je
> ne
> m'y retrouve pas. Peut être est-ce trop compliqué, mais si quelqu'un a été
> confronté à ce problème et qu'il a la soilution et bien cela me ferait
> bien
> gagner du temps.
> Merci à tous.
>





Avatar
Colasmar
Vraiement trop génial.
Ca marche et je suis même arrivé à le faire avec ma colonne au milieu du
tableau.
J'ai beaucoup appris avec cette macro.
Merci beaucoup Hervé.
Hubert

"Hervé" a écrit :

Bonsoir,
A mettre dans un module standard et à exécuter seulement après avoir
effectué un copier-coller de la ligne 1 (noms des champs) de la base de
données vers la feuille réceptrice et après avoir adapté les noms des
feuilles dans le code. De toutes manières, tester sur une copie du classeur
pour voir le résultat. Le caractère de saut de ligne (Chr(10) ) est obtenu
avec la combinaison {Alt+Entrée}, si tu as fait un saut de ligne avec une
autre combinaison (que je ne connais pas :o(( ) il te faudra tester pour
trouver lequel avec la fonction Chr() :

Sub Recup()
Dim Fe1 As Worksheet
Dim Fe2 As Worksheet
Dim Plage As Range
Dim Cel As Range
Dim Tbl
Dim I As Integer, J As Integer
Dim Ligne As Long
Dim Colonne As Integer

'Adapte les noms de feuilles
'Fe1 = Base de données
Set Fe1 = Worksheets("Feuil1")
'Fe2 = feuille réceptrice des valeurs
Set Fe2 = Worksheets("Feuil2")

'suppose que les données commencent
'en A2(la 1ère ligne étant normalement
'les noms de champs) et que les noms
'à trier se trouvent dans la colonne A
With Fe1
Set Plage = .Range(.[A2], .[A65536].End(3))
End With

'défini le nombre de champs
'(cherche la dernière colonne
'non vide dans la 1ère ligne qui est, comme dit
'plus haut les noms de champs)
Colonne = Fe1.[IV1].End(1).Column

'balaye
For Each Cel In Plage
'cherche le caractère Chr(10) (combinaison {Alt+Entrée})
If InStr(Cel, Chr(10)) <> 0 Then
'réparti les noms dans un tableau
Tbl = Split(Cel, Chr(10))
For I = 0 To UBound(Tbl)
'recherche la ligne vide suivante de la feuille
'réceptrice (la 1ère ligne doit déjà comporter
'les noms de champs identique à la base, Copier-Coller de la 1ère
ligne)
Ligne = Fe2.[A65536].End(3).Offset(1, 0).Row
'inscrit le nom
Fe2.Range("A" & Ligne) = Tbl(I)
'puis les différentes valeurs dans les colonnes adjacentes
For J = 1 To Colonne
Fe2.Range("A" & Ligne).Offset(0, J) = Cel.Offset(0, J)
Next J
Next I
'si pas de caractère de saut de ligne (donc nom unique)
Else
Ligne = Fe2.[A65536].End(3).Offset(1, 0).Row
'inscrit le nom
Fe2.Range("A" & Ligne) = Cel
'idem que ci-dessus
For J = 1 To Colonne
Fe2.Range("A" & Ligne).Offset(0, J) = Cel.Offset(0, J)
Next J
End If
Next Cel

Set Cel = Nothing
Set Plage = Nothing
End Sub

Hervé.

"Colasmar" a écrit dans le message de
news:
> Bonjour,
> J'ai besoin de faire une macro un peu compliquée qui réaliserait le
> travail
> suivant :
>
> Dans une base de données Excel, pour un enregistrement donnée, l'une des
> cellules peut contenir plusieurs lignes d'information (en fait, il y a une
> liste de personne dans la cellule).
> Je voudrais donc que la macro
> 1) identifie combien il y a de personnes saisies dans la cellule
> (actuellement elles sont saisie avec un retour chariot (chr(13)) après
> chaque
> nom)
> 2) Qu'elle recopie l'enregistrement autant de fois qu'il y a de personnes
> 3) Et naturellement, que pour chaque enregistrement il ne reste qu'une
> personne différente dans la cellule
>
> Comme vous pouvez vous en douter, il s'agit d'une base qui permettra
> ensuite
> par fusion avec Word de convoquer chaque personne à la réunion. Evidement
> certain pourrait penser qu'il vaudrait mieux tout de suite créer un
> enregistrement par personne mais cela ferait alors une base beaucoup trop
> lourde et pour ceux qui préfererait me conseiller Access et bien nous n'y
> avons pas droit dans la sociéte.
>
> Voilà, je ne suis pas un as en Visual Basic et donc j'ai beau chercher je
> ne
> m'y retrouve pas. Peut être est-ce trop compliqué, mais si quelqu'un a été
> confronté à ce problème et qu'il a la soilution et bien cela me ferait
> bien
> gagner du temps.
> Merci à tous.
>





Avatar
fabbrossier
Le vendredi 27 Janvier 2006 à 18:15 par Colasmar :
Bonjour,
J'ai besoin de faire une macro un peu compliquée qui réaliserait
le travail
suivant :

Dans une base de données Excel, pour un enregistrement donnée,
l'une des
cellules peut contenir plusieurs lignes d'information (en fait, il y a une
liste de personne dans la cellule).
Je voudrais donc que la macro
1) identifie combien il y a de personnes saisies dans la cellule
(actuellement elles sont saisie avec un retour chariot (chr(13)) après
chaque
nom)
2) Qu'elle recopie l'enregistrement autant de fois qu'il y a de personnes
3) Et naturellement, que pour chaque enregistrement il ne reste qu'une
personne différente dans la cellule

Comme vous pouvez vous en douter, il s'agit d'une base qui permettra ensuite
par fusion avec Word de convoquer chaque personne à la réunion.
Evidement
certain pourrait penser qu'il vaudrait mieux tout de suite créer un
enregistrement par personne mais cela ferait alors une base beaucoup trop
lourde et pour ceux qui préfererait me conseiller Access et bien nous
n'y
avons pas droit dans la sociéte.

Voilà, je ne suis pas un as en Visual Basic et donc j'ai beau chercher
je ne
m'y retrouve pas. Peut être est-ce trop compliqué, mais si
quelqu'un a été
confronté à ce problème et qu'il a la soilution et bien
cela me ferait bien
gagner du temps.
Merci à tous.


Nom carte Ref Carte

Carte A AAAAAA-D
Carte B BBBBBB-D

Carte C CCCCCC-D
Carte D DDDDDD-D
Carte F FFFFFFF-A



Ca me separe la premiere colonnemais pas la deuxieme :

Nom carte Ref Carte

Carte A AAAAAA-D
....... BBBBBB-D

....... AAAAAA-D
Carte B BBBBBB-D

Carte C CCCCCC-D
....... DDDDDD-D
....... FFFFFFF-A

....... CCCCCC-D
Carte D DDDDDD-D
....... FFFFFFF-A

....... CCCCCC-D
....... DDDDDD-D
Carte F FFFFFFF-A





je voudrais ca moi

Nom carte Ref Carte

Carte A AAAAAA-D

Carte B BBBBBB-D

Carte C CCCCCC-D

Carte D DDDDDD-D

Carte F FFFFFFF-A

pouvez vous m'aider?