13

私はOpenOfficeのスプレッドシートプログラムを使用しており、いくつかのテキストセルをデリメータと連結しようとしています。たとえば、次のセルがあるとします。

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

結果が次のような1つのセルになるように、区切り文字でそれらを連結したいと思います。

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

私の最初の考えはマクロか何かを作ろうと思ったのですが、オープンオフィスはそれらをサポートしていないと思います。何か案は?

4

3 に答える 3

30

これに対する解決策を見つけてくれたMarkusに感謝します。

ここでは、私のような OpenOffice Basic の初心者向けに、もう少し詳細な手順を示します。これはバージョン 3.1 に適用されます。

ツール -> マクロ -> マクロの整理 -> OpenOffice.org Basic...

次に、エクスプローラー ツリーから関数をライブにする場所を選択します。たとえば、独自のマクロ ライブラリ (My Macros / Standard) に配置するか、現在のスプレッドシートに直接保存することができます。

ここで新しいマクロ名を入力し、[新規] をクリックして OO.org Basic IDE を開きます。REM ステートメントといくつかのスタブ Sub 定義が表示されます。それをすべて削除して、次のものに置き換えます。

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 のオリジナルから若干改善されています。

  • 範囲内の最初のセルが空の場合、区切り記号で始まりません。

  • 区切り文字 (デフォルトは ",") と、範囲内の空白以外の各エントリの前後にある文字列 (デフォルトは "") をオプションで選択できます。

  • 「結合」は、Perl、Python、Ruby などのいくつかの一般的な言語でこの関数の典型的な名前であるため、名前を STRJOIN に変更しました。

  • 変数はすべて小文字

マクロを保存し、結合を表示するセルに移動して、次のように入力します。

  =STRJOIN(C3:C50)

C3:C50 を、結合する文字列の範囲に置き換えます。

区切り文字をカスタマイズするには、代わりに次のようなものを使用します。

  =STRJOIN(C3:C50; " / ")

多数のメールアドレスに参加したい場合は、次を使用できます。

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

結果は次のようになります

<foo@bar.com>, <baz@qux.org>, <another@email.address>, <and@so.on>
于 2010-03-10T13:18:43.033 に答える
8

さて、さらに多くの検索と実験を行った結果、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
于 2009-12-01T13:44:34.013 に答える
1

ダンプされたファイルリストなどの前に再び座ったときに、置換と計算のオプションの使いやすさと迅速さ、および一般的な迅速な処理と変更のオプションを楽しむことがよくあります。

なぜ最初からそんな重要な機能が搭載されていないのか、本当に理解できませんでした。

これは 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
于 2013-10-03T04:55:49.787 に答える