NIVEL: AVANZADO
Descargar archivo de ejemplo. Para que funcione hay que habilitar las macros.
En este tutorial veremos como programar una función en Excel que permitar concatenar fácilmente varios elementos al ingresar un rango de datos y no las celdas uno a uno como nos pide la función CONCATENAR en Excel.
No serán frecuentes los trucos publicados que involucren programación en Visual Basic (VBA) por dos motivos:
- El objetivo de este blog es aprender explotar las herramientas que ya cuenta el Excel y que en varios casos facilita el no tener que recurrir a programación.
- Fundamentalmente porque NO es mi fuerte la programación. La enorme mayoría de situaciones que he tenido que resolver, he podido solicionarlas sin necesidad de recurrir a macros.
Pero siempre hay excepciones. Y este caso es uno de ellos.
La función CONCATENAR es MUY limitada. Debemos incluir una a una las celdas que se quieren combinar y no permite utilizar rangos.
Supongamos tenemos las siguientes listas:
Y queremos tener en una única celda, todas las ciudades de cada país combinadas.
Ejemplo, que para Brasil nos quede: “San Pablo, Belo Horizonte, Fortaleza, Salvador”.
La función que deberíamos aplicar sería:
- =CONCATENAR(B3;”, “;B4;”, “;B5;”, “;B6;”, “;B7;”.”)
Bastante engorroso especialmente si tuviéramos mucho más que cinco celdas para combinar.
Para complicar más la situación, no todos los países de este ejemplo tienen la misma cantidad de ciudades.
Por ejemplo, para México solo listé tres. Si copiamos la función de arriba en la columna E, el resultado sería: “México, Monterrey, Guadalajara, , .”
No es lo que estamos buscando, pero para que quede mejor, habría que corregir la función a mano y escribir:
- =CONCATENAR(E3;”, “;E4;”, “;E5;”.”)
No es práctico.
En este tutorial veremos cómo solucionar esta situación al crear una función que solo con escribir la siguiente función, nos de la respuesta que queremos:
- =MULTCONCAT(B3:B7)
Antes de proseguir, una aclaración para los más puristas de programación: debe haber formas más correctas de escribir el código. Sin embargo, está escrito de forma que sea fácil entender qué es lo que está haciendo.
El objetivo de la función que vamos a escribir, es que tome todos los datos que se encuentren en el rango dado y los combine uno tras otro, separándolos con “,” menos el último al cual le pondrá un “.”
También necesitamos que considere que no necesariamente la longitud del rango coincide con la cantidad de elementos. Ejemplo, el rango E3:E7 contiene 5 celdas, pero solo 3 de ellas tienen ciudades y las otras dos están vacías.
1. Insertar un nuevo módulo para escribir el código.
En Excel 2007, vamos al menú Programador -> Visual Basic y sobre el nombre del libro de trabajo donde guardaremos la macro, hacemos clic derecho -> Insetar -> Módulo
2. Código de la función MULTCONCAT
MULTCONCAT es un nombre inventado. Puede ser cualquiera (que no sea ya una función de Excel).
Éste es el código de la función y a continuación iremos paso a paso ver en qué consiste:
Function MULTCONCAT(lista As Range)Dim ncell As RangeDim m_concat As Stringm_concat = ""i = 1For Each ncell In listaIf ncell <> "" Then If i = 1 Then m_concat = m_concat & ncell.Value Else m_concat = m_concat & ", " & ncell.Value End If End Ifi = i + 1Next ncellm_concat = m_concat & "."MULTCONCAT = m_concatEnd Function
3. Análisis del código
Fundamentalmente lo que hará la función MULTCONCAT:
- Recorrerá una a una las celdas que componen el rango que se pasa como parámentro (“lista”).
- En la variable m_concat, irá concatenando (a través de “&”) el valor que tenga junto con la nueva celda a leer.
- Adicionalmente, irá agregando una “, ” antes de agregar un nuevo elemento.
3.1 Definición de variables
Function MULTCONCAT(lista As Range)
Dim ncell As Range :
Dim m_concat As String
m_concat = ""
i = 1
Donde:
- En ncell tendremos cada celda que leeremos del rango ingresado como parámetro (en “lista” dentro de la función MULTCONCAT).
- m_concat es una variable de texto (string) donde iremos concatenando una a una las celdas
- i : simplemente un contador para indicarnos si es el primer valor de la lista. Solo lo utilizo para NO poner la “, ” delante.
3.2 LOOP. Armado de la cadena Concatenada
For Each ncell In lista
If ncell <> "" Then
If i = 1 Then
m_concat = m_concat & ncell.Value
Else
m_concat = m_concat & ", " & ncell.Value
End If
End If
i = i + 1
Next ncell
Para cada celda en el rango “lista”, siempre y cuando ésta contenga un valor (<>”") hará:
- Si i=1 (es el primer valor), solamente agrega el valor de esa celda (ncell.Value).
- De lo contrario (es decir, ya tenemos al menos UN elemento), tomará la cadena que ya esté armada, le agregará la “, ” y agregará el valor de una nueva celda.
- Se incrementa el contador (i). Solamente es para romper el indicador de primera posición. Ya no tiene más uso.
La razón por la que agregamos la “, ” en este lugar, es para evitar que la ponga cuando hay celdas vacías o si tenemos rangos que tienen un único valor. También se requiere que sea de esta forma dado que se pondrá un punto “. ” al final, en lugar de una coma.
3.3 Cierre de la función
m_concat = m_concat & "."
MULTCONCAT = m_concat
End Function
Acá solamente se agrega un “. ” para cerrar la cadena y se asigna a la función MULTCONCAT la cadena que se fue armando (m_concat).
La función está lista para utilizar. Ahora, si hacemos MULTCONCAT(B3:B7), nos devolverá “San Pablo, Belo Horizonte, Fortaleza, Salvador, Brasilia.”
La fórmula MULTCONCAT(E3:E7) dará como resultado “México, Monterrey, Guadalajara.”
———————————————————————————————————————————————-
¿Te gustó este truco o tenés alguna recomendación u otra forma de hacerlo? No te olvides de dejar tu comentario y compartir esta nota!
Buscá más trucos en: trucosdeexcel.com
Seguime por Twitter, usuario “trucosdeexcel”.
Mandá tus sugerencias o preguntas a: excelman@trucosdeexcel.com
| México, Monterrey, Guadalajara. |






Muy buena la funcion. Una consulta: quiero hacerle una modificacion, que en lugar de concatenar un rango de celdas, quiero concatenar lo que esta en la misma celda de otras hojas, por ejemplo: en la celda A1 de la 1er hoja quiero concatenar lo que esta en la celda A1 de la hoja2 con lo que esta en la celda A1 de la hoja3 y asi suscesivamente.
¿Cómo recorro las hojas?
Como hago para que la macro creada funcione en cualquier hoja de excel de cualquier archivo, ya que solo me funciona en la hoja donde la creé.
Gracias
Hola Jhon Traina:
Puedes guardar la macro en lista de macros personalizadas cuya ubicacion debe ser C:\Users\localuser\AppData\Roaming\Microsoft\Nombre de la macro.
Luego cada vez que la utilices estara disponible para cualquier libro, otro metodo es: En Excel 2007, Boton de office, Opciones de Excel, Persolanizar, en comandos disponibles eliges la opcion Macros, ahi buscas el nombre de tu macro, la eliges y la pasas a los comandos personalizados y luego aceptas todo y tu macro tendra un acceso directo en la barra de menu.
saludos,
Muchas gracias me ha sido muy útil
holaa… esta mui practica este truco.. yo no se nada de programacion.. y necesito que entre datos exista un enter o un CARACTER(10). las kiero concatenados en forma de listado.. sabes como le pueda hacer o q es y donde le debo agregar esa opccion en lo q tu hiciste???
espero tu respuesta porfiss
ahii ya pudee…asii quedo le modifique tantito al tuyoo
utilice vbCrLf miraa..
Function MULTCONCAT(lista As Range)
Dim ncell As Range
Dim m_concat As String
m_concat = “”
i = 1
For Each ncell In lista
If ncell “” Then
If i = 1 Then
m_concat = m_concat & ncell.Value
Else
m_concat = m_concat & vbCrLf & ncell.Value
End If
End If
i = i + 1
Next ncell
m_concat = m_concat & “”
MULTCONCAT = m_concat
End Function
como podria ahcer para que me concatene solo los valores que no sean repetidos?
Si,yo tambien necesito saber como se podria solo concatenar los valores unicos que nos ean repetidos
Muy útil y sencillo de aplicar son las sugerecias para concatenar, me sirvieron mucho.
Mil Gracias.
Muy bueno, justo lo q necesitaba
Hola quisiera saber si hay alguna forma, apara que el ultimo valor me quede en negrilla
gracias
muchas gracias , solo que queria decirte que no se nada de programacion y que lo que necesitaba era quitarle la coma y el punto al final, por que la captura son textos en excel es decir varia la cantidad de celdas, esto lo hice quitandole a tu macro la coma y el punto (“,” igual ” ” y el punto que se me repetia al final quedo asi “.” igual ” “)espero me explique, otracuestion es que en seguridad de macros tenia “alta” le puse una menos cerrar el archivo y le di al abrir el archivo habilitar macros y funciono bien, ahora solo me falta como guardar el macro y siempre este en el excel 2003 cuando lo necesite.
gracia desde oaxaca, mexico
Hola, muy buena la macro, pero quisiera saber como podría generar un rango automático de acuerdo a un valor repetido en otra columna
Me encanto el truco pero no se como guardar la macro para aplicarlo a cualquier libro de excel que aperture incluso en otras hojas del mismo libro luego de cerrar y guardar. gracias
Concatenar SOLO VALORES ÚNICOS:
Usad este código
Function MULTCONCAT(lista As Range)
Dim ncell As Range
Dim m_concat As String
Dim previous As String
m_concat = “”
i = 1
For Each ncell In lista
If ncell “” Then
If i = 1 Then
previous = ncell.Value
m_concat = m_concat & ncell.Value
Else
If previous ncell.Value Then
m_concat = m_concat & “, ” & ncell.Value
previous = ncell.Value
End If
End If
End If
i = i + 1
Next ncell
m_concat = m_concat & “.”
MULTCONCAT = m_concat
End Function