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) |
+----------------------------------------------+
Моя первая мысль заключалась в том, чтобы попытаться сделать макрос или что-то еще, но я не думаю, что открытый офис поддерживает их. Любые идеи?
Ответы
Ответ 1
Хорошо, после намного большего поиска и экспериментирования, я обнаружил, что вы можете делать свои собственные функции в 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
Ответ 2
Большое спасибо Маркусу за то, что вы нашли решение.
Вот несколько более подробных инструкций в пользу новичков OpenOffice Basic, подобных мне. Это относится к версии 3.1:
Инструменты → Макросы → Организовать макросы → OpenOffice.org Basic...
Теперь выберите из дерева проводника, где вы хотите, чтобы ваша функция живая,
например это может быть в вашей собственной библиотеке макросов (My Macros/Standard) или
хранятся непосредственно в текущей электронной таблице.
Теперь введите новое имя макроса и нажмите "Создать", чтобы открыть базовую IDE OO.org. Вы увидите 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
Приведенный выше код имеет некоторые незначительные улучшения от оригинала Markus:
-
Не начинается с разделителя, когда первая ячейка в диапазоне пуста.
-
Позволяет необязательный выбор разделителя (по умолчанию - "," ) и
строки, которые идут до и после каждой непустой записи в диапазоне
(по умолчанию "").
-
Я переименовал его STRJOIN, так как "join" - это типичное имя этого
функции на нескольких популярных языках, таких как Perl, Python и Ruby.
-
Переменяет все строчные буквы
Теперь сохраните макрос, перейдите в ячейку, где вы хотите, чтобы соединение появилось,
и введите:
=STRJOIN(C3:C50)
заменив C3: C50 на диапазон строк, которые вы хотите присоединиться.
Чтобы настроить разделитель, используйте следующее:
=STRJOIN(C3:C50; " / ")
Если вы хотите присоединиться к группе адресов электронной почты, вы можете использовать:
=STRJOIN(C3:C50; ", "; "<"; ">")
и результат будет похож на
<[email protected]>, <[email protected]>, <[email protected]>, <[email protected]>
Ответ 3
С таким распространением часто бывало легко и быстрота замены и вычисления параметров, а также, в общем, быстрой обработки и модификации параметров, когда снова сидел перед списками сбрасываемых файлов или вообще.
Я никогда не понимал, почему они не включили такую важную функцию с самого начала, действительно.
Это основано на Адаме script, но с расширением для свопинга 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