Trouver/concaténer des cellules entre 2 cellules prédéfinies
Bonjour,
j'ai besoin de votre aide !!! Tout d'abord, je dois vous avouer que je ne connais pas trop excel...
Voilà, j'ai un fichier avec toutes mes données en colonne A, un peu dans cette idée là:
x
y
z
début
a
b
c
fin
s
z
J'aimerais avoir une formule pour parcourir cette colonne et récupérer les cellules comprises entre la cellule qui contient "début" et celle qui contient "fin", et concaténer ces cellules dans une seule cellule, dans une autre colonne et si possible avec un espace entre chaque donnée.
Je ne sais pas si c'est très clair....
Je ne peux pas fournir le fichier parce que c'est un fichier du boulot.
Merci pour votre aide.
bonsoir et bienvenue,
une proposition avec une fonction personnalisée.
après avoir copier le code ci-dessous dans un module vba tu auras à ta disposition la fonction concatborne(range,start,stop)
où range est une sélection de cellules (une seule colonne) dans laquelle doit se faire la recherche
où start est le mot qui détermine le début de la concaténation
où stop est le mot qui détermine la fin de la concaténation
exemple d'appel
=concatborne(A1:A20,"début","fin")
pour copier le code dans ton classeur
1) selectionner le code sur le forum (tout sélectionner)
2) copier avec ctrl-V
3) aller dans excel
4) alt-F11 pour activer l'editeur vba
5) menu>insérer->module
6) coller le code CTRL-V
7) alt-F11 pour retour dans les feuilles excel
8) la fonction concatborne devrait être disponible
Function concatborne(r As Range, m1 As String, m2 As String) As String
nl = r.Rows.Count
i = 1
For i = 1 To nl
If r.Cells(i, 1) = m1 And fd = False Then
fd = True
ElseIf r.Cells(i, 1) = m2 Then
Exit For
ElseIf fd = True Then
st = st & sep & r.Cells(i, 1)
If sep = "" Then sep = " "
End If
Next i
concatborne = st
End FunctionBonsoir,
merci beaucoup pour votre réponse.
J'ai testé et j'ai un message: "Erreur de compilation. Nom ambigu détecté: concatborne
J'ai du faire une mauvaise manip ou j'ai oublié de faire quelque chose....
pouvez-vous encore m'aider svp ?
bonsoir,
sort de ton document et sauves-en une copie au format xlsx (sans macro)
ferme excel
ouvre excel
ouvre ta copie au format xlsx
recommence l'opération
pour copier le code dans ton classeur
1) selectionner le code sur le forum (tout sélectionner)
2) copier avec ctrl-V
3) aller dans excel
4) alt-F11 pour activer l'editeur vba
5) menu>insérer->module
6) coller le code CTRL-V
7) alt-F11 pour retour dans les feuilles excel
8) la fonction concatborne devrait être disponible
Function concatborne(r As Range, m1 As String, m2 As String) As String
nl = r.Rows.Count
i = 1
For i = 1 To nl
If r.Cells(i, 1) = m1 And fd = False Then
fd = True
ElseIf r.Cells(i, 1) = m2 Then
Exit For
ElseIf fd = True Then
st = st & sep & r.Cells(i, 1)
If sep = "" Then sep = " "
End If
Next i
concatborne = st
End Functionbonjour,
merci, merci, merci !!!!!!!
c'est exactement le résultat souhaitée !!!!!!!
par contre, si je peux abuser encore un peu....
en fait, dans le fichier, j'ai toutes mes données dans la colonne A et j'ai énormément de lignes. Et la "séquence" se répète plusieurs fois dans la colonne A.
Quand j'utilise la fonction, je sélectionne toute la colonne A =concatborne(A:A;"Début";"Fin") et si je tire la fonction sur les lignes du dessous, elles me renvoient toutes le 1er résultat trouvé.
En fait, il faudrait que ça donne:
Données
z
e
Début
a
b
c
Fin
r
t
Début
aaa
bbb
fin
x
Résultat attendu dans une autre colonne
a b c
aaa bbb
Si vous avez encore une super idée......
mais sinon, encore merci pour la fonction concatborne !!!!
Bonjour,
je pense qu'une macro sera plus efficace
pour copier la macro, même procédure que pour la fonction
une fois copiée dans un module, lancer la macro via alt-f8
Sub ekb()
Application.ScreenUpdating = False
' paramètres à modifier éventuellement
m1 = UCase("Début")
m2 = UCase("Fin")
colonne = "A"
colonnedest = "B"
' fin des paramètres à modifier
i = 1
j = 0
While Cells(i, colonne) <> ""
If UCase(Cells(i, colonne)) = m1 And fd = False Then
fd = True
ElseIf UCase(Cells(i, colonne)) = m2 Then
If st <> "" Then
j = j + 1
Cells(j, colonnedest) = st
st = ""
sep = ""
End If
fd = False
ElseIf fd = True Then
st = st & sep & Cells(i, colonne)
If sep = "" Then sep = " "
End If
i = i + 1
Wend
Application.ScreenUpdating = True
End Subsi tu veux garder l'idée d'une fonction personnalisée
voici la fonction adaptée j'y ai ajouté un nouveau paramètre
concatborne(range,start,stop,occurrence)
appeler la fonction de la manière suivante
=concatborne(a:a,;début";"fin";1)
=concatborne(a:a;"début";"fin";2)
si tu veux pouvoir copier la formule en la tirant vers le bas, mets dans une cellule en ligne 1
=concatborne(a:a;"début";"fin";ligne())
Function concatborne(r As Range, m1 As String, m2 As String, occ As Integer) As String
m1 = UCase(m1)
m2 = UCase(m2)
nl = r.Rows.Count
i = 1
j = 0
For i = 1 To nl
If r.Cells(i, 1) = "" Then Exit For
If UCase(r.Cells(i, 1)) = m1 And fd = False Then
fd = True
ElseIf UCase(r.Cells(i, 1)) = m2 Then
fd = False
If st <> "" Then
j = j + 1
If j = occ Then Exit For
st = ""
sep = ""
End If
ElseIf fd = True Then
st = st & sep & r.Cells(i, 1)
If sep = "" Then sep = " "
End If
Next i
If fd = False And st <> "" Then concatborne = st
End FunctionBonjour,
mille fois merci !!!!!
c'est exactement ce que je voulais.
vous venez de me faire gagner un temps considérable.