2009-12-01 18 views
12

Estoy usando el programa de hoja de cálculo de Open Office y estoy tratando de concatenar varias celdas de texto junto con delimeters. Por ejemplo, supongamos que tengo las células a continuación:Hoja de cálculo de Open Office (Calc) - Concatenar celdas de texto con delimitadores

+--------+ 
| cell 1 | 
+--------+ 
| cell 2 | 
+--------+ 
| cell 3 | 
+--------+ 
| cell 4 | 
+--------+ 
| cell 5 | 
+--------+ 

me gustaría concatenar con delimitadores de modo que el resultado está en una celda como éste:

+----------------------------------------------+ 
| (cell 1),(cell 2),(cell 3),(cell 4),(cell 5) | 
+----------------------------------------------+ 

Mi primer pensamiento fue para tratar y hacer una macro o algo así, pero no creo que la oficina abierta los apoye. ¿Algunas ideas?

+1

Esto obtendrá una mejor respuesta en Superusuario. No necesita volver a publicar allí ya que la pregunta se moverá automáticamente. – ChrisF

+0

Oh, wow, ni siquiera sabía que existiera el súper usuario. ¡Gracias! –

Respuesta

8

Bueno, después de mucha más búsqueda y experimentación, 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 
29

Muchas gracias a Markus por encontrar una solución a esto.

Aquí hay algunas instrucciones un poco más detalladas para el beneficio de principiantes de OpenOffice Basic como yo. Esto se aplica a la versión 3.1:

Herramientas -> Macros -> Organizar Macros -> OpenOffice.org Basic ...

Ahora seleccione desde el árbol del explorador en la que desea que su función en vivo, por ejemplo, puede estar en su propia macro biblioteca (My Macros/Standard) o almacenada 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á una instrucción REM y algunas definiciones secundarias. 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 de Markus' original:

  • no comienza con un delimitador cuando la primera celda del rango es vacío.

  • Permite la elección opcional del delimitador (por defecto ""), y las cuerdas que van antes y después de cada entrada no esté en blanco en el rango (por defecto a '').

  • Lo renombré STRJOIN ya que "join" es el nombre típico de esta función en varios idiomas populares, como Perl, Python y Ruby.

  • variables en minúsculas

Ahora guarde la macro, vaya a la celda en la que desea que la unen a aparecer, y tipo:

=STRJOIN(C3:C50) 

reemplazando C3: C50 con la gama de cadenas a las que te quieres unir

Para personalizar el delimitador, en lugar usar algo como:

=STRJOIN(C3:C50; "/") 

Si desea unirse a un grupo de direcciones de correo electrónico, puede utilizar:

=STRJOIN(C3:C50; ", "; "<"; ">") 

y el resultado sería algo así como

<[email protected]>, <[email protected]>, <[email protected]>, <[email protected]> 
+2

esto es realmente útil. muchas gracias –

+2

Wow esto es horrible. Debe ser una función de oficina abierta estándar. – surfer190

1

siempre tan a menudo me gusta la facilidad y rapidez de reemplazar & opciones de cálculo, así como, en general, el manejo rápido & Opciones de modificación, cuando una vez más se sienta frente a una lista de archivos vaciados o cualquier otra cosa.

Nunca entendí por qué no incluían una función tan esencial desde el principio, realmente.

Se basa en la secuencia de comandos 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 
Cuestiones relacionadas