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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top