viernes, agosto 26, 2016

La función UNIRCADENAS en versiones anteriores a Excel 365

Una de las novedades en Excel 365 (2016) es la función UNIRCADENAS(), como ya mencioné en esta nota. Esta función es muy útil cuando queremos unir los valores de distintas celdas en un único valor textual. En las versiones anteriores de Excel podíamos hacerlo usando el operador "&" (que en inglés se llama ampersand y en castellano "et.") o la función CONCATENAR().
En ambos casos, cuando queremos unir valores de varias celdas, se trata de una tarea tediosa, en particular cuando queremos usar un separador entre los textos.
UNIRCADENAS() permite definir el separador e ingresar un rango de celdas lo cual facilita enórmemente la tarea. El problema es que esta función está disponible sólo para los usuarios de Excel 365 (creo que hasta hoy Microsoft no ha actualizado la versión stand-alone de Excel 2016).
La solución para los usuarios de versiones anteriores es programar un función definida por el usuario (UDF) o una macro.
La ventaja de la función UDF es que se actualizará automáticamente con cada cambio en alguna de las celdas del rango; la desventaja es que puede afectar la velocidad de recálculo del cuaderno, en particular si usamos muchas de estas funciones.
La ventaja de la macro es que no afectará la velocidad de recálculo del cuaderno, pero tendremos que activarla cada vez que efectuemos un cambio en los valores del rango.

Publico aquí ambos códigos que sugiero guardar en el cuaderno PERSONAL de manera que puedan ser usados en cualquier cuaderno.

Función UDF Unir_Cadenas

Function Unir_Cadenas(varSep As Variant, rngVals As Range)
    Dim strTemp As String
    Dim rngCell As Range
  
    For Each rngCell In rngVals
        strTemp = strTemp & rngCell & varSep
    Next rngCell
  
    Unir_Cadenas = Mid(strTemp, 1, Len(strTemp) - 1)
  
End Function


Una vez guardado el código usamos el asistente de fórmulas para activar la función


Y definimos el separador y el rango de celdas que contiene los valores a unir


Si queremos un espacio como separador, pondremos " " (espacio encerrado entre dos comillas); si no queremos ningún separador usaremos "" (dos comillas).

Macro concatenatar_rango

Sub concatenatar_rango()
    Dim strTemp As String
    Dim rngVals As Range, rngCell As Range
    Dim varSep As Variant
    Dim rngDest As Range
  
    On Error GoTo errCancel
  
    Set rngVals = Application.InputBox("Seleccione el rango de celdas a unir", "Rango a unir", Type:=8)
    varSep = Application.InputBox("Entre el separador", "Separador", Type:=2)
    Set rngDest = Application.InputBox("Seleccione la celda de destino", "Destino", Type:=8)
  
    For Each rngCell In rngVals
        strTemp = strTemp & rngCell & varSep
    Next rngCell
  
    rngDest = Mid(strTemp, 1, Len(strTemp) - 1)
  
    Exit Sub
  
errCancel:
Exit Sub
  
End Sub


Al activar la macro debemos seleccionar el rango de celdas, el separador y finalmente la celda de destino, como puede verse en este video



6 comentarios:

  1. Hola. Gracias por aportar tu conocimento a otros. La funcion acepta rangos discontinuos (A1+b4=d7,etc)

    ResponderBorrar
  2. ¿Es una pregunta o una afirmación? Además, (A1+B4=D7) no es un rango; es una expresión lógica que puede dar omo ressultado FALSO o VERDADERO.

    ResponderBorrar
  3. Hola Jorge,

    Las nuevas funciones de unir cadenas prometen. Haciendo otra cosa, se me ha ocurrido la siguiente formúla (matricial) para invertir una cadena usando la nueva fórmula CONCAT.

    =CONCAT(EXTRAE(A1;LARGO(A1)+1-FILA(INDIRECTO("1:"&LARGO(A1)));1))

    El texto a invertir en A1.

    Un saludo y, como siempre, enhorabuena por tu Blog.

    ResponderBorrar
  4. La fórmula mostrada arriba fue muy útil para mí. Me gusta este blog junto con los dos blogs son realmente útiles para mí para aprender Excel.

    ResponderBorrar
  5. Esta función modificada de la original hace que no se generen espacios en blanco si hay celdas vacias

    Function Unir_Cadenas(varSep As Variant, rngVals As Range)
    Dim strTemp As String
    Dim nextTemp As String
    Dim rngCell As Range

    For Each rngCell In rngVals
    nextTemp = rngCell & varSep
    If (nextTemp = varSep) Then nextTemp = ""
    strTemp = strTemp & nextTemp
    Next rngCell

    Unir_Cadenas = Mid(strTemp, 1, Len(strTemp) - 1)

    End Function

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.