Página 1 de 1
Concatenar rango de celdas
Publicado: Mar Ene 27, 2015 8:55 am
por javierforopen37
Buenos días a tod@s.
Después de haber buscado ayuda en la web, vengo aquí a intentar resolver mi problema. (Openoffice 4.1)
Quiero concatenar 50 celdas continuas (alfanuméricas) que están en una hoja, y obtener el resultado en otra hoja.
La función CONCATENAR se haría interminable: CONCATENAR(hoja1.a1;hoja1.a2;..;hoja1.axx)
¿Existe alguna otra forma para no tener que poner toda la lista de celdas?
He visto que en Excel 2010 se puede crear una función definida por el usuario:
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
pero no sé si es aplicable a Calc,
Gracias a tod@s por vuestra ayuda.
Re: Concatenar rango de celdas
Publicado: Mar Ene 27, 2015 12:03 pm
por xiseme
No, no funcionará tal cual.
Yo tengo la siguiente función que debería servirte. Está sacada de un temna de este foro, pero ahora no lo encuentro (grrr....)
Código: Seleccionar todo
Function CONCATENARANGO(RangoCeldas As Variant, Optional Separador As String, Optional NLin )
' Concatena un rango de celdas con un separador opcional (por defecto se asume "")
' Une de izq. a dcha. y después de arriba hacia abajo:
' empieza desde arriba a la izquierda, a la derecha hasta el final de la línea y luego pasa a la siguiente línea.
' Repite proceso hasta el final del rango de celdas a concatenar.
' Para unir de Arriba hacia abajo y despúes hacia la derecha combinar con la función TRANSPONER:
' CONCATENARANGO( TRANSPONER(RangoCeldas) As Variant, Optional Separador, Optional NLin )
' Creada por FORNELASA en forum.openoffice.org/es. Añadida opción de separador distinto entre líneas.
Dim rowCount As Integer 'Número de Filas que tiene el rango
Dim colCount As Integer 'Número de Columnas que tiene el rango
Dim row As Integer 'Número de Filas que tiene el rango
Dim col As Integer 'Número de Columnas que tiene el rango
On Error GoTo NullErr
' If UCase(RangoCeldas)="AYUDA" OR UCase(RangoCeldas)="HELP" Then 'Muesta un mensaje cuando se pone "AyUdA" o "help" como RangoCeldas
' MsgBox "Uso de función CONCATENARANGO ( Rango, [Separador], [Separador Nueva-Linea]) " & Chr(10) & Chr(10) _
' & "Parámetros: " & Chr(10) _
' & "1.- Rango seleccionado A1:ZZ55" & Chr(10) _
' & "2.- Separador entre los textos de las celdas '¬' '-' ... " & Chr(10) _
' & "3.- Separador entre líneas (por si se desea) ' // ' 'CARACTER(10)'→ las divide ;) " _
' ,64,"Mensaje de ayuda con síntesis de uso"
' Exit Function
' End If
If IsMissing(Separador) Then
Separador = ""
End If
If IsMissing(NLin) Then
NLin = Separador 'Chr(10)
End If
If Not IsArray(RangoCeldas) Then
CONCATENARANGO = RangoCeldas
Exit Function
End If
rowCount = Ubound(RangoCeldas, 1)
colCount = Ubound(RangoCeldas, 2)
Dim texto(1 To colCount) 'Matriz textos concatenados, por linea
Dim total(1 To rowCount) 'Matriz de unión de lineas
For row = 1 To rowCount
For col = 1 To colCount
texto(col) = RangoCeldas(row, col)
Next col
total(row) = Join(texto(), Separador)
Next row
CONCATENARANGO = Join(total(), NLin)
Exit Function
NullErr:
' En caso de error devuelve #VALUE
CONCATENARANGO = Null
End Function
RESUELTO Re: Concatenar rango de celdas
Publicado: Mié Ene 28, 2015 9:36 am
por javierforopen37
Buenos días a tod@s.
Xiseme, gracias por tu ayuda. La función funciona

(valga la redundancia)

