Hoja de cálculo de Office abierta (Calc): concatene las celdas de texto con delimitadores
-
22-07-2019 - |
Pregunta
Estoy usando el programa de hoja de cálculo de Open Office y estoy tratando de concatenar varias celdas de texto junto con delimitadores. Por ejemplo, supongamos que tengo las siguientes celdas:
+--------+
| cell 1 |
+--------+
| cell 2 |
+--------+
| cell 3 |
+--------+
| cell 4 |
+--------+
| cell 5 |
+--------+
Me gustaría concatenarlos con delimitadores para que el resultado esté en una celda como esta:
+----------------------------------------------+
| (cell 1),(cell 2),(cell 3),(cell 4),(cell 5) |
+----------------------------------------------+
Mi primer pensamiento fue tratar de hacer una macro o algo así, pero no creo que la oficina abierta los admita. ¿Alguna idea?
Solución 2
Bueno, después de muchas más búsquedas y experimentos, descubrí que puedes hacer tus propias funciones en calc. Esta es una función que hice que hace lo que quiero:
Function STRCONCAT(range)
Dim Row, Col As Integer
Dim Result As String
Dim Temp As String
Result = ""
Temp = ""
If NOT IsMissing(range) Then
If NOT IsArray(range) Then
Result = "(" & range & ")"
Else
For Row = LBound(range, 1) To UBound(range, 1)
For Col = LBound(range, 2) To UBound(range, 2)
Temp = range(Row, Col)
Temp = Trim(Temp)
If range(Row, Col) <> 0 AND Len(Temp) <> 0 Then
If(NOT (Row = 1 AND Col = 1)) Then Result = Result & ", "
Result = Result & "(" & range(Row, Col) & ") "
End If
Next
Next
End If
End If
STRCONCAT = Result
End Function
Otros consejos
Muchas gracias Markus por encontrar una solución a esto.
Aquí hay algunas instrucciones un poco más detalladas para el beneficio de los novatos de OpenOffice Basic como yo. Esto se aplica a la versión 3.1:
Herramientas - > Macros - > Organizar macros - > OpenOffice.org Basic ...
Ahora seleccione del árbol del explorador donde desea que funcione su función, p.ej. puede estar en su propia biblioteca de macros (Mis macros / Estándar) o almacenado directamente en la hoja de cálculo actual.
Ahora ingrese un nuevo nombre de Macro y haga clic en Nuevo para abrir el IDE Básico de OO.org. Verás un REM declaración y algunas definiciones de subtítulos. Eliminar todo eso y reemplazar con:
Function STRJOIN(range, Optional delimiter As String, Optional before As String, Optional after As String)
Dim row, col As Integer
Dim result, cell As String
result = ""
If IsMissing(delimiter) Then
delimiter = ","
End If
If IsMissing(before) Then
before = ""
End If
If IsMissing(after) Then
after = ""
End If
If NOT IsMissing(range) Then
If NOT IsArray(range) Then
result = before & range & after
Else
For row = LBound(range, 1) To UBound(range, 1)
For col = LBound(range, 2) To UBound(range, 2)
cell = range(row, col)
If cell <> 0 AND Len(Trim(cell)) <> 0 Then
If result <> "" Then
result = result & delimiter
End If
result = result & before & range(row, col) & after
End If
Next
Next
End If
End If
STRJOIN = result
End Function
El código anterior tiene algunas mejoras leves del original de Markus:
-
No comienza con un delimitador cuando la primera celda del rango está vacía.
-
Permite la elección opcional del delimitador (el valor predeterminado es ", ") y el cadenas que van antes y después de cada entrada no en blanco en el rango (predeterminado en " ").
-
Lo renombré STRJOIN ya que " únete " es el nombre típico de este funcionan en varios lenguajes populares, como Perl, Python y Ruby.
-
Variables en minúsculas
Ahora guarde la macro, vaya a la celda donde desea que aparezca la unión, y escriba:
=STRJOIN(C3:C50)
reemplazando C3: C50 con el rango de cadenas que desea unir.
Para personalizar el delimitador, utilice algo como:
=STRJOIN(C3:C50; " / ")
Si desea unirse a un grupo de direcciones de correo electrónico, puede usar:
=STRJOIN(C3:C50; ", "; "<"; ">")
y el resultado sería algo así como
<foo@bar.com>, <baz@qux.org>, <another@email.address>, <and@so.on>
Muy a menudo disfrutaría de la facilidad y rapidez de reemplazar & amp; Opciones de cálculo, así como en general el manejo rápido & amp; modificando Opciones, cuando una vez más se sienta frente a una lista de archivos volcados o lo que sea.
Nunca entendí por qué no incluían una función tan esencial desde el principio, en realidad.
Está basado en el script de Adam, pero con la extensión para intercambiar CONCAT
de horizontal a vertical, manteniendo los delimitadores en orden.
Function CONCAT2D(Optional range, Optional delx As String, Optional dely As String, _
Optional xcell As String, Optional cellx As String, _
Optional swop As Integer)
Dim xy(1), xyi(1), s(1) As Integer
Dim out, cell, del, dxy(1) As String
'ReDim range(2, 1) 'Gen.RandomMatrix 4 Debugging
'For i = LBound(range, 1) To UBound(range, 1)
' For j = LBound(range, 2) To UBound(range, 2)
' Randomize
' range(i,j) = Int((100 * Rnd) )
' Next
'Next
out = ""
If IsMissing(delx) Then : delx = "," : End If
If IsMissing(dely) Then : dely = delx() : End If
If IsMissing(xcell) Then : xcell = "" : End If
If IsMissing(cellx) Then : cellx = xcell() : End If
If IsMissing(swop) Then : swop = 0 : End If
dxy(0) = delx() : dxy(1) = dely()
xyi(0) = 1 : xyi(1) = 2
If swop = 0 Then : s(0) = 0 : s(1) = 1
Else s(0) = 1 : s(1) = 0 : End If
If NOT IsMissing(range) Then
If NOT IsArray(range) _
Then : out = xcell & range & cellx
Else del = delx
For xy(s(0)) = LBound(range, xyi(s(0))) To UBound(range, xyi(s(0))
For xy(s(1)) = LBound(range, xyi(s(1))) To UBound(range, xyi(s(1))
cell = range(xy(0), xy(1))
If cell <> 0 AND Len(Trim(cell)) <> 0 _
Then : If out <> "" Then : out = out & del : End If
out = out & xcell & cell & cellx
del = dxy(s(0))
End If
Next : del = dxy(s(1))
Next
End If
Else out = "ERR"
End If
CONCAT2D = out
End Function