DEJE QUE EXCEL HAGA EL TRABAJO SUCIO

Concatenar celdas en un rango de Excel

La siguiente Función Definida por el Usuario (UDF) permite concatenar un rango de celdas en una fila o una columna en una sola celda con el separador que se le indique.

Este tipo de función resulta útil pues la función Concatenar de Excel no es muy flexible y no es muy práctica para este tipo de trabajo. Si se tienen, por ejemplo, 100 o más celdas en una columna y se quieren concatenar usando el punto y coma, no resultaría nada práctico usar algo como =Concatenar(a1,";",a2,";",a3, ... ";",a100).

Public Function Concat1(ByVal Rango As Excel.Range, ByVal Sep As String) As String
 
    Dim Datos As Variant
   
    Datos = Rango.Value
 
    If UBound(Datos, 1) > 1 Then
        Concat1 = VBA.Join(Application.Transpose(Datos), Sep)
    Else
        Concat1 = VBA.Join(Application.Index(Datos, 1, 0), Sep)
    End If
   
End Function

Para llamar a la UDF siga la sintaxis:

Concatenar(Rango, Sep)

En donde Rango es el rango de celdas y Sep es el separador que desea. Por ejemplo:

=Concatenar(a1:a100,";")

Tenga en cuenta que estoy usando la coma "," como separador de argumentos. Si su separador de argumentos es el punto y coma ";", entonces deberá usar algo como:

=Concatenar(a1:a100;";")

La UDF expuesta anteriormente es sencilla y cumple con su cometido, pero si se desea un poco más de control sobre el rango a concatenar, se podría probar algo así:

Public Function Concat2(ByVal Rango As Excel.Range, _
                        ByVal Sep As String, _
                        Optional ByVal Orden As Integer = 1, _
                        Optional ByVal PrioridadFilas As Boolean = True) As String
 
 
    Dim Datos As Variant
    Dim Fila As Long
    Dim Columna As Long
    Dim InicioFila As Long
    Dim InicioColumna As Long
    Dim FinFila As Long
    Dim FinColumna As Long
    
   
    Datos = Rango.Value
    
    
    If Orden > 0 Then 'Orden ascendente
    
        InicioFila = LBound(Datos, 1)
        InicioColumna = LBound(Datos, 2)
        FinFila = UBound(Datos, 1)
        FinColumna = UBound(Datos, 2)
    
    Else ' Orden descendente
    
        InicioFila = UBound(Datos, 1)
        InicioColumna = UBound(Datos, 2)
        FinFila = LBound(Datos, 1)
        FinColumna = LBound(Datos, 2)
    
    End If
    
     
    If PrioridadFilas Then '  Concatenar por filas
    
        For Fila = InicioFila To FinFila Step Orden
        
            For Columna = InicioColumna To FinColumna Step Orden
                
                Concat2 = Concat2 & Sep & Datos(Fila, Columna)
                    
            Next Columna
        
        Next Fila
    
    Else '  Concatenar por columnas
        
        For Columna = InicioColumna To FinColumna Step Orden
        
            For Fila = InicioFila To FinFila Step Orden
                
                Concat2 = Concat2 & Sep & Datos(Fila, Columna)
                    
            Next Fila
        
        Next Columna
    
    End If
    
    
    Concat2 = VBA.Replace(Concat2, Sep, "", 1, 1)
   
   
End Function

Este UDF tiene la siguiente sintaxis:

Concatenar(Rango, Sep, [Orden], [PrioridadFilas])

Los dos últimos argumentos que incluye de más esta UDF (Orden y PrioridadFilas) son opcionales e indican si se desea concatenar el rango en orden ascendente o descendente y, en caso de rangos de dos dimensiones, si se desea dar prioridad a las filas o a las columnas.

Si se omite el argumento orden, el valor predeterminado es 1 (orden ascendente). Para indicar orden descendente use -1.

Tenga en cuenta que cualquier valor positivo para este argumento indicará orden ascendente mientras que cualquier valor negativo indicará orden descendente. Si se ingresa 2 como valor para el argumento orden, se concatenará cada dos celdas del rango en orden ascendente, es decir, se concatenará el rango dejando una celda de por medio. Si se ingresa 3, se concatenará cada tres celdas del rango en orden ascendente, es decir dejando 2 celdas de por medio, etc. Exactamente lo mismo aplica para el orden descendente con valores negativos.

Finalmente, el argumento opcional PrioridadFilas se usará cuando se pretenda concatenar una matriz de dos dimensiones. Tenga en cuenta que la UDF propuesta inicialmente (Concat1) no acepta rangos de dos dimensiones (es decir, de más de una columna y más de una fila). Con Concat2 podrá pasar como argumento Rango un rango de dos dimensiones (más de una fila y una columna. Por ejemplo: A1:C3, siendo este un rango de 3 fila por 3 columnas). El valor predeterminado es Verdadero, indicando que se concatenará primero por filas y luego por columnas. Si se indica Falso ó 0 para este argumento, se concatenarán primero las columnas y luego las filas.

Si tiene dudas sobre cómo usar una UDF lea la sección "Para usar una Función Definida por el Usuario (FDU o UDF)" en el siguiente vínculo: ¿Qué hago con este código?

4 comentarios:

  1. Magnífico. "Excel"ente aporte.
    Muchas gracias me ha sido muy util

    ResponderSuprimir
  2. Por cierto, hay un error, ya que siempre devuelve el separador "|". Es facil de arreglar posteriormente sustituyendo por lo que uno quiera.

    ResponderSuprimir
  3. Hola Anónimo,

    he corregido el error que mencionas. Gracias por mencionarlo y por visitar el blog.

    ResponderSuprimir
  4. Hola quiero concantenar varias celdas de una
    sola columna en una sola fila,

    Lucy

    ResponderSuprimir