2009-12-01 17 views
12

Sto utilizzando il foglio di calcolo di Open Office e sto cercando di concatenare più celle di testo insieme a delimitatori. Ad esempio, supponiamo di avere le celle sottostanti:Open Office Spreadsheet (Calc) - Concatena le celle di testo con delimitatori

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

vorrei per concatenare loro con delimitatori in modo che il risultato sia in una cella come questo:

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

Il mio primo pensiero è stato quello di provare e fare una macro o qualcosa del genere, ma non credo che l'ufficio aperto supporti quelli. Qualche idea?

+1

Ciò otterrà una risposta migliore su Super User. Non è necessario ripubblicarlo poiché la domanda verrà spostata automaticamente. – ChrisF

+0

Oh, wow, non sapevo nemmeno che esistesse un superutente. Grazie! –

risposta

8

Bene, dopo molte più ricerche e sperimentazioni, ho scoperto che è possibile eseguire le proprie funzioni in Calc. Questa è una funzione che ho fatto che fa quello che voglio:

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

Grazie mille Markus per aver trovato una soluzione a questo.

Ecco alcune istruzioni leggermente più dettagliate a beneficio dei neofiti di OpenOffice Basic come me. Questo vale per la versione 3.1:

Strumenti -> Macro -> Organizza Macro -> OpenOffice.org Basic ...

ora scegliere tra l'albero esploratore in cui si desidera la funzione dal vivo, per esempio può essere nella tua libreria macro (My Macro/Standard) o memorizzata direttamente nel foglio di calcolo corrente.

Inserire ora un nuovo nome Macro e fare clic su Nuovo per aprire l'IDE di base OO.org. Vedrai una dichiarazione REM e alcune definizioni Sub stub. Eliminare tutto questo e sostituirlo 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 

Il codice di cui sopra ha alcuni lievi miglioramenti da Markus' originale:

  • Non inizia con un delimitatore quando la prima cella nell'intervallo è vuoto.

  • Consente scelta facoltativa del delimitatore (il default è ""), e le stringhe che vanno prima e dopo ogni voce non vuoto nella gamma (default '').

  • L'ho rinominato STRJOIN poiché "join" è il nome tipico di questa funzione in diversi linguaggi popolari, come Perl, Python e Ruby.

  • Variabili tutto minuscolo

Ora salvare la macro, andare alla cella in cui si desidera che il join a comparire, e tipo:

=STRJOIN(C3:C50) 

sostituzione C3: C50 con la gamma di stringhe a cui vuoi unirti.

Per personalizzare il delimitatore, invece usare qualcosa come:

=STRJOIN(C3:C50; "/") 

Se si voleva far parte di un gruppo di indirizzi e-mail, è possibile utilizzare:

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

e il risultato sarebbe qualcosa di simile

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

questo è veramente utile. grazie mille –

+2

Wow, questo è orribile. Dovrebbe essere una funzione standard open office. – surfer190

1

mai così spesso mi sarebbe piaciuto la facilità e la rapidità di sostituzioneOpzioni di calcoloe in generale la gestione rapida & opzioni di modifica, quando ancora una volta seduto di fronte a un dump-file-elenchi o qualunque.

Non ho mai capito perché non hanno incluso una funzione così essenziale sin dall'inizio, davvero.

È basato sullo script di Adam, ma con l'estensione per scambiare CONCAT da orizzontale a verticale, mantenendo comunque i delimitatori in ordine.

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 
Problemi correlati