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 FunctionEste 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?
Magnífico. "Excel"ente aporte.
ResponderSuprimirMuchas gracias me ha sido muy util
Por cierto, hay un error, ya que siempre devuelve el separador "|". Es facil de arreglar posteriormente sustituyendo por lo que uno quiera.
ResponderSuprimirHola Anónimo,
ResponderSuprimirhe corregido el error que mencionas. Gracias por mencionarlo y por visitar el blog.
Hola quiero concantenar varias celdas de una
ResponderSuprimirsola columna en una sola fila,
Lucy