2009-12-01 10 views
12

Ich benutze Open-Office-Tabellenkalkulationsprogramm und versuche, mehrere Textzellen zusammen mit Delimetern zu verketten. Angenommen, ich habe die Zellen unter:Open Office Spreadsheet (Calc) - Verketten von Textzellen mit Trennzeichen

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

ich sie mit Trennzeichen verketten möchte, so dass das Ergebnis in einer Zelle wie diese ist ein:

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

Mein erster Gedanke war, zu versuchen und mache ein Makro oder etwas, aber ich glaube nicht, dass Open Office diese unterstützt. Irgendwelche Ideen?

+1

Dies wird eine bessere Antwort auf Super User erhalten. Sie müssen es dort nicht erneut eingeben, da die Frage automatisch verschoben wird. – ChrisF

+0

Oh, wow, ich wusste nicht einmal, dass Super User existiert. Vielen Dank! –

Antwort

8

Nun, nach viel mehr suchen und experimentieren, fand ich Sie können Ihre eigenen Funktionen in calc. Dies ist eine Funktion, die ich gemacht, dass das tut, was ich will:

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

Vielen Dank Markus für eine Lösung dieses Problems zu finden.

Hier sind ein paar etwas detailliertere Anweisungen für OpenOffice Basic Neulinge wie mich. Dies gilt für Version 3.1:

Extras -> Makros -> Makros -> OpenOffice.org Basic ...

Und von dem Explorer-Baum wählen, wo Sie Ihre Funktion leben wollen, z.B. Es kann in Ihrer eigenen Makro-Bibliothek (My Macros/Standard) oder direkt in der aktuellen Tabelle gespeichert werden.

Geben Sie nun einen neuen Makronamen ein und klicken Sie auf Neu, um die OO.org Basic IDE zu öffnen. Sie sehen eine REM -Anweisung und einige Stub-Subdefinitionen. Löschen, dass alle und ersetzen es mit:

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 

Der obige Code hat einige leichte Verbesserungen von Markus' original:

  • nicht mit einem Trennzeichen beginnen, wenn die erste Zelle im Bereich leer.

  • Ermöglicht optional Wahl des Trennzeichens (standardmäßig „“), und die Strings, die gehen vor und nach jedem nicht-leeren Eintrag im Bereich (default auf ‚‘).

  • Ich habe es STRJOIN umbenannt, seit "Join" ist der typische Name dieser Funktion in mehreren gängigen Sprachen, wie Perl, Python und Ruby.

  • Variablen alle Klein

nun das Makro speichern, in die Zelle, wo Sie die, und Typ erscheinen anschließen möchten:

=STRJOIN(C3:C50) 

ersetzt C3: C50 mit dem Bereich von Zeichenfolgen, denen Sie beitreten möchten.

das Trennzeichen anzupassen, anstatt so etwas wie verwenden:

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

und das Ergebnis wäre etwas, wie:

=STRJOIN(C3:C50; "/") 

Wenn Sie eine Reihe von E-Mail-Adressen beitreten wollen, Sie nutzen könnten

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

das ist wirklich nützlich. Vielen Dank –

+2

Wow, das ist schrecklich. Es sollte eine Standard-Open-Office-Funktion sein. – surfer190

1

Schon so oft würde ich die Leichtigkeit und Schnelligkeit vongenießen ersetzenBerechnung Optionen sowie im Allgemeinen die schnelle Handhabung & Modifikation Optionen, wenn noch einmal vor einer Dump-File-Listen oder was auch immer sitzt.

Ich habe nie verstanden, warum sie nicht von Anfang an so eine wesentliche Funktion enthalten haben, wirklich.

Es basiert auf Adams Skript, aber mit der Erweiterung zu CONCAT von horizontal zu vertikal zu tauschen, während immer noch die Trennzeichen in Reihenfolge zu halten.

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