【问题标题】:Open Office Spreadsheet (Calc) - Concatenate text cells with delimitersOpen Office 电子表格 (Calc) - 使用分隔符连接文本单元格
【发布时间】:2010-12-22 00:07:06
【问题描述】:

我正在使用 Open Office 的电子表格程序,并尝试将多个文本单元格与分隔符连接在一起。例如,假设我有以下单元格:

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

我想将它们与分隔符连接起来,以便结果在一个像这样的单元格中:

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

我的第一个想法是尝试制作宏或其他东西,但我认为开放式办公室不支持这些。有什么想法吗?

【问题讨论】:

  • 这将在超级用户上得到更好的响应。您无需在此处重新发布,因为问题会自动移动。
  • 哦,哇,我什至不知道超级用户的存在。谢谢!

标签: openoffice.org spreadsheet concatenation


【解决方案1】:

非常感谢 Markus 找到解决方案。

这里有一些更详细的说明,供像我这样的 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

上述代码与 Markus 的原始代码相比略有改进:

  • 当范围内的第一个单元格为空时,不以分隔符开头。

  • 允许选择分隔符(默认为“,”)和 范围内每个非空白条目之前和之后的字符串 (默认为“”)。

  • 我将它重命名为 STRJOIN,因为“join”是它的典型名称 在 Perl、Python 和 Ruby 等几种流行语言中使用函数。

  • 变量全部小写

现在保存宏,转到要显示连接的单元格, 并输入:

  =STRJOIN(C3:C50)

将 C3:C50 替换为要加入的字符串范围。

要自定义分隔符,请改用以下内容:

  =STRJOIN(C3:C50; " / ")

如果你想加入一堆电子邮件地址,你可以使用:

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

结果会是这样的

<foo@bar.com>, <baz@qux.org>, <another@email.address>, <and@so.on>

【讨论】:

  • 哇,这太可怕了。应该是标准的开放式办公功能。
【解决方案2】:

好吧,经过更多的搜索和试验,我发现您可以在 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

【讨论】:

    【解决方案3】:

    当我再次坐在转储文件列表或其他任何东西前面时,我经常会喜欢替换和计算选项的简便性和快速性,以及通常快速处理和修改选项。

    我真的不明白为什么它们从一开始就没有包含如此重要的功能。

    它基于 Adam 的脚本,但扩展名为将 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
    

    【讨论】:

      最近更新 更多