.
Una observación, a ver si la podemos mejorar: Todas las celdas que junto, son tipo texto. Al ejecutar la función, las celdas vacías las une poniendo un cero:
A0A00B0A0000000000000000000
¿Se puede evitar esto?
Supongo que en la linea
texto(col) = RangoCeldas(row, col)
habría que poner alguna condición, pero mi conocimiento del basic es bastante escaso.
De todas formas, con el resultado de esta función, puedo trabajar.
De nuevo, gracias por tu ayuda.
Saludos a tod@s.
Re: Concatenar rango de celdas
Publicado: Mié Ene 28, 2015 1:07 pm
por xiseme
Con esta chapucera modificación
Código: Seleccionar todo
Function CONCATENARANGO(RangoCeldas As Variant, Optional SaltaCeros, Optional Separador As String, Optional NLin )
' Concatena un rango de celdas con un separador opcional (por defecto se asume "")
' Une de izq. a dcha. y después de arriba hacia abajo:
' empieza desde arriba a la izquierda, a la derecha hasta el final de la línea y luego pasa a la siguiente línea.
' Repite proceso hasta el final del rango de celdas a concatenar.
' Para unir de Arriba hacia abajo y despúes hacia la derecha combinar con la función TRANSPONER:
' CONCATENARANGO( TRANSPONER(RangoCeldas) As Variant, Optional Separador, Optional NLin )
' Creada por FORNELASA en forum.openoffice.org/es. Añadida opción de separador distinto entre líneas.
Dim rowCount As Integer 'Número de Filas que tiene el rango
Dim colCount As Integer 'Número de Columnas que tiene el rango
Dim row As Integer 'Número de Filas que tiene el rango
Dim col As Integer 'Número de Columnas que tiene el rango
On Error GoTo NullErr
' If UCase(RangoCeldas)="AYUDA" OR UCase(RangoCeldas)="HELP" Then 'Muesta un mensaje cuando se pone "AyUdA" o "help" como RangoCeldas
' MsgBox "Uso de función CONCATENARANGO ( Rango, [Separador], [Separador Nueva-Linea]) " & Chr(10) & Chr(10) _
' & "Parámetros: " & Chr(10) _
' & "1.- Rango seleccionado A1:ZZ55" & Chr(10) _
' & "2.- Que poner si la celda está vacía o es 0: 0=0 resto=nada _
' & "3.- Separador entre los textos de las celdas '¬' '-' ... " & Chr(10) _
' & "4.- Separador entre líneas (por si se desea) ' // ' 'CARACTER(10)'→ las divide ;) " _
' ,64,"Mensaje de ayuda con síntesis de uso"
' Exit Function
' End If
If IsMissing(SaltaCeros) Then
SaltaCeros = 0 'por defecto no pondrá nada cuando sea un cero o esté vacía la celda
End If
If IsMissing(Separador) Then
Separador = ""
End If
If IsMissing(NLin) Then
NLin = Separador 'Chr(10)
End If
If Not IsArray(RangoCeldas) Then
CONCATENARANGO = RangoCeldas
Exit Function
End If
rowCount = Ubound(RangoCeldas, 1)
colCount = Ubound(RangoCeldas, 2)
Dim texto(1 To colCount) 'Matriz textos concatenados, por linea
Dim total(1 To rowCount) 'Matriz de unión de lineas
For row = 1 To rowCount
For col = 1 To colCount
Dim Cont as Variant
Cont = RangoCeldas(row, col)
if SaltaCeros=0 and Cont = 0 then
texto(col) = ""
else
texto(col) = Cont
end if
Next col
total(row) = Join(texto(), Separador)
Next row
CONCATENARANGO = Join(total(), NLin)
Exit Function
NullErr:
' En caso de error devuelve #VALUE
CONCATENARANGO = Null
End Function
CONCATENARANGO(rango) saltará las celdas vacías y -importante- las de valor cero: A B0C10D → ABC10D
CONCATENARANGO(rango,cualquiercosa) pondrá cero cuando la celda esté vacía: A B0C10D → A0B0C10D
Re: Concatenar rango de celdas
Publicado: Sab Ene 31, 2015 3:53 pm
por SLV-es
Hola
Quizás
utilizar & en lugar de CONCATENAR pueda hacerlo más sencillo
Saludos