Open Office Spreadsheet (Calc) — объединение текстовых ячеек с разделителями

Я использую программу электронных таблиц Open Office и пытаюсь объединить несколько текстовых ячеек вместе с разделителями. Например, предположим, что у меня есть ячейки ниже:

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

Я хотел бы объединить их с разделителями, чтобы результат был в одной ячейке, как эта:

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

Моей первой мыслью было попробовать сделать макрос или что-то в этом роде, но я не думаю, что open office их поддерживает. Любые идеи?


person Markus O'Reilly    schedule 01.12.2009    source источник
comment
Это получит лучший ответ на Super User. Вам не нужно размещать его там, так как вопрос будет перемещен автоматически.   -  person ChrisF    schedule 01.12.2009
comment
О, вау, я даже не знал, что суперпользователь существует. Спасибо!   -  person Markus O'Reilly    schedule 01.12.2009


Ответы (3)


Большое спасибо, Маркус, за то, что нашел решение этой проблемы.

Вот несколько более подробных инструкций для новичков в OpenOffice Basic, таких как я. Это относится к версии 3.1:

Инструменты -> Макросы -> Организовать макросы -> OpenOffice.org Basic...

Теперь выберите из дерева проводника, где вы хотите, чтобы ваша функция работала, например. он может находиться в вашей собственной библиотеке макросов (Мои макросы / Стандартные) или храниться непосредственно в текущей электронной таблице.

Теперь введите новое имя макроса и нажмите «Создать», чтобы открыть OO.org Basic IDE. Вы увидите оператор REM и некоторые подопределения-заглушки. Удалите все это и замените на:

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

Приведенный выше код имеет несколько улучшений по сравнению с оригиналом Маркуса:

  • Не начинается с разделителя, если первая ячейка в диапазоне пуста.

  • Позволяет дополнительно выбрать разделитель (по умолчанию ",") и строки, которые идут до и после каждой непустой записи в диапазоне (по умолчанию "").

  • Я переименовал ее в STRJOIN, поскольку «join» — это типичное название этой функции в нескольких популярных языках, таких как Perl, Python и Ruby.

  • Все переменные в нижнем регистре

Теперь сохраните макрос, перейдите в ячейку, где вы хотите, чтобы объединение появилось, и введите:

  =STRJOIN(C3:C50)

заменив C3:C50 диапазоном строк, которые вы хотите соединить.

Чтобы настроить разделитель, вместо этого используйте что-то вроде:

  =STRJOIN(C3:C50; " / ")

Если вы хотите присоединиться к группе адресов электронной почты, вы можете использовать:

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

и результат будет что-то вроде

<[email protected]>, <[email protected]>, <[email protected]>, <[email protected]>
person Adam Spiers    schedule 10.03.2010
comment
Вау это ужасно. Это должна быть стандартная функция открытого офиса. - person stephen; 03.03.2017

Что ж, после долгих поисков и экспериментов я обнаружил, что вы можете создавать свои собственные функции в calc. Это функция, которую я сделал, которая делает то, что я хочу:

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
person Markus O'Reilly    schedule 01.12.2009

Очень часто я наслаждался простотой и быстротой замены и расчета опций, а также в целом быстрой обработкой и изменением опций, когда снова сидел перед списками выгруженных файлов или чем-то еще.

Я никогда не понимал, почему они не включили такую ​​важную функцию с самого начала.

Он основан на сценарии Адама, но с расширением для замены CONCAT с горизонтального на вертикальное, сохраняя при этом порядок разделителей.

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
person bigg    schedule 03.10.2013