質問

Open Officeのスプレッドシートプログラムを使用しており、複数のテキストセルを区切り文字と連結しようとしています。たとえば、以下のセルがあるとします:

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

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

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

最初に考えたのはマクロなどを作成しようとすることでしたが、オープンオフィスがそれらをサポートしているとは思いません。アイデアはありますか?

役に立ちましたか?

解決 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

他のヒント

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

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

ツール-&gt;マクロ-&gt;マクロを整理する-&gt; 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のオリジナルから若干の改善があります:

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

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

  • &quot; join&quot;からSTRJOINに名前を変更しました。これの典型的な名前です 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>

これまで頻繁に、交換&amp;の簡単さと迅速さを楽しんでいます。計算オプションと一般的なクイックハンドリング&amp;ダンプファイルリストなどの前にもう一度座ったときに、オプションを変更します。

最初からこのような重要な機能が含まれていなかった理由を理解できませんでした。

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top