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.
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.
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.
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.
>
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" <Colasmar@discussions.microsoft.com> a écrit dans le message de
news: EAD3DB64-7050-4971-9BFB-89B1EC41CE27@microsoft.com...
> 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.
>
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.
>
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.
>
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" <Colasmar@discussions.microsoft.com> a écrit dans le message de
news: EAD3DB64-7050-4971-9BFB-89B1EC41CE27@microsoft.com...
> 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.
>
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.
>
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.
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.
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.