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 :bravo: (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