Macro pour Concaténer et Transposer
Bonjour à tous,
J’ai besoin de créer une macro pour me simplifier la tâche, au vu du nombre de d’éléments à traiter dans ma BDD.
Fichier d’exemple en PJ, j’utilise un Excel 2010 anglais
Le fichier ne contient qu’une quarantaine de lignes, au lieu des plus de 3000 qui sont dans le véritable fichier.
J’ai besoin de transposer et concaténer plusieurs cellules de la même colonne, en une cellule dans la colonne voisine.
J’ai essayé de créer une formule :
=CONCATENATE(TRANSPOSE(B2:B5&" "))
Après avoir sélectionné : TRANSPOSE(B2:B5&" ") et appuyé sur F9, j’ai :
=CONCATENATE({"19T MAX HAYON- TRANSPAL ","LU-VEN 08H-12H/13H30-16H ","Tel ","MAJ FRHCHFI LE 25.11.15 "})
En retirant les {}, j’ai :
=CONCATENATE("19T MAX HAYON- TRANSPAL ","LU-VEN 08H-12H/13H30-16H ","Tel ","MAJ FRHCHFI LE 25.11.15 ")
Qui donne une cellule unique :
19T MAX HAYON- TRANSPAL LU-VEN 08H-12H/13H30-16H Tel MAJ FRHCHFI LE 25.11.15
Soit le résultat final souhaité
Je voudrais pouvoir appliquer la formule à d’autres sélections de cellule, mais je n’y suis pas arrivé.
Même en résolvant ce problème, je me suis dit que la macro pourrait ne pas marcher, car le nombre de cellule à transposer varie d’un « centre » à l’autre. Pour certains « centres », il n’y a qu’une seule cellule et donc uniquement besoin de la transposer. Mais les autres «centres » contiennent 2 ou plusieurs cellules, et donc implique de transposer et concaténer les informations des cellules.
J’ai essayé d’appliquer les deux actions (concaténer / transposer) séparément et développer des « boutons » reliés à une macro : soit concaténer ; soit transposer.
Car même en n’automatisant pas complètement le processus, cette solution me permettrait de gagner beaucoup de temps, mais je n’y suis pas parvenu non plus.
Auriez-vous une solution à ce problème ?
Même incomplète, comme je l’ai dit : si la solution est découpé en plusieurs étapes/ pas entièrement automatisé, cela m’aiderais déjà beaucoup, à ne pas perdre ma semaine à faire ça ligne par ligne.
Merci d'avance pour votre aide,
Bonsoir,
Si je comprends bien, tu veux concaténer le contenu d'une plage de cellules consécutives dans une même colonne en séparant les valeurs issues de chacune par une espace.
Il est vrai que la fonction CONCATENER d'Excel est d'une inutilité assez flagrante car elle n'apporte rien par rapport à l'usage de l'opérateur &, alors qu'elle aurait pu être conçue pour en faire un peu plus...
Mais tu peux combler ce manque par une fonction personnalisée facile à mettre en oeuvre :
Function CONCAPLAGECOL(pl As Range)
Application.Volatile
CONCAPLAGECOL = Join(Application.Transpose(pl.Value))
End FunctionEn tapant à l'endroit voulu : =CONCAPLAGECOL(B2:B5), tu auras ton résultat.
Cordialement.
Bonjour Fernand,
Je suis stupéfait de la rapidité et de la simplicité avec laquelle vous avez apporté une bonne partie de réponse.
Votre solution marche très bien, et me sauve de précieuses heures/jours de travaille.
Je vous en remercie beaucoup,
Merci,
Et pour ma part, cela m'a permis de mieux comprendre les particularités d'affectation d'une plage à une variable, qui me causaient parfois quelque souci... Echange !
Bonne continuation.
Si cela a pû vous aider, tant mieux !
Petite question supplémentaire:
Est-il possible de créer dans la function, une recherche qui permettrait d'appliquer la formule seulement aux cellules qui possèdent une valeur commune dans une autre colonne.
Je me dit que si la function cherche à concaténer et transposer seulement les cellules qui possède une valeur commune (ici colonne A le "nom" ou "N°" de centre), cela me permettrait détirer la formule sur toute la feuille et ne pas passer des heures à le faire manuellement.
Quelque chose comme un "VLOOKUP" pour associer les bonnes cellules, puis appliquer la function (ci-dessus),
En étirant ma cellule (avec la formule) sur la feuille, excel chercherait quels sont les lignes qui possède une valeur commune puis apppliquerais la function:
J'étire la fonction de la ligne 1 à .... 1000 et il applique la function seulement aux valeurs communes (Centre 1 => B2 à B5; puis Centre 2 =>B6 à B7; Centre 3 => B7 à B23 etc...)
Pensez-vous que cela est faisable ?
Merci pour votre temps en tout cas !
C'est une autre fonction à faire...
Il faudrait un modèle représentatif illustrant ce que tu veux obtenir, et sur lequel on puisse tester.
En effet, il faut peut être découper en plusieurs étapes le résultat que je veux obtenir.
Le fichier que j'ai joint sur mon premier message ne convient pas pour effectuer quelques tests ?
Je m'excuse d'être un tel novice !
Excuses... ! Je ne l'avais pas vu avant de répondre la première fois !
Mais il semble convenir parfaitement pour tester.
Un peu de temps... J'ai d'autres questions au feu, et je vais d'abord penser à me restaurer...
Voilà ! Fonction spécifique à ton cas :
Function CONCACOLCONDINOM(plref As Range, refc As Range)
Dim i%, c$
Application.Volatile
If plref.Cells.Count <> 1 Or refc.Cells.Count <> 1 Then
CONCACOLCONDINOM = CVErr(xlErrValue)
Exit Function
End If
If plref.Value = "" Then
CONCACOLCONDINOM = CVErr(xlErrNA)
Exit Function
End If
If plref.Row > 1 Then
If plref.Offset(-1, 0).Value = plref.Value Then
CONCACOLCONDINOM = ""
Exit Function
End If
End If
Do
c = c & refc.Offset(i, 0).Value & " "
i = i + 1
Loop While plref.Offset(i, 0) = plref.Offset(i - 1, 0)
CONCACOLCONDINOM = Trim(c)
End FunctionLes arguments de la fonction, plref et refc, doivent être la référence d'une cellule, une seule (sinon la fonction retourne l'erreur #VALEUR!) : il s'agit de la référence contenant le nom et de la référence à concaténer correspondante. La fonction regarde les cellules suivantes pour concaténer toutes les valeurs correspondant à un même nom. Si la cellule précédente dans la colonne contient déjà le même nom, elle renvoie "". S'il n'y a pas de nom dans la cellule, elle renvoie #N/A!.
Cordialement.
MONSIEUR MFerrand,
Vous êtes un virtuose du tableur,
Déjà précédemment je trouvais assez déroutant la simplicité avec laquelle vous aviez apporté une solution, mais là ça dépasse l'entendement !!
Je savais que Excel étais un outil puissant entre de bonne mains (pas les miennes apparemment), mais au moins ça à la mérite de me motive à apprendre à me perfectionner !
Merci mille fois pour votre temps, et vos lignes de codes !
Bonne journée à vous